Skip to content

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.

Built for Keap Welcome Home

Spend and return by lead source

saved report · Marketing

Period: Year to date Spend dated on: Invoice date Return dated on: Sale date
Total spend
$116,700
Cost per lead
$92
Return on spend
4.8x

By source

Spend and return by lead source, illustrative figures
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

Sources contacts orders lead_sources governed datasets Data as of today, 00:05 Export · Share

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.

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.