Revenue, not calls
The ranking is on invoiced revenue actually earned, not on jobs counted, so a channel that brings fewer and larger ones rises.
Marketing attribution for foundation repair companies
Match signed contracts and their value to the calls and campaigns that produced them, months after the first inspection.
$413,000 59% of $700,000 paid
The blind spot
An inspection is free and a repair is $12,000. Cost-per-inspection tells you nothing about which channel produces the homeowners who actually proceed.
What you get
The ranking is on invoiced revenue actually earned, not on jobs counted, so a channel that brings fewer and larger ones rises.
An inquiry in one quarter and a job in the next are one match, and the earlier campaign is credited with the later invoiced revenue.
Only exact matches count toward invoiced revenue. Anything weaker is flagged for somebody to confirm, and anything unmatched stays unmatched.
A worked example
Not impressions, not leads, not cost per click. Closed revenue, by the channel that produced it, for a period you choose — with the portion we could not trace shown rather than quietly shared out across your paid channels.
| Channel | Sales | Revenue | Share | % |
|---|---|---|---|---|
| Google Ads | 22 | $252,000 | 36% | |
| Local service ads | 10 | $112,000 | 16% | |
| Meta Ads | 4 | $49,000 | 7% | |
| Direct / Unknown | 25 | $287,000 | 41% |
Every channel produces inspections. Only some produce homeowners who sign, and the proceed rate can differ threefold between two channels with identical costs per inspection.
Ranking on signed contract value rather than inspections booked is what makes that visible, and it is normally the difference between a channel worth doubling and one worth stopping.
Structural repair is expensive and rarely urgent enough to force an immediate decision. Many homeowners get an inspection, sit on it, and sign the following season.
There is no attribution window, so a contract signed a year after the inspection still credits the campaign that produced it — which is precisely the revenue currently sitting in Direct / Unknown.
Foundation work is almost never bought on the day it is first investigated. A homeowner notices a crack, books a free inspection, receives a quote that is larger than they expected, and then waits — often through a full season — until the problem worsens, a survey demands it, or they decide to sell the house and cannot avoid it any longer.
That produces one of the longest and most irregular gaps between inquiry and revenue in the whole trade. A quote issued in March and accepted in November is entirely ordinary, and no window-based measurement will connect the two, so the March campaign is recorded as spend with nothing to show for it.
Matching the invoiced job back to the household who booked the inspection removes the problem completely. The gap is not modeled or decayed; the same person simply appears in two files, and the revenue is credited to the period the inquiry came from.
The expensive thing in this trade is not the advertising, it is the inspection. A structural technician driving to a property, spending an hour under it, and producing a detailed quote is a significant cost that is incurred before anybody has agreed to anything, and it is incurred on every inquiry regardless of whether the household ever intended to proceed.
Cost per lead treats a serious inquiry and a curious one as identical. A channel that fills the diary with homeowners who wanted a valuation for a sale they are not making is costing far more than its media spend, and on every dashboard available it looks like the cheapest source in the account.
Ranking channels on invoiced repairs makes that visible, and uploading the inspection list alongside the invoices lets the report show inspection-to-job conversion per channel — which is usually the number that changes how the diary is filled.
Only exact email and phone matches count on their own. The one weaker link the engine produces — the same national number under a different country code — is set aside as a decision for a person, and nothing else is: a phone number differing by a digit, an email under a different provider, a shared surname or address produce no link at all. None of it is folded into the revenue quietly. That design is the reason the headline figure can be carried into a budget meeting.
The work that does need a person is reading the matched rows behind a surprising figure, and the person best placed to do it is rarely the person who buys the advertising. Confirming that an inspection booked in March and a pier installation invoiced in November belong to the same property needs somebody who recognizes the address and the technician's note, which means the office manager or whoever runs the schedule. An agency reading the same rows is working from strings; the office is reading its own records.
Anything in the review queue stays out of the revenue until it is confirmed, and confirmations can be undone. An entry left alone stays in Direct and Unknown, so an unreviewed queue understates the attributed revenue rather than inflating it: the failure mode is conservative on purpose. And because the match has no window, a household that decides to proceed a year after the inspection is still linked, which is precisely the pair a window-based tool would have dropped.
Why it matters
"We generated 400 leads" invites an argument. "This channel closed $186,400 last quarter, here is the reconciliation" ends one. The teams that can show closed revenue by channel are the teams that get the next increase approved, because they are asking with evidence rather than with conviction.
Killing spend is politically harder than adding it, because someone always owns the channel being cut. A number that reconciles to the sales export takes the argument out of the room — you are not overruling a colleague's judgment, you are reading the same ledger they are.
Platform-reported conversions do not reconcile to revenue, and eventually someone in finance notices. Reporting built from your own closed-sales export starts from the number finance already trusts, which is why it holds up when it is checked.
Because this reconciles exports rather than tracking visitors, it works on months that have already closed. You are not instrumenting now to learn something in ninety days — you can answer for last quarter today, which is usually when the question is being asked.
Honest answers
Which is why signed contracts are the measure. Inspections that do not convert appear as unmatched leads and cost nothing.
There is no attribution window. The match holds however long the gap.
There is none. Two exports and a mapping you confirm once.
Pricing
The price here is the price on the invoice, plus any sales tax that applies — no per-call, per-minute or per-form fees. Growth usually fits foundation, waterproofing and structural repair contractors — thirteen months of history to compare a month to the same month last year, and a PDF you can put in front of whoever holds the budget.
A business scaling ad spend
$49/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Signed contracts: a customer email or phone, the contract value, and a date.
Yes — inspections are the lead file, contracts the sales file.
As long as it turns out to be. There is no window to fall outside of: however much time passes between the inquiry and the job, it matches if the customer is in both files.
Yes, with a job-type column mapped as Product / service, which shows foundation, waterproofing and structural revenue separately with how much of each traces to a channel. Channels are not ranked within each job type.
Yes, with a location column. Without it the report averages jobs that have no business being averaged.
Encrypted in transit and at rest, isolated to your workspace, and deletable in one click. A DPA is available, and customer details never leave that workspace. Structural reports and property photos can stay out of the export.
No. Where you already have them, a tracked caller's number is a clean key and raises the match rate, but nothing requires tracking numbers — the inspection requests exported from your ad platforms is enough to start.
Contract rows analyzed in a calendar month. Inspection rows do not count.
No. Nothing goes on your website, nothing connects to your job management software, and no permissions are granted. The inputs are two CSV files you export and can open in a spreadsheet before sending.
Yes, and most companies start that way. Because the method reads records kept for billing rather than a tag that had to be running at the time, last year works exactly as well as this month.
It is reported as Direct and Unknown and stays there. Unmatched revenue is never distributed across the paid channels to make the attributed share look larger, because that would make every other number on the page untrustworthy.
Yes, if the inspection list and the invoiced jobs are both uploaded. In a trade where the inspection is the main cost, this is often more useful than the revenue ranking itself.
Two years. Quotes routinely sit for a season or more before they are accepted, and a twelve-month file will understate the channels that produce the largest jobs.
Yes, with a job-type column. Their tickets and their cycles are different enough that a blended average is not actionable.
Yes. Export what was invoiced, including finance proceeds, as rows against the household.
In practice it is rare: a phone number that matches on its national digits under a different country code, which is not certain enough to count unaided. Both rows are shown together so a person can decide. Near-misses such as a number differing by a digit or a different email address are not flagged at all; they simply do not match.
Whoever recognizes the property. An office manager or scheduler can confirm that a March inspection and a November installation are the same job in seconds, because they remember the address. Somebody outside the business is working from strings alone and will either guess or leave the queue untouched.
The revenue stays in Direct and Unknown. An unreviewed queue makes the attributed figure smaller than it should be and never larger, so leaving it is a conservative choice rather than a wrong one, and confirming an entry later is always available.
Nearby
Match completed jobs and the revenue collected to the calls, insurer programs and referral partners that produced them.
See how it worksMatch signed and installed contracts to the leads and ads that produced them, across a sales cycle that often runs months.
See how it worksMatch completed jobs and their revenue to the calls and campaigns that produced them, from a routine pump-out to a full system replacement.
See how it worksFrom the blog
Multi-crew home and field services businesses run on phone calls and job management software, not on web forms. Which means the standard marketing dashboard is measuring the smallest part of the business and missing where the money actually is.
Read the articleGoogle's Local Services Ads charge for the phone call, not the click, and they hand you the caller's number with the invoice. It is the easiest channel in the budget to attribute to closed revenue. Almost nobody does, because the lead inbox is not where the reports live.
Read the articleFor a business that sells by phone, a missed call is a lead that was paid for and then dropped. It also quietly rewrites channel ROI: the channel whose callers ring after hours looks weaker than it is. Here is how to measure missed calls and callback speed from a call log, and how to report them without inventing revenue.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.