Disclosure: Some links on this site are affiliate links. If you buy through them, I may earn a commission at no extra cost to you. I only write about tools and platforms I actually use, and every number in this article comes from my own accounts and my own ad spend — no income screenshots, no promises.
This is the article I wish someone had written before I trusted a dashboard.
In the autumn of 2026 I was running a lead-generation campaign on Meta for one of my products — a free bundle offer, driving people to a landing page with an email signup. The Meta dashboard looked healthy. Over the campaign period it reported 631 leads, at a cost per lead of about CA$1.19. Cheap leads, scaling nicely. If I’d managed that campaign the way most people do — by watching the platform’s numbers — I’d have raised the budget and congratulated myself.
There was one problem. The leads weren’t real.
The number that didn’t match
My email list lives in Brevo, and every genuine signup lands there. When I reconciled the two systems — Meta’s count against the actual contacts created in my list — the real number was 120.
Not 631. One hundred and twenty.
Do the cost math both ways. Meta’s version: about CA$1.19 per lead. Reality: roughly CA$3.5 per real contact. The platform had overstated my results by more than five times, and — this is the part that should worry you — the campaign had been optimising itself against those phantom numbers. The algorithm was steering my budget toward whatever produced fake-counted “leads,” which is not the same thing as people.
Root cause #1: a connection I never made
I dug into the pixel setup expecting to find my own mistake. What I found was stranger. A server-side Conversions API connection was sending events alongside the browser pixel — and it had been switched on from within Ads Manager itself, under a business setting that auto-connects datasets. I never deliberately set up a Conversions API. It arrived on its own, on October 18, and from then on, events were double-reported and inflated with no deduplication I could rely on.
Lesson one, and it’s the one I’d tattoo on every media buyer’s monitor: a platform’s count is a claim, not a fact. The fact lives in your backend — your email list, your CRM, your orders. Reconcile the two, regularly, and believe the backend when they disagree. The platform is grading its own homework.
Root cause #2: the script that never ran
Fixing the counting also meant fixing my landing page’s event script — and that’s where the second, dumber bug was waiting.
I had added a small script to fire the Lead event on the thank-you page. The page’s editor saved it — and corrupted it in the process. When I finally inspected the live file byte by byte, the saved code contained ten literal “$0” tokens and a dropped letter. The script could never have run. Worse, the junk was visible at the top-left of the live page for anyone to see.
How did it survive my checking? Because my “verification” only confirmed the code was present on the page. Present, yes. Intact, no. A grep is not a test.
Lesson two: after any in-browser code edit, verify the live bytes for integrity — check that key lines survived exactly, that no garbage tokens appeared — and then run a real behavioural test: one genuine submission, watched end to end, producing exactly the events it should. Presence is not proof. Behaviour is proof.
What I changed
Three standing rules came out of this, and they now govern every campaign and funnel I run:
- Dual reporting, always. Every report shows the platform number and the backend number side by side. Decisions — budgets, pauses, scaling — are made on the backend number only.
- Stop rules keyed to reality. My pause triggers count verified signups, not platform leads. A bad day by the real numbers stops the campaign; a bad day by the dashboard’s numbers gets investigated, not obeyed.
- No silent connections. I audit what’s connected to my ad accounts — pixels, APIs, auto-connect settings — because a connection I didn’t make can still spend my money and corrupt my data.
Audit your own setup today
If you’re running any paid traffic right now, this audit takes twenty minutes:
- Open your ad account’s pixel and event settings and list every active connection — browser pixel, server events, anything the platform offers under “automatic” or “business connected.” If you can’t explain what each one does, investigate it before your next spend.
- Pull your platform’s reported conversions and your backend’s real numbers for the same period. If they disagree by more than a few percent, stop trusting the bigger number until you know why.
- Inspect your key landing pages’ live code, not the editor’s preview. Check that tracking scripts survived saving exactly as written — no junk, no truncation — and fire a real test conversion, end to end, watching what actually arrives.
Most people will find at least one surprise. I found two, and I’d been doing this for years.
The checklist I now run before spending a dollar
Every mistake in this post-mortem came from building first and checking demand later. I turned the fix into a one-page Demand-First Checklist. It is free, and it is the exact sequence I run before I build or spend anything.
Get the free Demand-First Checklist
The uncomfortable takeaway
Nothing in this story required fraud or malice. A default setting here, a corrupted save there, and a dashboard that rounds in its own favour — that’s all it took to inflate my results fivefold while I paid real money against them. The platforms aren’t lying exactly. They’re just not on your side of the table.
Your backend is. Count there.