“Google already imports offline conversions.”
That is a different mechanism with different requirements, and it feeds the bidding rather than answering the question. This reads what actually closed, from files you already have.
For Google Ads
Export the leads your campaigns produced, match them against closed sales, and find out which campaigns produced revenue rather than form fills.
No API key Nothing to install in Google AdsNothing to install No card requiredNo card
Google Ads sits on the lead side in CloseRev: export the leads its campaigns produced — lead form downloads, call reporting, or your own landing-page records carrying the campaign — and match them against closed sales from whichever system holds them. Google can see the click and the form submission; it cannot see the invoice, so the campaigns it reports as best are the ones best at producing form submissions. Revenue with no traceable lead is reported as Direct / Unknown.
Last checked against Google Ads's own documentation on September 24, 2026.
The gap
Cost per conversion is excellent and the sales team says the leads are poor. Both are true and nothing joins them up.
What was sold, to whom, and for how much.
The click, the keyword, the call, and what each one cost.
The file
Three things carry the match: who, how much, and when. Anything else is optional and only changes how the report can be sliced.
On the lead export, the call report, or your own landing-page record. Whichever you use, it must carry a contact detail or there is nothing to match on.
The level you actually make decisions at. Account totals cannot be acted on and keyword level is usually too sparse to be stable.
When the form was submitted or the call was made. It anchors the window in which a sale should appear.
Search, Display, Performance Max, Demand Gen. Pooled, they hide the largest differences in the account.
Step by step
Written for somebody with Google Ads open in the next tab. Report names vary by edition, so each step says what to look for.
Lead form downloads, call reporting with the caller's number, or your own form records stamped with the campaign. Any of the three works; a click report alone does not.
From whichever system holds them — practice management, field service, CRM, point of sale. Contact detail, amount, date.
Days for an emergency trade, months for anything considered. Changing it between reports is how two campaigns get compared on two different rules.
A customer may have clicked an advert and also called from a map listing. Both belong in the lead file so the overlap is shown rather than assigned.
The join runs on the phone and the email, normalised, with unmatched leads and unmatched sales both kept visible.
What comes back
Revenue by channel, the count of sales behind each figure, and an honest bucket for the ones nobody could trace. Sample figures, from the worked example on the Home Services page — not from a Google Ads account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 54 | $218,600 | |
| Meta Ads | 29 | $66,500 | |
| Email marketing | 17 | $38,000 | |
| Direct / Unknown | 71 | $152,100 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
Automated bidding is very good at producing more of whatever you defined as a conversion. If that definition is a form submission, it will find the people most likely to submit forms.
Those are not the same people as the ones most likely to buy, and the gap between the two populations is not small in most accounts.
So a campaign can win on cost per conversion for a year while producing the worst revenue in the account, and nothing inside the platform would ever report it.
Matching leads to closed sales gives the number the bidding was never optimising for. What you then do with it — change the campaign, change the budget, or feed a better signal back — is a decision the report informs rather than makes.
A single account can run exact-match search alongside broad automated inventory, and those are different products with different buyers reached at different moments.
Reported together at the account level, the cheap conversions from one subsidise the expensive ones from the other and the average describes neither.
Where the export carries a campaign type or network, splitting on it is usually the first real finding, and it is often uncomfortable: the campaign with the best cost per conversion is frequently the one producing the least revenue.
The same applies to brand versus non-brand. Brand terms convert people who were already coming; blended into the account they make the whole thing look efficient.
For services, a large share of what Google produces is a phone call, and the platform records it as a conversion the moment it lasts long enough.
Call duration is not intent. A ninety-second call can be a wrong number, a price check or a booked job, and the platform cannot tell them apart.
Using the caller's number as the lead key and the ledger as the judge replaces duration with money, which changes which campaigns look good in almost every account that tries it.
It also puts a real number on the calls nobody answered, which is usually an operational problem being mistaken for a channel problem.
It does not connect to your Google Ads account, and it does not write anything back into it. It reads two files you exported.
It does not claim a sale for a campaign where nothing in the file links them. A sale with no matching lead is reported as Direct / Unknown, whatever the platform would have modelled.
It does not produce a view-through or a modelled number. Every figure in the report traces to a row in a file you can open, which is the property that makes it usable in an argument.
That restraint is the point. A number you can defend to a finance director is worth more than a larger number you cannot.
Fair questions
That is a different mechanism with different requirements, and it feeds the bidding rather than answering the question. This reads what actually closed, from files you already have.
Then the values came from an assumption. This compares them with the money that arrived.
The model is not the issue here. The issue is that the event being modelled is a form fill rather than a sale.
No. It reads files you exported, and nothing is written back to your account.
Leads with a contact detail and a campaign on one side; closed sales with a contact detail, an amount and a date on the other.
Correct, and that is why it cannot be the lead file. Use lead form downloads, call reporting, or your own form records stamped with the campaign.
Campaign and ad group. Keyword level is usually too sparse to be stable, and account level cannot be acted on.
Yes, where the campaign naming or the export distinguishes them, and the split usually changes the account's apparent efficiency.
As its own campaign, ranked on the same revenue as everything else. Pooling it with search is how its true cost usually stays hidden.
Whatever fits your sale, applied identically to every campaign. The rule matters more than the number.
The caller's number is the lead key. Call duration is not used as a proxy for intent, because it is not one.
Yes, and the overlap is reported rather than resolved silently in one channel's favour.
No. It answers the half Google cannot see, which is what happened after the lead.
A contact detail, a campaign and a date on one side; a contact detail, an amount and a date on the other. No click identifiers required, no audience lists, no creative. Encrypted in transit and at rest and deleted with the import.
Closed revenue per campaign and ad group, alongside what each produced in leads, with everything unmatched kept visible.
By trade
What the report looks like once the export is in, written for each one.
Other systems
Running more than one system, or comparing? The method is the same and the columns are not.
Google Ads and the other product names and logos on this page belong to their owners and are shown to identify the software a file comes from. CloseRev is not affiliated with or endorsed by them, and connects to none of them: it reads a file you export.
Start today
Nothing to install in Google Ads, no API key, and no need to have been tracking anything until now. Last year works as well as this month.