About a fifth of new clients each month have no Google click on record, yet clearly came through the paid funnel. This is a full teardown of where the tracking loses them, whether Google's own data can plug the gap, and how to monitor it going forward.
In June, 216 people became new clients. Only 170 had a Google ad click recorded. The other 46 look organic — but when you check how they actually arrived, most of them came straight through the paid placement funnel.
Share of each month's new clients who took a LUFT call but had no ad click recorded. The genuine "no click, no call" group sat at 3–7 people every single month — a stable, believable organic floor.
Feb is inflated — click history was still being backfilled that month. The settled rate is 15–20% of new clients mis-filed as non-paid.
The attribution-tracker plugin reads the Google click id server-side, from the URL, on every page load — before any JavaScript, cookie banner or ad blocker can interfere. That part is genuinely well built: a consent pop-up does not block it. The click id is written to a first-party cookie and a server-side session row.
The loss happens later — at the moment a click has to be tied to a person. Three structural weaknesses:
| How a paid client gets lost | Vulnerable? | Impact | Why |
|---|---|---|---|
| Consent banner / ad blocker blocks capture | No | None | click id is read server-side from the URL before any JS runs — the plugin's real strength |
| Cookie only lasts 30 days | Yes | High | Google's own window is 90 days; anyone booking 31–90 days after clicking is already lost. Therapy is a long-consideration purchase. |
| Safari caps the cookie to 7 days | Yes | High | the JS rewrites the cookie on every page, which Safari (ITP) truncates to 7 days — a big share of mobile traffic |
| Clicked on mobile, booked on desktop | Yes | High | attribution is per-browser cookie only; there is no cross-device or logged-in-account stitching |
| Booked under a different email than captured | Partial | Medium | the email fallback needs an exact match to a prior click-carrying record |
| gclid stripped by a redirect before WordPress loads | Partial | Medium | capture only sees the URL on the page WordPress actually boots |
Net: we are not mis-capturing gclids at the door — we're forgetting them before the slow therapy decision completes, and discarding the evidence when we do.
The plugin already pulls Google's own conversion numbers every night via the Google Ads API. Google counts conversions using its own cross-device identity graph (signed-in Google users), which is more complete than our cookie and consent-independent. That makes it valuable in two distinct ways.
Google's reported "Therapist Match Form Completed" conversions vs. what our own tracking captured, by month. Two independent counts in the same ballpark — which is exactly what lets us measure our own miss rate instead of guessing it.
| Month | Google-reported conversions | Our captured Google clicks | Ad spend |
|---|---|---|---|
| Apr 2026 | 837 | 959 | £10,946 |
| May 2026 | 690 | 1,066 | £9,146 |
| Jun 2026 | 1,169 | 1,285 | £10,879 |
| Jul 2026 | 485 | 608 | £4,933 |
Note these count form completions, not purchases — Google can't see who eventually bought unless we tell it. Which is the second use:
This is the real prize. We upload each purchaser's hashed email and phone number back to Google at the point of sale. Google matches that hash to the original ad click on their side — using their identity graph, which still works even when our cookie is long gone. It directly recovers exactly the clients we're currently losing: the cross-device and slow-decision bookers. The export list this needs already exists in the warehouse (ads_offline_conversions); what's missing is the upload being switched on and fed by purchase, not just click.
A new report that takes every new client each month and sorts them into four honest buckets, so the leak is a number we watch — not a surprise we rediscover. Every client falls into exactly one:
| Bucket | Definition | What it means | Jun |
|---|---|---|---|
| Attributed | has a Google click event | confidently paid — working as intended | 170 |
| Probable lost paid | no click, but took a LUFT call | the leak — almost certainly paid, credit missing | 41 |
| Never tracked | no click, no tracker row at all | tracking never fired — a separate coverage gap | (18 of the 41) |
| Genuine unknown | no click, no call, no tracker row | the true organic / direct floor | 5 |
The headline metric is the leak rate — "probable lost paid" as a share of all new clients — trended monthly, with Google's reported-conversion count beside it as the independent cross-check. When the leak rate moves, we'll know immediately, and we'll be able to prove a capture fix worked by watching it fall.
Three quick wins recover a lot of the leak for little effort; two bigger builds close most of the rest and make it permanent.
Record the conversion even when no click id is present, flagged as unattributed. This alone makes the leak measurable instead of invisible — the precondition for everything else.
Match Google's own conversion window, and stop the JavaScript rewriting the cookie on every page (which Safari caps to 7 days). Recovers the slow-decision and mobile bookers directly.
The Data Hub report above — turns this one-off investigation into a number watched every month, and the way we prove any fix worked.
Upload hashed email + phone at purchase so Google re-attributes the clients our cookie lost, using their cross-device graph. The export already exists in the warehouse.
Use the click-time session rows (and logged-in accounts) to reconcile a click captured in one browser with a booking made in another. Closes the cross-device gap at source.