Twice a day, someone decides how hard to run the Google Ads. This report makes that call from live data — and shows its working. Scan this page once and the report should never need explaining again.
Every weekday has 15–40 sales-call slots; a slot unsold by day's end is revenue gone forever. Ads buy the demand that fills them — but money spent today mostly books tomorrow, and bookings made far in advance mostly die. So the whole game is short-range: keep enough fresh demand flowing to fill today and the next working day, including the slots that cancellations keep reopening.
Clicks arrive, nothing near-term to book, people book far out — and calls booked 4+ days ahead complete at just 39% vs 52% for next-day. Money wasted.
Slots reopen from cancellations, no demand arrives to re-sell them, and the team sits with an empty diary. The day's revenue never comes back.
75% of slots still sold at each day's end. The business has averaged ~58% over 90 days — only 1 day in 5 has ever reached 75%. It's a stretch target, deliberately.
Cancellations are the main loss: days often fill past 100% of capacity while utilization ends at 55–65%. The report aims fill near 100% and lets churn erode it to the target.
At every check the system computes the ask — bookings the ads must sell across the days they can still influence — and maps it to a spend level. Then it compares that advice with where the dial actually sits (the enabled campaigns' set daily budgets) and speaks relatively: stay, step up, ease back, turn on, or leave off.
| Ask (bookings to sell) | Advice | Spend band |
|---|---|---|
| 0 – 2 | quiet | under £150/day |
| 3 – 9 | normal | £150 – 450/day |
| 10 + | push | £450+/day |
Weekend-aware: on a Friday the two days are Monday and Tuesday. Far-out days are out of scope because far-out bookings die.
Morning-only days stop selling at 12:00 (no morning-shift call has ever been booked after 11:00); days with an evening shift stay sellable until 17:00. From the Team Blocks rota, per day.
The morning call at ~9:00 sets the level; the ~13:00 cancellation adjustment reacts to the churn the morning revealed. Both land in the decision log (and Slack, once connected).
Utilization this week vs the 75% tick (with month and 90-day context), plus cost per booking and cost per form — the "not at any price" guardrail.
The light: ads ON or OFF, which campaigns, budget set, spent so far today, and the level the dial is running at.
The recommendation in one line, tagged "no change" or "action needed".
A card per day: booked/slots, the bar with aim marker and 75% tick, to-target, cancels expected, and what the ads must sell.
The decision log — each daily call, the ask, where the dial was, and how the day actually ended vs 75%.
The trace: the exact steps the rule walked, top to bottom, with today's numbers. It can never disagree with the banner — same maths underneath.
The measured facts the system is built on, each dated. A row gets added every time we learn one.
| Signal | Source | Freshness |
|---|---|---|
| Calendar — slots, booked, bookable now, cancellations | Slot tracker snapshots of the booking calendar | hourly |
| Ads on/off, set budgets, spend so far today | Attribution tracker, live from the Google Ads API | hourly (intraday spend ~3h behind) |
| Reported daily spend (and cost per booking / form) | Google Ads daily report via the attribution tracker | 2 days behind — trailing guardrail, never gates the verdict |
| Shifts — morning / afternoon per day | Team Blocks rota | as scheduled |
| Expected cancellations | Trailing 8-week per-weekday averages | recomputed continuously |
Nothing here can start, stop, or re-budget a campaign. Every change to Google Ads is made manually by the team.
"~8 will cancel" is the weekday's 8-week norm. Real days differ — which is exactly why the check re-runs hourly and adjusts.
The ask assumes freshly-sold bookings stick. Some won't; the hourly re-check absorbs it, and tuning will price it in properly.
Cost per booking and per form are trailing guardrails. They shape the level over weeks — they can't react to this morning.