| Line | Feb | Mar | Apr | May | Jun* | YTD |
|---|---|---|---|---|---|---|
| Sales | R669k | R506k | R950k | R1,106k | R364k | R3,595k |
| Cost of Sales | R171k | R318k | R469k | R956k | R54k | R1,969k |
| Gross Profit | R498k | R188k | R480k | R150k | R310k | R1,627k |
| GP Margin | 74.4% | 37.1% | 50.6% | 13.6% | 85.1%* | 45.3% |
| Salaries & Wages | R196k | R208k | R223k | R216k | R61k | R904k |
| All Other OpEx | R84k | R137k | R100k | R115k | R58k | R494k |
| Net Earnings | +R219k | -R156k | +R158k | -R180k | +R192k | +R233k |
* June is partial (1–23). GP margin artificially high — invoiced but COGS not yet captured. Jan QBO data unavailable (integration started Feb).
COS hit R956k (86.5% of revenue). Large low-margin jobs consumed the entire month. Revenue alone does not equal profit.
Low COS (25.6%) drove 74% gross margins. Higher proportion of smaller, higher-margin jobs. This is the month profile we want to replicate.
This report draws from two systems that measure profitability differently. Neither is wrong — they serve different purposes:
Operations Sheet (Google Sheets) — per-job view. Every completed job has materials, casual labour, rubbish, tools allocated against it. GP margin: 33.4% average. This tells us which jobs and job sizes are most profitable.
QuickBooks (QBO) — monthly cash accounting. Cost of Sales only captures materials/bricks purchased. Casual labour sits in the "Salaries & Wages" expense line alongside permanent staff. GP margin after COS: 45.3%. This tells us monthly cash flow and overall business health.
The 12-point gap (45.3% vs 33.4%) is casual labour — it's a direct job cost on the ops sheet but an operating expense in QBO. Both are correct for their purpose. For break-even calculations, we use QBO margins (since QBO OpEx already includes casual labour). For job-level decisions, we use ops sheet margins.
Revenue Reconciliation — Why the Ops Sheet Shows ~R1M More
The ops sheet INVOICE row shows R4,591k YTD vs QBO Sales of R3,595k. The ~R996k gap is explained by three factors:
Break-even calculations use QBO figures throughout — revenue and expenses on the same VAT-exclusive basis.
* The 40.7% GP margin is the weighted average of the four full QBO months (Feb–May): R1,316,373 GP ÷ R3,230,926 revenue. It excludes partial June where COGS haven't been fully captured. We use this (not the 45.3% YTD) because it's more representative of steady-state operations.
Average monthly revenue (R808k) sits just R22k above break-even (R786k). That's a 2.8% margin of safety. One slow week or one badly-priced job tips the month into a loss. Looking at the multi-year historical averages, only 3 of 12 calendar months (Aug, Sep, Nov) average above R786k.
| QBO Account | Monthly Avg | % of OpEx | Type |
|---|---|---|---|
| Salaries & Wages (permanent + casual) | R210,772 | 65.9% | Semi-var |
| Advertising (Google Ads + media) | R20,167 | 6.3% | Variable |
| Rent / Lease (Sapphire Ocean) | R20,313 | 6.4% | Fixed |
| MVE — Fuel & Oil | R17,374 | 5.4% | Variable |
| Equipment Rental (Talisman etc.) | R14,721 | 4.6% | Variable |
| Insurance | R8,678 | 2.7% | Fixed |
| All Other (bank, accounting, subs, etc.) | R27,727 | 8.7% | Fixed |
| Total Monthly OpEx | R319,752 | 100% |
The ops data tells a clear story: small jobs are dramatically more profitable than large ones. Jobs under R25k carry 44–56% margins vs 28–35% on large jobs. And with the Chryso Colourseal partnership now in place, we can add a high-margin restoration service that requires minimal materials, fewer casuals, and less transport.
| Job Size | Jobs | Avg Margin | Casuals | Daily GP | Verdict |
|---|---|---|---|---|---|
| <R5k (repairs) | 12 (6%) | 55.7% | 1–2 | High | Target more |
| R5k–R10k (repairs) | 20 (10%) | 56.2% | 2–3 | High | Target more |
| R10k–R25k (standard) | 73 (36%) | 43.7% | 3 | R8,567 | Bread & butter |
| R25k–R50k | 49 (24%) | 34.5% | 3–4 | — | Decent |
| R50k–R100k | 33 (16%) | 35.1% | 4–5 | — | Sweet spot (volume) |
| R100k–R250k | 12 (6%) | 35.7% | 5–6 | — | Selective |
| R250k+ | 6 (3%) | 28.4% | 6–9 | — | Margin risk |
Partnership agreed with Chryso / Saint-Gobain (June 2026). Colourseal at R24.30/lit excl VAT. Training in progress. This enables a new "Paving Restoration" service: lift, repair, reinstall, and colour-seal existing paving.
Unit economics of a typical restoration job (100m² driveway):
| Component | Cost | Notes |
|---|---|---|
| Colourseal (14–20 litres) | R340–R486 | 5–7 m²/litre coverage |
| Deco Net / Concrete Stripper (prep) | R150–R300 | Surface cleaning |
| Labour (1 day, 2–3 casuals) | R600–R900 | R200–R300/casual/day |
| Transport (1 vehicle, local) | R200–R400 | Centurion/PTA radius |
| Equipment (pressure washer) | R0–R500 | Owned or hired |
| Total Direct Cost | R1,300–R2,600 | |
| Quote to client | R8,000–R15,000 | Repair + seal |
| Gross Profit per job | R5,400–R12,400 | 68–83% margin |
8 restoration jobs × R10k avg = R80k additional monthly revenue. At ~75% margin that's ~R60k GP. Demand source: dedicated Google Ads campaign targeting "paving repair/restoration Pretoria" + existing CRM re-engagement (765 expired quotes, many suitable for restoration rather than full repave).
No bricks to buy, no rubbish removal, minimal equipment. A single team can do 1–2 restoration jobs per day. Lower labour, lower fuel, lower risk.
| Zone | Radius | Leads | Conversion | Action |
|---|---|---|---|---|
| Centurion Core | 0–10km | 244+ | 6.7–25% | Primary target |
| Pretoria East | 8–18km | 100+ | 6.7–31% | Secondary target |
| Pretoria Wider | 15–30km | 40+ | 10–18% | Selective |
| JHB / East Rand | 40km+ | 350+ | 0% | Exclude from Ads |
Average job is 10km from HQ. If we restrict Ads to Centurion + Pretoria East (0–18km), Rainier's team can do more site visits per day — 4–5 instead of 2–3. More quotes = more conversions at zero additional cost.
Dropping 1 vehicle saves ~R5,543 installment + ~R3,500 fuel. With a tighter service area and more repair/restoration work (smaller crew, less equipment), 4 vehicles may be sufficient.
Kyle resigned — R12,720/month comes off salaries immediately. Combined with a potential move to smaller premises at R12k/month (saving ~R4.3k vs Sapphire Ocean) and dropping one vehicle, total monthly savings reach R28.6k.
| Scenario | Monthly OpEx | GP Margin | Break-Even | Margin of Safety | Key Changes |
|---|---|---|---|---|---|
| A — Current | R320k | 40.7% | R786k | 2.8% | No changes |
| B — Cost Restructure | R291k | 40.7% | R716k | 11.4% | Kyle out, -1 vehicle, cheaper rent, geo |
| C — Full Shift | R291k | 45.0% | R647k | 20.0% | + repair/Chryso mix shift |
| C + Chryso revenue | R291k | 45.0%+ | R647k | ~25% | + R80k/mo restoration jobs |
Moving from Scenario A to Scenario C drops break-even by R139k/mo. Kyle's departure (-R12.7k), dropping one vehicle (-R9k), cheaper premises (-R4.3k), and tighter geo (-R2.6k) save R28.6k in OpEx. Shifting the job mix toward repair/restoration lifts GP from 40.7% to 45%. Combined: break-even falls from R786k to R647k. That transforms a business that loses money 56% of months into one profitable in 10 of 12.
Two months of OpEx cover (R320k × 2) to survive Nov–Jan. Currently at R559k — need another R81k. Bank R50k/month from Jul–Oct peak season.
R559k total assets minus R189k current liabilities (VAT R125k + creditors R64k) = R370k. Under Scenario C (R291k/mo OpEx), that's ~5.5 weeks of runway.
| Campaign | Apr Spend | Jun Spend | Trend | Notes |
|---|---|---|---|---|
| Search (PP Companies & Contractors) | R2,934/wk | R1,968/wk | ↓33% | Fewer clicks but steady conversions |
| Performance Max | R1,151/wk | R1,657/wk | ↑44% | Conversions improving 3→20/wk |
| Leads Display/CIA | R145/wk | R1,024/wk | New | 178 conv/wk — likely inflated* |
| Total | R4,085/wk | R4,649/wk | ↑14% |
* The Leads Display campaign reports 178 conversions/week at R5.75 CPL. Display campaigns typically count view-through and micro-conversions — these are not quote form submissions. Recommend reviewing conversion actions in Google Ads to separate actual quote submissions from view-through signals.
Average cost-per-click dropped from R6.40 to R2.80 since the mid-May changes. More clicks for the same budget — the campaign restructure is working.
With geo-narrowing to Centurion + Pretoria, ad spend becomes more efficient — zero waste on JHB clicks (previously 350+ leads with 0% conversion). Same budget, better leads.
December revenue averages R163k (7-year avg; worst: R53k, best: R373k) while OpEx stays at R320k. Under Scenario C (R291k OpEx), the hole shrinks to ~R130k. Must be funded from peak-month reserves.
At R647k break-even, historical averages show 6 months above break-even (Feb, May, Aug, Sep, Oct, Nov) vs only 3 currently. That doubles the profitable months and cuts the annual deficit in half.
| # | Action | Impact | Owner | Timeline |
|---|---|---|---|---|
| Immediate (This Month) | ||||
| 1 | Geo-exclude JHB/East Rand from all Google Ads campaigns | Eliminate 350+ wasted leads/year | Brink + Mark | This week |
| 2 | Review Display campaign conversion tracking — separate actual form submissions from view-through | Accurate performance data | Brink | This week |
| 3 | Complete Chryso credit application — Karen to submit to Kaylene + Nolan | Unlock COD ordering | Karen | This week |
| 4 | Set minimum 30% GP floor on R250k+ quotes — walk away below that | Prevent R100k+ monthly losses | Jurie + Rainier | Immediate |
| 5 | Kyle departure — do not replace. Absorb capacity into remaining team with tighter service area | -R12.7k/mo permanent saving | Rainier | Effective now |
| Short Term (July–August) | ||||
| 6 | Launch paving restoration service — Chryso Colourseal, Google Ads campaign, website page | R64k GP/month (target 8 jobs) | Brink + Rainier | July |
| 7 | Drop 1 vehicle — Kyle's departure makes 4 vehicles sufficient for tighter radius | -R9k/mo (install + fuel) | Rainier | July |
| 8 | Move to smaller/cheaper premises — target R12k/mo rent vs current ~R16.3k | -R4.3k/mo | Justin | At lease end |
| 9 | Bank R50k/month into FNB Call from Jul–Oct peak season surplus | R640k December buffer | Justin | Jul–Oct |
| 10 | Re-engage 765 expired quotes — WhatsApp/SMS follow-up sequence | Near-zero cost, +R162k rev potential | Tia + automation | July |
| Medium Term (Q3–Q4) | ||||
| 11 | Shift job mix — target 30%+ revenue from <R25k repair/restoration jobs | GP margin 40.7%→45% | Jurie + Brink | Q3 2026 |
| 12 | Scale Google Ads with revenue — cap at 3% of monthly revenue | Responsive spend, no waste | Brink | Ongoing |
| 13 | Monthly QBO reporting — automated P&L pull, track actual vs break-even | Data-driven decisions | Brink | Ongoing |
The business currently runs R22k above break-even — razor thin. With Kyle's departure (-R12.7k), dropping one vehicle (-R9k), cheaper premises (-R4.3k), and tighter geo (-R2.6k fuel), OpEx drops from R320k to R291k. Shift the job mix toward repair/restoration work (Chryso Colourseal at 80%+ margins) and break-even falls from R786k to R647k — a R139k improvement. The margin of safety jumps from 2.8% to 20%, and looking at historical averages, profitable months double from 3 of 12 to 6 of 12.