Revenue, not calls
Channels are ordered by invoiced revenue rather than by volume, which is usually a different list from the one your ad account shows.
Marketing attribution for Pool Builders
Match signed contracts and their value to the campaigns and shows that produced the buyer, across a decision that takes a season.
$812,000 58% of $1,400,000 paid
The blind spot
A pool is a $70,000 decision made over six months. Lead forms fire in January, contracts are signed in May, and no window connects them.
What you get
Channels are ordered by invoiced revenue rather than by volume, which is usually a different list from the one your ad account shows.
No cookie has to survive the wait. A job closing months later still traces back to the inquiry that started it.
Nothing is redistributed. If a job cannot be traced to a channel, the report says so instead of improving the attributed share.
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 | 5 | $364,000 | 26% | |
| Meta Ads | 4 | $252,000 | 18% | |
| Home shows | 3 | $196,000 | 14% | |
| Direct / Unknown | 8 | $588,000 | 42% |
Homeowners research pools across a whole off-season, on several devices, and often visit a show before ever calling. The first click is expired long before the contract exists.
Matching on the customer removes the window entirely, and in this category it can move a large share of contract value onto the campaigns that actually produced it.
A show stand is a substantial line item justified largely by badge counts, while paid search is scrutinized weekly. The two have never been compared on the same basis.
The badge-scan list goes into the lead file, tagged with the show. Included there, the show ranks on signed contract value alongside every paid channel, and the comparison can be decisive either way.
A swimming pool is a five-figure discretionary purchase that a household thinks about for a year or more before committing, and then waits again while design, engineering, permits and excavation are arranged. Between the first inquiry and the first payment there is commonly a full calendar year, and between the first inquiry and the final invoice there can be two.
No advertising platform reports on that horizon, and no cookie survives it. The campaign that produced the inquiry has been paused, restructured or replaced long before the contract is signed, so last-click reporting hands the credit to whichever branded search happened in the two weeks before the deposit cleared and records the original campaign as pure cost.
Matching the signed contract and its payments back to the household who first inquired removes the horizon as a factor entirely. There is no window to expire and nothing to decay — the same people appear in an inquiry file from one year and a contract file from the next, and the revenue is credited to the period that produced them.
Pool builders spend designer and salesperson time lavishly before anybody commits: site visits, 3D renderings, revisions, finance conversations. That effort is the largest controllable cost in the business, it is incurred on every serious inquiry, and it is entirely invisible to cost per lead, which treats a household that will build and a household that is dreaming as the same event.
A channel that fills the design calendar with inquiries that never proceed is far more expensive than its media spend implies, and on every dashboard available it will look like the cheapest source in the account because its inquiries are plentiful.
Ranking channels on contracted and collected revenue exposes that immediately. Uploading the consultation list alongside the contracts goes further and shows consultation-to-contract conversion per channel, which is usually the number that decides how the design team's time is protected.
A pool customer is not a single transaction. There is the build, then chemicals and service, then a heater or automation upgrade, then eventually a resurfacing that is itself a substantial job. Many builders earn as much from the installed base over a decade as from the original construction.
All of that revenue traces back to one household that one campaign produced, and none of it is credited to that campaign by any conventional report, because each later job looks like a new customer arriving from nowhere.
Because the match is on the customer's contact detail rather than the job, later invoices credit the original channel. That is what turns a construction cost per lead into a genuine acquisition cost, and it may be the first time a builder can see what a customer is actually worth.
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 there is no attribution window. A May contract still credits a January campaign.
Which is why contract value is the measure. Unconverted leads appear as unmatched and cost nothing against your allowance.
Add the badge-scan list to the lead file, tagged with the show, and the show ranks on signed contracts like anything else.
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 pool construction and renovation companies — 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.
Add the badge-scan or inquiry list to the lead file, tagged with the show as its source.
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 build, it matches if the customer is in both files.
Yes, with a job-type column — and it is worth adding, because a blended average across them describes none of them.
Yes — later revenue credits the channel that produced the customer.
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.
Yes — and it is usually the right place to start, because a completed year already contains every job and the inquiry that produced it.
Contract rows analyzed in a calendar month. Lead 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 yourself and can open in a spreadsheet before sending either of them.
Yes, and most companies start that way. The method reads records kept for billing rather than a tag that had to be running at the time, so last year is exactly as analysable as this month.
It is reported as Direct and Unknown and stays there. Unmatched revenue is never spread across the paid channels to make the attributed share look larger, because doing that would make every other number on the page untrustworthy.
Two to three years. With a cycle that routinely runs past twelve months, a single year of data will match the fastest contracts and miss the ones that carry the year.
Yes, if both the consultation list and the signed contracts are uploaded. In a trade where design time is the scarce resource, this is often more useful than the revenue ranking itself.
Yes, exported as further rows carrying the same contact detail, credited to the channel that produced the original build.
Nearby
Match completed jobs and recurring maintenance contracts to the campaigns that produced the customer.
See how it worksMatch signed jobs and their value to the campaigns that produced the homeowner, across a season of deliberation.
See how it worksMatch signed and completed remodels to the inquiries, showroom visits and ads that produced them.
See how it worksWhere your sales already are
Export invoices from GorillaDesk, upload the leads that produced them, and rank marketing on the account rather than on the first job.
What to exportExport invoices from Arborgold, upload the leads behind them, and rank marketing on completed work rather than on requests for a quote.
What to exportExport billed applications from RealGreen, upload the leads behind them, and rank channels on the season rather than on the sign-up.
What to exportFrom 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.