Use case
What does a lead actually cost, and which spend is paying for itself?
Cost per acquisition needs two things the CRM rarely holds together: what you spent, and what it produced. The spend usually lives in a spreadsheet, the revenue arrives months later, and the two sides name the same campaign differently.
Spend and return by lead source
saved report · Marketing
By source
| Lead source | Spend | Leads | Cost per lead | Won | Cost per won | Return |
|---|---|---|---|---|---|---|
| Referral | $4,200 | 231 | $18 | 96 | $44 | 47.2x |
| Webinar | $31,600 | 344 | $92 | 61 | $518 | 3.0x |
| Paid search | $68,400 | 486 | $141 | 84 | $814 | 2.1x |
| Organic | $0 | 152 | — | 47 | — | — |
| Trade show | $12,500 | 0 | — | 0 | — | 0.0x |
| Unknown | $0 | 56 | — | 8 | — | — |
| All sources | $116,700 | 1,269 | $92 | 296 | $394 | 4.8x |
applied — a source that cost money and produced no leads keeps its row — that row is the reason this report exists, and a join that drops it hides the worst spend in the account
Every figure above is invented. We build these reports for real businesses and do not put their numbers, or their names, on a public page.
Why it is not one query
The rules that decide the number.
The spend is in a spreadsheet
Budgets are maintained by hand, in a sheet, by the person who owns them — and that is fine. We import the sheet on the same schedule as the CRM, type its columns, and join it to the source it paid for, so the grid stays where its owner wants it.
The names do not match
The spend row says one thing and the CRM source says another, and neither side is going to change. A mapping is agreed once and applied everywhere, and the unmatched rows get their own section so the gap is visible instead of quietly dropped.
Zero-lead campaigns must survive
A campaign that cost money and produced no leads is exactly what this report is for, and it is the row an inner join deletes. Spend is kept whether or not anything came back, which is why a dash appears rather than a row vanishing.
Revenue arrives late
Spend lands in one month and the sale it produced lands three later. Rating both in the same window makes recent spend look worthless. Cost and return can be cut on their own dates, and the report says which it is using.
A cancellation is not a deletion
In Keap a cancellation is a separate negative row, not a flag on the original. Miss that and refunded revenue still counts toward the return on the spend that produced it.
Cost per what?
Cost per inquiry, per tour and per move-in are three different numbers and marketing usually wants all of them. Each step of the funnel gets its own cost column so the drop-off is priced, not just counted.
Related questions
Connect your AI agent today.
Connect your CRM and let the first import run. Then add ReportMojo to Claude Desktop, ask it about your business, and have it build the reports you need.