Lead source ROI = (gross margin from installed jobs the source produced − fully loaded cost of the source) ÷ fully loaded cost of the source
That is the whole formula and nobody gets it wrong. What goes wrong is every term in it. The margin is counted at signature instead of install. The cost is the invoice instead of the invoice plus the labour. And “the source produced” is decided months after the fact, by someone who already has an opinion about which source is best.
This page is about those three terms — mostly the last one, because attribution is where the number is actually made. It is the companion to how to price a bought lead, which works forward from margin to what a record can cost; this one works backward from what happened to whether the purchase was worth it.
The ledger
ROI is computed from a table, and if the table does not exist the number is being estimated. One row per source per cohort month, and these columns:
| Column | Where it comes from | The mistake it prevents |
|---|---|---|
| Source and batch tag | Stamped at import, before the record touches a dialer or CRM | Blended files that can never be separated |
| Records received | The count on the delivery, after your dedupe and suppression | Paying for rows you already owned |
| Invoice cost | What the vendor charged, net of credits for dead numbers | Forgetting to claim the credits |
| Labour cost | Setter-hours the cohort consumed × loaded hourly rate | A cheap file that ate the floor |
| Held appointments | From dispositions, per cohort, not per calendar month | Crediting this month’s sits to this month’s file |
| Installed jobs and margin | From the install ledger, joined on the record’s tag | Counting signatures that later cancelled |
| Cohort maturity date | Arrival date plus one full sales cycle | Judging a source before its revenue has arrived |
The first column is the one that matters, because every other column joins on it. A record without a source tag is unattributable forever, and a source that cannot be attributed cannot be fired. Data hygiene for CRM imports covers the staging pass that writes the tag before anything else happens.
Four rules of attribution
- Tag at creation, never at close. The source is whatever file or channel created the record, written the moment the record exists. A job that closes eight months later does not get its source revisited — not because the later story is wrong, but because it was told with the outcome in view. Attribution reconstructed after the fact flatters whichever channel the reconstructor already believes in, every time.
- Cohort by entry. Follow the records that arrived together, all the way through. Dividing this month’s installs by this month’s spend compares two unrelated populations whenever the sales cycle is longer than a month, which in solar it is.
- Never blend. Two vendors loaded into one campaign produce one number that describes neither. Self-generated, purchased shared, purchased exclusive, aged and referral each get their own rows, and a record that arrives from two sources keeps the first one — the second delivery was a duplicate you should not have paid for.
- One owner, not the beneficiary. The person who maintains the ledger is not the person whose purchasing decision or commission it describes.
The first rule is the one that gets argued about, so it is worth being explicit about the hard case. A homeowner in a purchased file is dialled twice with no answer; three weeks later they call in from a yard sign. Which source gets the job? Under this rule, the purchased file — its tag was written first, and the sign gets credit for the assist in a separate column if you track one. The alternative, where the last touch wins, means every source’s ROI depends on what the other sources were doing that month, and the ledger stops meaning anything.
Fully loaded is not the invoice
The cost term has four parts, and most ROI calculations include one of them.
- The invoice, net of any credits for dead or wrong-party numbers you actually claimed.
- Labour. Setter-hours consumed by the cohort. This is where a cheap file loses: a source whose records take three times the dials to reach costs three times the floor, and the invoice does not show it. How many dials per appointment gives you the per-source figure to multiply.
- Drag. Duplicates against records you already owned, suppression hits you paid for before scrubbing, numbers that were disconnected on arrival. Each is a row you were billed for that could never have produced anything — how to audit a lead vendor is the procedure for counting them.
- Opportunity. A source that fills setter hours which could have worked a better file is not free even when it is cheap. Hard to put a number on; worth a line in the notes.
The worked figures below are round numbers chosen to make the arithmetic legible. They are illustrative, not benchmarks, and no source’s actual performance is implied.
Two sources, one cohort month. Source A invoices $2,000 for its file and Source B invoices $6,000. On the invoice, A is a third the price. Add labour: A’s records take 40 setter-hours to work to exhaustion and B’s take 20, at a loaded $30 an hour — $1,200 against $600. Add drag: A arrived with 25% of its rows already in your CRM or dead on arrival, B with 5%. Fully loaded, A cost $3,200 to produce whatever it produced from 75% of its rows; B cost $6,600 from 95% of its rows. Whether A is still the better buy depends entirely on the installs column — which is the point. The invoice cannot tell you, and neither can this paragraph.
How long to wait
A cohort is judged when it matures — arrival date plus one full sales cycle, measured on your own installs rather than assumed. Until then the ROI column is blank, not zero, and the ledger should show it as blank.
Two leading indicators are worth watching before maturity, because they arrive in the first week and predict the rest: right-party rate per connect, which tells you whether the file was matched to the owner, and held rate per set, which tells you whether the households it reached were real prospects. A source that is poor on both in week one will not be rescued by its installs column in month four. A source that is strong on both and weak on installs has a closing problem, which is not the source’s fault.
When to fire a source
The ledger exists to make one decision: reorder or stop. The rule that keeps it honest is written down before the number comes in, not after.
- Two consecutive matured cohorts below the ROI floor you set, at the same fully loaded definition, is a cancellation. Not a negotiation, not a coaching plan, not a “let’s give it one more month.”
- One bad cohort is a question. Check whether the floor changed — caller-ID reputation, a new setter, a shift pattern — before blaming the file, because a source-level number can fall for floor-level reasons.
- A source that clears the floor on ROI but consumes a disproportionate share of setter-hours is a candidate for a smaller order, not a cancellation. Labour is the constraint, and the ledger should say what each source costs in hours as well as dollars.
Recompute monthly, per source, on matured cohorts, and the lead-price ceiling from how to price a bought lead becomes a number you can defend to a vendor with your own history behind it. The equivalent discipline for a field team — where the record is created at a door rather than an import — is in attribution for door-to-door teams, and the floor-wide report this ledger feeds is described in KPI benchmarks for solar call centers.
Disclosure: Scout Data sells homeowner data, which means we are one of the rows on this ledger for some of the floors reading it. We would rather be measured this way than on the invoice. We do not publish ROI figures for floors using our files, because the margin, labour and installs columns are theirs and we cannot see them.
Frequently asked questions
How do you calculate ROI on a lead source?
Gross margin from jobs installed out of a cohort of records from that source, minus everything the source cost fully loaded — invoice, the labour to work it, and the drag of its duplicates and dead numbers — divided by that cost. The arithmetic is trivial. What makes it hard is that every term depends on knowing which source a job came from, and that is decided when the record is created, not when the job closes.
How long before I can judge a lead source?
One full sales cycle after the cohort arrived, at minimum, and for solar that is usually longer than a month. Judging a source on the month it was bought counts its cost and almost none of its revenue. Track leading indicators — right-party rate, held rate — weekly, but make the reorder decision on matured cohorts only.
What is the biggest attribution mistake call centers make?
Tagging the source at close. A record that has been reassigned, redialled from a second file, or touched by a referral gets its source rewritten to whichever channel the person doing the rewriting already believes in. The tag written at import is the only one that was not chosen with the outcome in view.
Should I measure ROI at signature or at install?
At install, net of cancellations, and if you must report earlier, report signatures as a leading indicator with the cancellation rate beside them. A source that signs well and cancels badly is a common pattern, and measuring at signature makes it look like your best channel for the six months it takes to find out.