Offline conversion tracking for clinics and dentists: booked, showed or paid?
Short answer
Showed is the sweet spot: a real prospect, enough volume, and available sooner than payment. On Google Ads, map booked and showed to their own conversion action so a booking is never counted as a sale.
Picture this. It's an example, not a real client. A dental clinic runs Meta ads for implant consultations. The funnel looks like this: form, booked, showed up, treatment paid.
The ads only see the form. So they find people who fill in forms. And a fair number of those never pick up the phone.
Now, what do you send back? Let me walk each stage the way a clinic owner would want it explained.
Booked. Quick, fairly high volume, and it filters out most fakes, because bots rarely book. But a booking is not a patient. Some cancel. Some don't turn up. If you optimise on it, the ads learn to find people who book, which isn't quite the same as people who come.
Showed. This is the sweet spot for most clinics. A person who walks through the door is a real prospect. The signal is much better than "booked", and there's still enough volume for bidding to learn from. It's also available sooner than payment, which matters for Meta's 7-day window.
Paid. The truest signal, and the slowest and rarest. Treatment plans can take a while to convert, so this one often arrives late, or too thin to optimise on. But it carries the value, which is what lets you find out what a patient is actually worth.
A sensible pattern is to send all three as separate events, optimise on "showed", and keep "booked" as a volume backstop and "paid" as the profit check. On Google Ads, booked and showed should go to their own conversion action, so a booking is never counted as a sale.
There's one more layer, and it matters for clinics more than most businesses. Meta can restrict accounts when the page link or an event name reveals a treatment or condition. So the same events you send for optimisation need neutral names and clean links. It's a separate topic, but it's why "just send everything" isn't good advice for a clinic.
Here's a made-up example of how the numbers might read after doing this properly. 200 form fills. 80 booked. 55 showed. 30 paid. Cost per form fill looks great. Cost per booked call is higher. Cost per patient who showed up is higher again, and it's the one that actually explains your margin. Clinics that only watch the first number are optimising the wrong end of the funnel.
If your booking system already tracks who showed up, you have the data. The problem is that many clinics never move it out of the practice system, so the ad platform never hears. The job is a status update: when the receptionist marks the appointment as attended, that change is the trigger. It's a five-second action for staff, and it's worth more to your ads than any creative test.
One rule to agree with the team: mark it the same day. A stage that updates a week later arrives too late for Meta's 7-day window. And remember the flip side. Cancelled and no-show are outcomes too, but they aren't ones you want the campaign to chase, so leave them out of what you send.
What would you optimise on, and why?
For reference, this is the case DataCops health mode was built for: a neutral L_1 for a lead and S_1 for a booking, with hashed email and phone and the ad click, and a log of each event.
DataCops in short
For this question: DataCops sends booked, showed and paid as separate events to the platform that brought the click, so the ads learn from patients who attended.
DataCops is a tool that makes the ads learn from real sales: it sends booked, showed, won and paid stages from your CRM back to your ad platforms, gives every visit a bot verdict with a Real people only switch per platform, warms up new campaigns with your existing customers, and logs every send. It is not an attribution report.
How DataCops does it
- The sale after the form. HighLevel natively (lead, booked, showed, won with value, paid; cancelled, no-show and lost are never sent), any other CRM through a private webhook, matched to the click by click ID or hashed email and phone.
- The click is kept on the server. Click IDs are stored for up to 90 days, so a deal that closes weeks later still finds its click.
- Real people only. Every visit gets a bot verdict against 360+ billion IPs and 350+ monitoring points, with a Real people only switch per ad platform, off by default. CRM events carry no bot flag.
- Counted once, logged every time. Pixel and server events share an event ID, and a delivery log shows each send as sent, held, skipped or failed, with the reason.
- One script, one DNS record. Collection runs on your own domain; with DNS on Cloudflare, the free Worker reads the click at the edge before the page loads.
Best for: ad-funded businesses whose sales close in a CRM or on a call: clinics, home services, agencies, B2B and lead gen.
Ads Warmup: tell the ads who pays
Ads Warmup, DataCops' flagship feature, sends customers you already have to Meta, Google Ads and TikTok before a new campaign spends: upload a CSV (only email is required, up to 20,000 rows), see a 0 to 10 match score per person, pick the event, and send. Rows are dated when you send, and Google Ads credits only people who clicked a Google ad. Preview is free; sending needs a paid plan. Check your own consent basis for the list first. See Ads Warmup.
Ways to do this job
| Option | Best for |
|---|---|
| DataCops | CRM stages to Meta and Google Ads, with a bot verdict and a delivery log |
| Zapier or Make | One simple CRM-to-ad flow you build and maintain |
| Direct API upload | Teams with an engineer |
| Manual CSV upload | Occasional batches |
When not to use DataCops
- You want a reporting dashboard. DataCops cleans and sends what goes into your ads. It is not a multi-touch reporting layer.
- Your sales never leave one store checkout. If everything happens in one checkout, the platform's own pixel plus server events may be enough.
Sources and further reading
More on this: The complete guide to offline conversions, and the complete guide to offline conversion tracking.
If two stages in your funnel mean the same thing, send one. The goal isn't more events. It's the events that separate real patients from form fillers.