“Most of our clients come from word of mouth.”
Very likely, and the report will say so rather than hide it. Knowing the true share of Direct / Unknown is what makes the paid channels readable.
For ezyVet
Export invoiced visits from ezyVet, upload the enquiries beside them, and rank marketing on what clients billed rather than on appointments booked.
No API key Nothing to install in ezyVetNothing to install No card requiredNo card
CloseRev reads an ezyVet export of invoiced visits — the client's phone or email, the amount billed and the date — and matches it against the calls and forms that produced the first appointment. A veterinary client is a multi-year relationship rather than a single visit, so a channel's value shows in what a client bills over time and not in what their first consult cost. Visits with no traceable lead are reported as Direct / Unknown.
Last checked against ezyVet's own documentation on September 24, 2026.
The gap
New client numbers go up and nobody can say which marketing did it, or whether the clients it brought are the ones who come back.
What was sold, to whom, and for how much.
The click, the keyword, the call, and what each one cost.
The file
Three things carry the match: who, how much, and when. Anything else is optional and only changes how the report can be sliced.
On the client record rather than the patient. The client is the person who rang and the person who pays; the animal is neither.
What the visit billed, including medication and diet sold at the counter. Consult fee alone understates every channel that brings clients who buy products.
When the visit happened or was billed. They are usually the same day in practice.
Wellness, dental, surgery, emergency. It is the split that shows which channel brings routine care and which brings the high-value work.
Step by step
Written for somebody with ezyVet open in the next tab. Report names vary by edition, so each step says what to look for.
One row per visit with a client contact detail, the amount billed and a date. Look for the invoice or sales export rather than a particular report name.
A household with three animals is one client and one enquiry. Matching per patient will triple-count the relationship and distort every channel unevenly.
Call tracking, the website booking form, local search and any marketplace or directory you pay for. Contact detail plus the source.
The first visit is a small fraction of a client's first year. A short window measures the introductory consult rather than the client the channel produced.
The join is the phone and the email, normalised on both sides, with repeat visits reported separately from the first.
What comes back
Revenue by channel, the count of sales behind each figure, and an honest bucket for the ones nobody could trace. Sample figures, from the worked example on the Veterinary Clinics page — not from a ezyVet account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 148 | $96,600 | |
| Meta Ads | 71 | $34,500 | |
| Email marketing | 39 | $18,400 | |
| Direct / Unknown | 132 | $80,500 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
A puppy or kitten arriving as a new client will generate vaccinations, neutering, annual wellness visits, dental work, medication and eventually senior care — for ten years or more, from one acquisition.
Measured on the first visit, every channel looks roughly the same and all of them look expensive. Measured across a year, they separate sharply, because the propensity to stay with a practice differs by how the client found it.
That is the comparison this produces, and it is not available from any single system: the enquiry is in the ad platform and the ten years of invoices are in ezyVet.
An emergency visit is searched for urgently, converts immediately, bills a great deal and frequently never returns — the client has their own vet elsewhere.
A routine wellness enquiry converts slowly, bills little on the first visit, and may stay for a decade. Both are valuable and they are valuable in opposite shapes.
Ranking channels on a single month's revenue will always favour emergency, because the money lands at once. Splitting by visit type, and reading a long window, is what stops the practice buying only the traffic that never comes back.
Food, preventatives and medication dispensed at the practice are a meaningful share of what a client bills, and they are unevenly distributed — some clients buy everything at the counter, others buy online.
Excluding them measures the consult and misses the client. The channels that bring engaged, compliant clients are exactly the ones this exclusion penalises, which is the opposite of useful.
If the export separates services from products, keep both and let the report show the split. It frequently explains a channel that looked mediocre on service revenue alone.
The commonest data error in this category is treating each patient as a customer. A household with two dogs and a cat is one client record, one phone number and one marketing decision.
Exported per patient, that household appears three times, and channels producing multi-pet households are inflated relative to channels producing single-pet ones — for no reason connected to marketing.
Exporting at the client level fixes it at the source, and it is worth checking before the first upload rather than after the first confusing report.
Fair questions
Very likely, and the report will say so rather than hide it. Knowing the true share of Direct / Unknown is what makes the paid channels readable.
None of which is needed. A contact detail, an amount and a date — no patient record, no clinical history, no prescriptions.
Then the question is whether the little you run pays, which is a smaller question with the same answer shape and the same two files.
No. It reads a file you exported; nothing holds a credential to your practice.
Invoiced visits with a client contact detail, the amount billed and a date.
Client. A household with three animals is one client and one enquiry; exporting per patient triple-counts the relationship.
Yes. Food and medication are a real share of what a client bills, and excluding them penalises the channels bringing the most engaged clients.
Twelve months or more. The first consult is a small fraction of a client's first year.
Yes, where the export carries a visit type — and you should, because they are bought differently and worth differently.
They are reported separately, so you decide whether ten years of visits should credit the advert that produced the first one.
Record them as a source and they rank beside the paid channels, which for a referral hospital is the comparison that matters.
Direct / Unknown, and they stay there rather than being distributed.
Yes, where the export carries the site. A group average usually describes none of its practices.
A contact detail, an amount and a date, plus a visit type if you include one. No patient records, no clinical history, no prescriptions, no images. Encrypted in transit and at rest and deleted with the import.
Revenue by channel from invoiced visits, first visits and repeat visits apart, and everything unmatched reported as unmatched.
By trade
What the report looks like once the export is in, written for each one.
Other systems
Running more than one system, or comparing? The method is the same and the columns are not.
ezyVet and the other product names and logos on this page belong to their owners and are shown to identify the software a file comes from. CloseRev is not affiliated with or endorsed by them, and connects to none of them: it reads a file you export.
Start today
Nothing to install in ezyVet, no API key, and no need to have been tracking anything until now. Last year works as well as this month.