“Acuity already reports on bookings.”
On bookings, which it sees. It has no view of what was invoiced afterwards, or of what produced the visit.
For Acuity Scheduling
Export your bookings, match them against closed sales, and find out which appointment types and which channels produced revenue.
No API key Nothing to install in Acuity SchedulingNothing to install No card requiredNo card
Acuity Scheduling sits on the lead side in CloseRev: every booking carries the contact details somebody typed, the appointment type and a timestamp, which is a complete lead file most businesses never think to export. Matched against closed sales from whichever system invoices, it answers which channels produced bookings that became money. Revenue with no traceable booking is reported as Direct / Unknown.
Last checked against Acuity Scheduling's own documentation on September 25, 2026.
The gap
The calendar is full. Nobody can say which of last month's marketing filled it.
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.
As typed at booking. A booking is one of the cleanest contact captures available, because the client wants the confirmation.
Consultation, treatment, discovery call, paid session. These are different leads and must never be pooled.
Both. The gap is how far ahead people book, which differs by channel.
A single “how did you hear about us” question turns every future booking into an attributable lead.
Step by step
Written for somebody with Acuity Scheduling open in the next tab. Report names vary by edition, so each step says what to look for.
One row per booking with a contact detail, the appointment type and the dates.
A free consultation and a paid session are not the same lead, and averaging them is the usual mistake.
It costs a field and makes every future booking attributable without any tracking at all.
Contact detail, amount, date, from whatever invoices.
The join runs on the email and the phone, normalised, with cancellations and no-shows kept visible.
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 Med Spas & Dermatology page — not from a Acuity Scheduling account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Meta Ads | 96 | $78,200 | |
| Google Ads | 61 | $55,200 | |
| Email marketing | 44 | $32,200 | |
| Direct / Unknown | 79 | $64,400 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
Somebody booking an appointment types a real email address because they want the confirmation, and a real phone number because they expect a reminder.
That makes the contact details on a booking unusually accurate — better than a contact form, where a wrong address costs the person nothing.
It also carries a timestamp and an appointment type, which is more structure than most lead files have.
The result is a high match rate against a customer record, which means less revenue disappearing into Direct / Unknown for want of a usable key.
Most businesses running a scheduler already have months of this and have never exported it once.
A booked appointment that nobody attends has consumed a slot somebody else could have had, and for a practitioner that slot is the entire inventory.
Channels differ substantially in how often their bookings are kept: an appointment booked after a long consideration is attended far more reliably than one booked on an impulse from an advert.
Counting only the appointments that happened hides that completely and makes the impulsive channel look efficient.
Keeping cancellations and no-shows in the file gives a real cost per attended appointment per source, which is the number a practitioner's diary actually runs on.
It is also frequently a reminder-settings finding rather than a channel one, which is a cheaper thing to fix.
A scheduler sits at the end of the journey, so the referrer it sees is usually your own website rather than whatever produced the visit.
A single free-text or dropdown question — how did you hear about us — captures what no pixel can: the neighbour, the podcast, the sign, the search somebody made a month ago.
It is self-reported and therefore imperfect: people misremember, and the last thing they saw is not always what decided them.
So the report keeps it as its own labelled source beside any tracked ones rather than merging them, because two imperfect signals reported separately beat one blended figure that looks precise.
For a small service business it is often the only source data that exists, and it is better than nothing by a very wide margin.
A free fifteen-minute consultation and a paid ninety-minute session are different products with different values and different buyers.
A channel producing mostly one will be ranked as though it produced the mix, which is how a good source of paid work gets cut for producing few bookings.
Splitting on appointment type is immediate, requires nothing extra, and usually reveals that one type produces nearly all the revenue.
That changes where the booking links go on the website, which is a cheaper intervention than changing the media plan, and it can be tested within a week rather than a quarter.
Fair questions
On bookings, which it sees. It has no view of what was invoiced afterwards, or of what produced the visit.
You do. Every booking you have taken is stored, timestamped and exportable, with real contact details.
They are imperfect, and they are the only record of the channels no pixel sees. The report keeps them labelled rather than merged.
No. It reads an exported file, so your calendar, clients and forms stay where they are.
The lead side. Closed sales from whatever invoices are the other half.
Bookings with a contact detail, the appointment type and the dates.
No. A free consultation and a paid session are different leads, and averaging them is the usual mistake.
One question on the intake form. It costs a field and makes every future booking attributable with no tracking at all.
Yes. A missed appointment consumed a slot, and channels differ in how often their bookings are kept.
Yes, and that is the main advantage — the first report can cover a year rather than starting today.
The email here, because somebody booking wants the confirmation to arrive.
First and subsequent bookings are reported apart, so the decision stays yours.
Any revenue with no matching booking, usually phone bookings and walk-ins.
A contact detail, an appointment type and a date on one side; a contact detail, an amount and a date on the other. No form answers, no notes, no payment details. Encrypted in transit and at rest and deleted with the import.
Revenue per source and per appointment type, attended and missed shown apart, self-reported sources labelled as such, and everything unmatched kept visible.
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.
Acuity Scheduling 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 Acuity Scheduling, no API key, and no need to have been tracking anything until now. Last year works as well as this month.