Invoiced value, not calls
Channels rank by what clients actually spent, so higher-value work is visible.
Marketing attribution for Veterinary Clinics
Match invoiced visits to the calls and ads that produced them, and see which channels bring clients rather than inquiries.
$149,500 65% of $230,000 paid
The blind spot
A new-client call and a $3,000 surgery both start the same way. Judging your advertising on call volume means treating a vaccination inquiry and an emergency admission as equivalent.
What you get
Channels rank by what clients actually spent, so higher-value work is visible.
A client acquired in January and their spend across the year both trace to the same ad.
No scripts, no tracking numbers. Two exports from systems you already run.
A worked example
Not impressions, not leads, not cost per click. Closed revenue, by the channel that produced it, for a period you choose — with the portion we could not trace shown rather than quietly shared out across your paid channels.
| Channel | Sales | Revenue | Share | % |
|---|---|---|---|---|
| Google Ads | 148 | $96,600 | 42% | |
| Meta Ads | 71 | $34,500 | 15% | |
| Email marketing | 39 | $18,400 | 8% | |
| Direct / Unknown | 132 | $80,500 | 35% |
The value of a new veterinary client is not the first consultation — it is the vaccinations, the dental, the emergency at some point, and often a second pet. Measuring advertising on the first visit systematically undervalues whichever channel brings clients who stay.
Because matching is on the client's phone number or email, all of their invoiced visits in the period trace back to the ad that produced them. Run the analysis over a year and the ranking usually looks quite different from the monthly view.
Emergency search is immediate, expensive and rarely produces a long-term client. Routine and preventative work converts more slowly and produces the clients who come back for a decade.
Splitting the report by visit type shows which channel is doing which, which is usually the difference between an advertising budget that grows the practice and one that just fills tomorrow.
A client on a monthly wellness plan is a different animal from one who appears only when something has gone wrong. They come in on schedule, their pets get seen before problems become expensive, and the practice can forecast them into next year's staffing. Recruiting them is one of the few marketing outcomes in veterinary medicine that genuinely compounds, and practically no practice knows which of its channels produces one. The enrollment happens at the front desk, weeks after the advert, and nothing joins those two events together.
The reason is arithmetic rather than neglect. A plan enrollment is worth perhaps $45 in the month it starts, against $340 for a single sick visit produced by the same advertising budget on the same day. On any monthly report the sick visit wins comfortably. Across two years of installments, plus the dental work and the diagnostics the plan makes affordable enough to accept, the comparison is not close, and a practice reading monthly reports has usually been funding the wrong side of it for as long as it has been advertising.
Because every installment carries the same client contact details, running the report across a longer range credits all of them to the advert that produced the enrollment. Marking plan rows with a column mapped as Product / service separates recurring revenue from episodic work, which answers the question practices actually care about and rarely ask out loud: is the plan recruiting new clients, or is it a discount being handed to the ones who were already coming in twice a year and paying in full?
Most practices are not short of demand. They are short of veterinarians, the appointment book is full three weeks out, and the phone rings anyway. Under that constraint, spending more on adverts does not add revenue — it adds people who ring, wait, get offered a slot in two weeks, and go to the practice down the road instead. The marketing question changes shape entirely, from how to generate more calls into which of the calls already arriving are worth an appointment that somebody else will otherwise take.
Answering it needs a figure almost nobody has to hand: average client transaction by source, and ideally spend per client across a year by source. A channel bringing a high volume of low-value first visits is actively harmful when capacity is the binding constraint, because each of those visits displaces one that would have been worth more to the practice and no less to the animal. The same channel in a practice with empty chairs would be entirely sensible. Capacity is what flips the sign on it, and capacity is not in any advertising report.
Practices that run this comparison usually end up spending less and earning more, which is an awkward result to take to a corporate group with a growth target attached to its marketing line. It survives the challenge because the unmatched revenue stays in its own bucket rather than being shared out across the channels being cut. Nothing in the report can be accused of having quietly moved money away from the campaign somebody wants to defend, because the report refuses to move money it cannot trace to a person.
Food, the online pharmacy, boarding, grooming and the retail shelf are all real revenue from the same client, and in many practices they sit in systems with no connection to the clinical software. A report built only from the practice-management invoice export therefore undercounts every channel — and undercounts them unevenly, which is the part that matters. The sources bringing long-term clients are exactly the ones whose revenue leaks into those other systems, so the omission penalizes precisely the advertising a practice should be protecting.
There is no integration to build here and no vendor to call. Each of those systems exports rows carrying a client contact detail, an amount and a date, which is the entire requirement. Append them to the sales file, mark them with a revenue-type column mapped as Product / service, and they join to the same client and therefore to the same original inquiry. The online pharmacy is usually worth doing first: it can be the largest single omission, it grows quietly year on year, and it is completely invisible in the invoice report most practices start from.
The one thing to watch is counting the same money twice. Where the practice-management system already posts a retail sale that the shop system also records, pick one source per revenue type and note the decision somewhere a colleague will find it. A first import that double-counts food sales is easy to spot, because the average client transaction comes out implausible, and easy to correct, because an import can be deleted and replaced without disturbing anything else in the workspace.
Why it matters
"We generated 400 leads" invites an argument. "This channel closed $186,400 last quarter, here is the reconciliation" ends one. The teams that can show closed revenue by channel are the teams that get the next increase approved, because they are asking with evidence rather than with conviction.
Killing spend is politically harder than adding it, because someone always owns the channel being cut. A number that reconciles to the sales export takes the argument out of the room — you are not overruling a colleague's judgment, you are reading the same ledger they are.
Platform-reported conversions do not reconcile to revenue, and eventually someone in finance notices. Reporting built from your own closed-sales export starts from the number finance already trusts, which is why it holds up when it is checked.
Because this reconciles exports rather than tracking visitors, it works on months that have already closed. You are not instrumenting now to learn something in ninety days — you can answer for last quarter today, which is usually when the question is being asked.
Honest answers
Any layout works. A client phone or email, an amount and a date is all that is needed — most systems' invoice or revenue report already produces exactly that.
They will show as Direct / Unknown, which is the honest answer and worth knowing the size of. In a practice with a strong local reputation this is often the largest single bucket.
No. Only a contact detail, an amount and a date. Clinical information should not be in the export.
Pricing
The price here is the price on the invoice, plus any sales tax that applies — no per-call, per-minute or per-form fees. Growth usually fits veterinary practices and animal hospitals — thirteen months of history to compare a month to the same month last year, and a PDF you can put in front of whoever holds the budget.
A business scaling ad spend
$49/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Invoiced visits: client phone or email, the amount, and the date.
Run the report over a longer range — a year rather than a month — and every visit from a client traces to the ad that produced them.
Yes, with a visit-type column mapped as Product / service.
Yes, with a location column mapped as Location: one workspace, one report, a per-site breakdown. Fully isolated data per site needs a workspace each, which is the Agency plan, and separate workspaces are not combined into one view.
No. Ad platform lead exports work as the second file.
They match on the client's contact details, so every visit for every pet is credited to the channel that produced the client. Each visit is still its own sale in the report and counts toward the monthly record allowance.
Yes. There was no tag running back then and it makes no difference: the client appears in both files either way.
Invoiced visit rows analyzed in a calendar month. Call and lead rows do not count.
Yes. Export each charge with the client's phone or email and they all credit the channel that produced the enrollment. Map a column marking plan rows as Product / service and the report separates recurring revenue from ordinary visits.
Because at capacity the useful question is which adverts to stop paying for. Ranking sources on average client transaction identifies the ones filling scarce slots with low-value work that a better-matched client would otherwise have taken.
Yes, if that system exports a client contact detail, an amount and a date. Append the rows to the sales file with a revenue-type column mapped as Product / service, and take care not to double-count anything the practice software has already posted.
The report shows revenue and the number of sales for every source, so the average transaction falls straight out of it. For a practice deciding where to cut, it can be the most decisive figure on the page.
They stay in the inquiry file as unmatched leads, cost nothing against your record limit, and count toward the inquiry-to-client rate for that source. That rate varies between channels far more than most practices expect it to.
Keep one workspace with a location column mapped as Location if a single ranking with a per-practice breakdown is what you want. If each practice's data must stay isolated, each needs its own workspace, which is what the Agency plan provides; those workspaces are reported separately and not combined. The choice is really about who should see whose figures.
Nearby
Match your billing export to your call and ad data, and see which channels produced procedures that were paid for rather than inquiries that were not.
See how it worksMatch your practice-management export to your call and ad data, and see which channels produced treatment that was actually paid for.
See how it worksMatch your invoiced jobs to the calls and ads that produced them, and find out which channel is actually paying for the trucks.
See how it worksWhere your sales already are
Export invoiced visits from ezyVet, upload the inquiries beside them, and rank marketing on what clients billed rather than on appointments booked.
What to exportUse the patients Solutionreach messages as one side of the match and collected production as the other.
What to exportExport call records from Weave, match them against collected production, and find out what the phone was actually worth.
What to exportFrom the blog
Multi-site healthcare groups usually conclude that attribution is off limits because the data is clinical. It is not, because attribution does not need clinical data. What it needs is a phone number, an amount and a date, and there is a way to handle even those properly.
Read the articleCall tracking answers one question well: which campaign produced the ring. It has no view of what happened after the call ended, which is where the money is decided. This is what the gap costs, and how to close it without replacing the call tracker you already have.
Read the articlePixels were built for sales that finish in a browser. Most sales don't. Here's the method that works on exports you already have — and why the tools you're paying for structurally cannot do it.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.