Contract value, not MQLs
Rank channels by the revenue they closed so one large account outweighs a page of leads.
Marketing attribution for commercial cleaning companies
Match signed contracts and the monthly revenue they bill to the campaigns and outbound that produced the account.
$513,000 57% of $900,000 paid
The blind spot
A cleaning contract bills every month for years. Judged on a single first invoice, no acquisition channel looks worth funding.
What you get
Rank channels by the revenue they closed so one large account outweighs a page of leads.
A deal that closes two quarters after the click still credits that campaign.
A match is exact, or it waits for a person, or it is not made. That is deliberately conservative, because a contract revenue figure nobody can check is worth less than a smaller one they can.
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 | 41 | $243,000 | 27% | |
| LinkedIn Ads | 17 | $99,000 | 11% | |
| Outbound & referral | 29 | $171,000 | 19% | |
| Direct / Unknown | 66 | $387,000 | 43% |
A $2,400-a-month contract held for three years is worth $86,400. A channel judged on the first month appears to cost more than it earns and gets cut before it has been understood.
Because the match is on the account, every month of billing credits the channel that won it, which is the only ranking that reflects the economics of a recurring service business.
Contracts churn, and channels differ in the quality of the accounts they produce. Some produce price-driven clients who leave within a year; others produce buildings that stay for five.
With contract end dates in the export, average contract life can be read by channel — which usually matters more to the marketing budget than acquisition cost does.
Contract cleaning runs on thin margins, and the recurring schedule is the least profitable part of it. The money is in periodics: deep cleans, carpet and hard floor work, high-level and window cleaning, post-construction handovers, reactive call-outs after an incident. Those jobs are quoted against an existing account, invoiced separately, and almost never appear in any conversation about which channel produced the client. The report stops at the contract and the profitable half of the relationship stays invisible. A channel that opens accounts in buildings needing periodic work is worth far more than one opening accounts that never buy beyond the schedule.
Exporting periodic invoices as further rows against the same account contact puts that revenue where it belongs. It credits the channel that won the client, which is the only reading that matches how the business earns its margin. A column marking each row as the initial contract or periodic and extra work, mapped as Product / service, then shows the two as separate lines, each with how much of it traces to a channel — so the periodic revenue a contract eventually produced is visible beside the value that was signed. It is a column many cleaning businesses already carry for invoicing purposes.
There is a related trap in how contract value is quoted. A monthly contract figure is a forecast, not an invoice, and sites change constantly: hours get cut in a tight year, a floor comes out of scope, an extra day is added when the client's headcount rises. Reporting on the signed figure freezes a number that stopped being true in month four. Exporting what was actually billed anchors the ranking to money that arrived, and it makes contraction as visible as growth. Both happen to every contract cleaner and only one of them usually gets reported upward.
Cleaning is bought by a person with a job title and a budget, not by a site. A facilities manager, an office manager, a procurement lead at a managing agent — that individual signs, renews, expands and eventually leaves. When they move to another organization they frequently take the supplier with them, which is the most valuable and least measured phenomenon in the industry. Nothing in a lead report can see it, because the new organization is a new account with no history attached to it. The person is the same, and so, often, is the contact detail.
Matching on the contact rather than on the company means a buyer who moves and buys again links back to whatever produced them originally. Where they change email domain the link breaks and the revenue lands in Direct / Unknown, which is honest, but a mobile number frequently survives a job change where an address does not. Carrying both, where the file has both, is worth the small effort of including the extra column. It costs nothing to supply and it is the difference between crediting a channel correctly and losing the strongest evidence it has.
The corollary is about what to export, and it is a data minimization point as much as a practical one. You need the buying contact, the amount and the date. You do not need site addresses, access codes, keyholder names, staffing rotas or anything else operational, and none of it improves the match by a single row. Sending less is faster to produce and easier to get past whoever reviews supplier arrangements at a client of any size. Where a client's own contract restricts what may be shared about their premises, a file containing none of it is a short conversation.
The largest bucket is usually referral and word of mouth, and it should be. Contract cleaning is bought on reassurance, and a facilities manager asking a peer who they use is the most common first step in the whole process. That revenue genuinely was not produced by advertising, and showing it as Direct / Unknown at full size is what makes the paid numbers underneath worth reading. A report claiming to have traced most of a cleaning company's wins to campaigns would be describing something that did not happen, and it gets discarded the first time somebody checks one account against it.
Below that, the surprise is often tender activity. Portals and bid services carry a real subscription cost, get renewed on the number of opportunities they surface, and can be ranked on billed revenue like anything else once each portal's opportunities go into the lead file tagged with the portal. One portal may turn out to carry most of the won revenue and two others almost none, having been renewed side by side for years on identical reasoning. That is a decision the report makes for you rather than an insight needing interpretation, and it is usually the fastest saving available.
The third finding is about the scale of inquiry. Paid search in this category produces a high volume of inquiries from very small premises — a single office suite, a salon, a lock-up — which consume the same survey and quotation effort as a fifty-thousand square foot site and return a fraction of the revenue. Ranked on billed revenue, the channel generating them can look dramatically worse than its cost per inquiry suggested. The answer is rarely to switch it off, because the same channel also produces the occasional large inquiry; it is to bid and qualify differently.
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 later billing must credit the original channel — that is where the value of an account actually shows.
Add the outbound call or email list to the lead file, tagged as outbound, and it ranks against paid channels.
Matching works on a business contact's email or phone; company name is not used to match.
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. Starter usually fits janitorial and commercial cleaning contractors — one workspace, one seat, and everything that makes the number defensible from the first plan.
A single business getting started
$9/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Signed contracts or billing: an account contact email or phone, the amount, and a date.
Yes — later billing credits the channel that won the account.
Not as a figure; an end date is not read. Periodic invoices keep crediting the channel that won each client, so over a long range a channel whose contracts run longer accumulates more billed revenue.
Yes — the call or email list goes into the lead file, tagged with its source.
Yes: a territory column mapped as Location. Without it the report averages won contracts that have no business being averaged.
It is encrypted in transit and at rest and isolated per workspace, so no other account can reach your clients. Deletion is immediate and a DPA is available.
Yes. Most janitorial and commercial cleaning contractors begin with last year, because it is the cheapest way to find out whether the exercise tells them anything.
Contract or billing rows analyzed in a calendar month. Lead rows do not count.
Yes. Export them as further rows against the same account contact and they credit the channel that won the client. In most cleaning businesses that is where the margin sits, so omitting them understates every acquisition channel you run.
What you billed. A signed monthly figure is a forecast, and sites gain and lose hours constantly, so a ranking built on contract value slowly drifts away from the money that actually arrived.
If their contact detail is unchanged, the new organization's revenue links back to whatever produced them originally. If it changed, the revenue lands in Direct / Unknown rather than being credited to a guess.
Yes. Add each portal's list of opportunities to the lead file, tagged with the portal, and each is ranked on billed revenue. One portal may turn out to carry most of the won work and the others very little.
No, and you should not. The match reads a buying contact, an amount and a date. Leaving operational detail out is faster to produce and far easier to clear with a client's own procurement team.
Because cleaning is bought largely on referral and reputation, which no campaign produced. That share is shown at full size rather than shared across the paid channels, which is what makes the paid figures underneath trustworthy.
Nearby
Match signed contracts and the revenue they bill across their term to the campaigns, events and bids that produced the client.
See how it worksMatch opened accounts and the recurring service revenue they bill to the campaigns and calls that produced the customer.
See how it worksMatch signed contracts and the billed hours or monitoring fees they generate to the campaigns and bids that produced the account.
See how it worksWhere your sales already are
Export paid invoices and match them to the campaigns that produced the customer — including the recurring work that follows.
What to exportExport won deals and match them to the ads, calls and referrals behind them — including the sources Pipedrive only records as a text field.
What to exportExport invoices from QuickBooks Online, upload your call and lead records beside them, and see revenue by channel — from the ledger rather than from a guess.
What to exportExport sales invoices, upload your lead and call records beside them, and rank channels on the revenue you actually billed.
What to exportExport invoiced work from Aspire, upload the leads behind it, and rank marketing on the account across its renewals.
What to exportExport billed services from Briostack, upload the leads behind them, and rank channels on what their accounts were actually worth.
What to exportExport leads and invoices from Odoo, join them on the customer, and rank sources on invoiced revenue.
What to exportFrom the blog
It is easy to compute, easy to improve, and it will happily bankrupt you. A defense of the least popular position in performance marketing: that the metric most teams are held to is actively harmful, and that the alternative is available to anyone willing to do one join.
Read the articleThe export is the part of an attribution project that everyone treats as trivial and that determines whether the whole thing works. Here is the field list, the date-range trap, the deduplication rule, and the six columns to leave out on purpose.
Read the articleAttribution needs history and privacy law needs forgetting, and those two facts are in direct tension. A practical retention policy for marketing data: what to keep, what to aggregate, what to delete, and how to prove you did.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.