The problem
Many clients, several ad platforms each — Google Ads (Search and Performance Max), Google Local Services Ads and Microsoft Ads. Every platform has its own login, its own numbers and its own idea of what counts as a lead.
Daily values alone are noise. What matters is the direction: is a budget going to overshoot this month? Is the cost per lead drifting up for three weeks? Is a credit card about to expire and stop the ads?
What it shows
- Portfolio level: spend this month, blended cost per lead, how many clients are green, yellow or red, real versus junk leads, and how fresh the data is.
- Client level: budget so far versus plan and forecast with a traffic light, cost per lead versus target, leads by source (verified versus platform conversion), call-tracking health (number insertion, callers from outside the service area), landing-page status, and whether conversion tracking is clean.
- Trends, not just today: weekly and monthly lines and bars; Google Ads and Local Services Ads shown separately.
- Alerts: cost per lead too high or suspiciously low, budget pacing, a payment method that needs renewing — among others by e-mail.
| Client | Budget MTD vs. plan | CPL vs. target | Call tracking | Status |
|---|---|---|---|---|
| Acme HVAC | 50 % | $64 / $80 | DNI ✓ | 🟢 |
| Beta Plumbing | 44 % | — (LSA new) | DNI ✓ | 🟢 |
| Gamma Electric | 193 % projected | $142 / $95 | DNI missing | 🔴 |
| Delta Heating | 72 % | $71 / $85 | DNI ✓ | 🟢 |
How it is built
- Collect. A collector on the server reads the platforms once a day — Google Ads, Local Services Ads, Microsoft Ads, GA4 and tracking health.
- Build one file. Everything goes into a single data file. Only aggregates, no personal data.
- Deploy atomically. The file is published to a password-protected static page. Access keys stay on the server; the browser only ever loads the data file.
- Fail safe. If collecting fails, nothing is deployed — the last good version stays live instead of a half-empty dashboard.
A real case: the platform numbers were flattering
In an audit across a portfolio of US home-service clients, a large share of the conversions Google reported turned out to be proxies, duplicates or spam. The real cost per lead was about 60 % higher than the reported one — roughly $270 instead of $170.
That is why the console never shows one lead number. It separates verified leads from platform conversions and flags conversion tracking that counts proxies or junk. A cost per lead you can trust is worth more than a cost per lead that looks good.
Rules it follows
- Read-only on every ad platform. The console can look, never change.
- No personal data. Aggregates only.
- No invented numbers. If a target is missing, it says “no target set” instead of estimating one.
- A failed run does not deploy. Stale but correct beats fresh but wrong.
A dashboard that guesses is worse than no dashboard. Missing data has to look missing.
The agent behind it
Behind the console sits a PPC controller agent. It works across all clients, reads the client register live, triages pacing and anomalies and writes recommendations. An account manager decides and makes the change — the agent itself has no write access.
It is the same pattern as the rest of the fleet: agents see everything they need, propose, and a person acts where a mistake costs money.