How do I measure Facebook ads on booked revenue instead of leads?
Persist the Meta lead id and campaign context onto the CRM record at creation, then follow that record through contacted, appointment, sold and invoiced. Report by lead cohort rather than by calendar month, because Meta leads book later than search leads and a month-end cut truncates their revenue. The two numbers worth watching are revenue per lead by campaign and cost per booked job.
The join has to be made at lead creation, not at reporting time
Once a lead becomes a customer record with a phone number and an address, the ad context is gone unless you wrote it down. No later report can recover it reliably. So the first requirement is that the routing layer stamps the platform lead id, campaign, ad set, ad and form onto the record the moment it is created.
Everything downstream is then a straightforward join: leads to jobs, jobs to invoices, invoices back to campaign. That is ordinary work once the identifier exists and impossible once it does not. It is the same pattern used for ServiceTitan integration and for any other system of record.
Cohorts, not calendar months
This is the distinction that changes conclusions most often. A calendar-month report divides revenue recorded in August by spend in August. For a channel where the lag from lead to sold job is measured in weeks, that mixes cohorts and penalizes recent spend.
A cohort report takes all leads created in a given week and follows only those leads. You then read revenue per lead at thirty, sixty and ninety days of cohort age. Compare Meta and Google cohorts at the same age and you get a fair comparison for the first time. It also gives you an early indicator: cohort contact rate and appointment rate are visible within days, long before revenue lands.
The two numbers to put in front of an owner
Keep the report short enough that decisions get made.
- Revenue per lead by campaign. Completed job revenue for a cohort divided by leads in that cohort. It absorbs both lead quality and average ticket, which is why it separates campaigns that cost-per-lead reporting makes look identical.
- Cost per booked job. Spend divided by jobs actually booked from those leads. This is the number that compares honestly against search and against Local Services.
- Booking rate by source, as the diagnostic underneath. When revenue per lead drops, booking rate tells you whether the leads got worse or the tickets got smaller.
Where this reporting stays honest
Some leads never match. People call from numbers you never captured, submit under a spouse's name, or book months later through a different path. A credible report states its match rate and leaves the unmatched portion labeled as unknown rather than assigning it to a channel.
It should also separate revenue attributable to a lead from revenue that merely happened during the period. Owners will conflate the two if the dashboard lets them. Building that discipline into the reporting is most of the work in revenue intelligence, and the daily version of it shows up in intelligence briefs so the trend is visible before the month closes.
Topics: revenue · measurement · cohorts · Meta · CRM
Have a version of this question about your own business?
The useful answer usually depends on which systems you run and how they're connected. That's a conversation, not a blog post.