Cost Per Booked Patient: Platform ROAS vs Real ROAS
Platform ROAS divides spend by conversions the platform credited to itself. Cost per booked patient divides by real bookings. How to compute it and ask Analyst.
Platform ROAS is the ad platform grading its own homework, and cost per booked patient is the number a practice owner should be asking for instead. Every platform computes its ROAS and cost per conversion from the conversions it credited to itself, inside its own window, with modelled and view-only credit mixed in, so the figure leans in the platform's favor every time. Curve computes the other number: your spend, pulled from the platforms, divided by the booked or attended consults that Curve's attribution engine credits to each platform, campaign, and ad group. Here is why the two diverge, how to compute the honest version, and how to ask Curve Analyst for it.
TL;DR
- Platform ROAS and platform CPA are built from conversions the platform credited to itself, including modelled conversions and credit for impressions nobody clicked, under the platform's own window. The denominator is generous, so the cost looks low.
- Cost per booked patient is spend divided by consults actually booked (or attended) that your own attribution credits to that channel. Same spend, different denominator, different answer.
- A lead, a booked consult, and an attended consult are separate events. A channel that is cheap per lead can be expensive per attended patient, and the platform report stops at the lead.
- No tool can compute cost per booked patient until the booking event flows back into your measurement layer through webhooks from your scheduler or EHR, offline conversion upload, or both.
- Ask the question by platform and by campaign. One blended number hides the campaign that is eating the budget.
- Curve Analyst answers from spend pulled from the platforms and conversions from Curve's attribution, labels which view it is quoting, and says "unknown" when the data is not there instead of printing a zero.
Why does platform ROAS look better than reality?
Because the platform picks the denominator. "Conversion" in a Google Ads or Meta report means whatever that platform decided to credit to itself. Three ingredients pad that count.
Modelled conversions
When the platform cannot observe a conversion directly, because consent was declined or the browser stripped the identifiers it needed, it estimates what it probably would have seen and adds the estimate to the total. Your CPA is being divided by a number that is partly a guess.
View-through credit
Meta in particular will credit a conversion to an ad that someone saw and did not click, provided they converted inside the view window. For a clinic running prospecting campaigns to a broad local audience, that window catches plenty of people who were coming anyway, and the platform counts them.
The platform's own window
Each platform decides how long after a click or a view it will keep claiming conversions. The windows differ between platforms, and neither matches the one your business would pick. Two platforms can both claim the same booked consult, each inside its own window, and adding their ROAS figures together counts one patient twice.
None of this is fraud. The label says "conversions credited by us" and the owner reads it as "patients we got." The gap between those is the reason two platforms will disagree about the same clinic in the same month.
Lead, consult booked, consult attended: which one are you dividing by?
Most healthcare ad accounts optimise toward the first event they can see, a lead. That is the cheapest thing to measure and the least useful thing to know.
Between a lead and revenue sit two more steps:
- Lead. Someone expressed interest by submitting a form or calling the number. Many are unqualified, out of network, or outside your service area.
- Consult booked. A real appointment on a real calendar, confirmed by the front desk or the scheduler. This is the first event that costs the practice something to fulfil.
- Consult attended. The patient showed up, in person or on video. This is the first event that can become revenue, and the one that survives cancellations and no-shows.
Why a cheap lead channel can be an expensive patient channel
Take two campaigns with the same spend. One is a broad interest campaign on Meta that produces a lot of form submits from people who were curious. The other is a search campaign on Google catching people who typed the procedure and your city. The Meta campaign will win on cost per lead. It will often lose badly on cost per attended consult, because a larger share of its leads never book, and a larger share of those who book never show. Allocate budget on cost per lead and you move money toward the campaign that fills your inbox and away from the one that fills your schedule.
It cuts both ways. A search campaign can look expensive per lead because search clicks cost more, then turn out to be the cheapest thing you run per patient. You cannot know until you follow the lead to the calendar, which is the same exercise as diagnosing where a consult funnel leaks step by step.
How do you compute cost per booked patient?
The arithmetic is trivial. The plumbing is not. Cost per booked patient is your spend on a channel, campaign, or ad group in a period, divided by the consults booked in that period that your attribution credits to it. Cost per attended patient is the same formula with attended consults in the denominator. Real ROAS is the revenue from those attended consults divided by the same spend.
Four things have to be true for the result to mean anything.
- Spend comes from the platform, per campaign and ad group, for the exact period.
- The conversion count comes from your own attribution, under one model and one window you chose, applied identically to every platform.
- The event being counted is the downstream one, booked or attended, and not the lead. Otherwise you have cost per lead with a more expensive name.
- Each conversion is credited once across the whole account. If the same booked patient appears under both Google and Meta, your model is wrong.
Why does the booking have to flow back before anyone can compute it?
A pixel on a landing page can see the form submit. It cannot see that the front desk called the lead back and put them on the calendar, and it certainly cannot see that they turned up. Until those events are sent back into the measurement layer and joined to the original click, the denominator is a lead count no matter what the report calls it.
Two routes back
- Webhooks. Your scheduler or practice management system fires an event when an appointment is created, confirmed, or completed. That event is sent server to server into your attribution platform and matched to the visitor who originally clicked. This is the route that gives you cost per booked and cost per attended, by campaign.
- Offline conversion upload. The same events are pushed to Google Ads and Meta as conversions, matched on click identifiers, so the platforms can bid toward bookings instead of leads. This improves targeting but does not repair the platform's ROAS figure, because the platform still applies its own window and credit rules to the uploaded event.
In healthcare the second route carries a constraint the first does not. Anything you send back to an ad platform is a disclosure to that platform, and sending an appointment record with a diagnosis attached to Meta is the pattern the FTC has pursued on unfairness grounds. Curve receives the event server-side on US-hosted infrastructure under a BAA, strips what should not leave, and forwards the conversion signal rather than the appointment record. The platform learns that a click converted, not what the visit was for. Which downstream event to send, and how long a window to attribute it under, is a decision worth making on purpose rather than inheriting from the platform default.
Ask by platform and by campaign, or do not bother asking
A single blended cost per booked patient for the whole account is a vanity metric with better manners. It tells nobody what to do on Monday.
The useful version is a ranked list: every platform, campaign, and ad group, with spend, booked consults credited by your attribution, and cost per booked consult, sorted ascending. The campaign at the bottom, with real spend and few or no consults, is where budget goes to die, and the one at the top is where it should move.
Ask it three ways, in this order.
- By platform, for the period you report on. Is Google or Meta the cheaper source of consults under one attribution model? This is the number the owner wants.
- By campaign inside each platform. The platform average is almost always one good campaign propping up two bad ones, or the reverse.
- Over time, so you know whether the cheap campaign is cheap or caught a seasonal spike.
If your reporting cannot produce all three without someone joining CSVs in a spreadsheet, the practice will keep deciding on cost per lead because that is the number that is easy to get. Ranking channels across platforms under a single model is the same exercise applied to the top of the funnel, and it fails for the same reasons when the platforms are allowed to grade themselves.
The honesty rule: unknown is not zero
The first failure mode is treating a missing number as zero. The booking webhook has not been connected for a new campaign yet, so the report shows zero booked consults. A human reads that as "this campaign books nobody" and pauses it. The truth is "we do not know yet," which is a completely different instruction. A report that cannot distinguish zero from unknown gets campaigns killed for the crime of being new.
The second failure mode is quoting stale or partial data as final. Platforms deliver spend with a lag, and conversions inside an open attribution window are still arriving. If the report shows this month's cost per booked consult without saying the recent days are still filling in, the number looks worse than the eventual truth, and worst for the campaigns you launched most recently.
We built Curve Analyst to refuse both shortcuts. Every figure it quotes comes from a query against your own account. It never estimates. If a metric is empty it says so. If the data is stale, partial, sample, or still syncing, it says so before the number. It treats unknown and zero as different states. And it labels every conversion count as either credited by Curve's attribution or reported by the platform, because the two will never match.
What to ask Curve Analyst
Curve Analyst is an AI chat inside the Curve dashboard. It keeps the date range and filters of the screen you opened it from, queries your own account, and answers with spend from the platforms and conversions from Curve's attribution, by platform, campaign, or ad group, as tables or charts, labelled with which conversion view it is quoting. Start with these three.
- "What is my cost per conversion by platform this month?"
- "Which campaign has the lowest CPA for booked consults?"
- "Is Google or Meta cheaper for consults over the last 30 days?"
The launch post at introducing Curve Analyst covers what it can and cannot answer today, and there is a plain overview at what is Curve AI Analyst.
Frequently asked questions
What is cost per booked patient?
Your ad spend on a channel, campaign, or ad group over a period, divided by the consults booked in that period that your attribution credits to it. Cost per attended patient uses attended consults instead.
Why is my Google Ads ROAS higher than what my attribution shows?
Because Google counts conversions it credited under its own window and model, including modelled conversions you cannot see, and your attribution counts under the model you chose, applied the same way to every platform. Curve's reconciliation view puts what Curve sent to Google next to what Google credited, and the gap is usually the platform's window still being open rather than under-reporting.
Can I calculate cost per consult from Google Ads alone?
Only if booked consults are being uploaded to Google as offline conversions, and even then you are dividing by Google's credited count under Google's window. You cannot compare that against Meta on equal terms, because Meta has its own window and credit rules. A fair comparison needs one attribution layer outside both platforms.
Does Curve Analyst use platform conversions or Curve's conversions?
Both are in the account, and Analyst says which one it is quoting. Spend, clicks, and impressions come from the platforms directly. The conversions in a CPA or ROAS figure are the ones credited by Curve's attribution engine under the model you chose.
What has to be connected before Analyst can answer cost per booked consult?
Ad platform reporting, so spend arrives per campaign and ad group; Curve tracking on your site, so clicks and sessions are attributed; and a webhook or upload from your scheduler or EHR, so booking and attendance events flow back and get matched to those sessions. Without the last one, Analyst tells you the booked consult metric is empty rather than guessing. It is read-only and does not check connector health today, so a missing connection is something you confirm in the dashboard.
If your practice is still comparing platforms on the numbers each platform reports about itself, book a demo and we will show you cost per booked consult by platform and campaign from your own data.
Related articles
Stay Compliant. Scale Confidently.
Join healthcare innovators who trust Curve for HIPAA-compliant ad tracking.Launch in hours, not months. Your growth stack, now HIPAA-safe.
Book a free tracking audit