“CallRail already shows revenue when we push values back.”
That works when somebody consistently pushes a value onto the call record. This reads the money from the system that already holds it, so it does not depend on anyone remembering.
For CallRail
CallRail tells you which campaign produced the call. Match the caller against your sales export and find out which calls became money.
CloseRev reads a CallRail export of tracked calls — the caller's number and the source, campaign and keyword attached to it — and matches those callers against your closed-sales export. CallRail answers which campaign produced the call; this answers which calls produced revenue, which is the half no call tracking platform can see. Calls that never became revenue simply do not appear in the revenue column.
Page updated September 24, 2026.
The gap
You can see that a keyword produced forty calls. You cannot see that six of them bought, or that two of those six were worth the whole month.
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.
The tracked call's caller ID. This is the join key, and it is unusually clean — it is captured by the network rather than typed by anyone.
CallRail's attribution fields on the call record. This is the half CallRail is genuinely good at.
Used to order the match when a caller appears more than once: the earliest call takes the credit.
Not read as a field. Append the qualified flag to the campaign value and the drill-down sets qualified and unqualified calls beside their revenue, which is where the two often disagree.
Step by step
Written for somebody with CallRail open in the next tab. Report names vary by edition, so each step says what to look for.
CallRail's call log exports to CSV with the caller number and the source, campaign and keyword attached. This is the lead file.
From whatever holds the money — your CRM, practice management, job management or accounting system. Customer phone, amount, date.
The sales file needs to reach further back than the call file, because the call precedes the sale by weeks or months.
The join is the phone number, normalized on both sides with a proper phone library rather than string comparison.
Where qualified calls and revenue rank a channel differently, that gap can be the most useful thing on the report.
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 Law Firms page — not from a CallRail account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 18 | $312,000 | |
| Meta Ads | 6 | $54,000 | |
| Email marketing | 3 | $30,000 | |
| Direct / Unknown | 14 | $204,000 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
CallRail is very good at the thing it does. Dynamic number insertion attributes a phone call to a source, campaign and keyword, which is genuinely hard, and it produces a clean identifier — the caller's number, captured by the network rather than typed into a form.
That clean identifier is why this pairing works so well. Most attribution failures are matching failures, and most matching failures come from dirty keys: misspelt names, personal versus work email, a form filled in by an assistant. A caller ID is none of those things.
What call tracking cannot do is know what happened after the call. It can tell you the call lasted four minutes and was tagged as a lead. It cannot tell you the caller signed a contract in March for eleven thousand dollars, because that fact lives in a different system entirely.
A common proxy for value is call duration or a manual qualification tag. It is a reasonable proxy and it can be biased: long, polite, thorough calls from people who never buy score well, and short decisive calls from people who already knew what they wanted score badly.
When you rank channels by qualified calls and then by revenue, the two lists can differ. That difference is not noise, it is the thing worth knowing — it identifies the channel that is filling the phone with conversation and the channel that is filling it with customers.
For a plumber a call converts in days. For a law firm, a senior living community, a custom home builder or a commercial insurance broker, the call in February becomes revenue in September or later.
Call tracking reporting is naturally organized around the call, so the further the revenue sits from it the less visible it becomes. Reconciling the call log against a sales export that covers a longer period recovers exactly that revenue, and it is disproportionately the large revenue.
Most businesses take both. Calls go through CallRail; forms go through the website into a CRM or an inbox. They tend to be reported separately and compared with hand-waving.
Combining both into one lead file, each row tagged with its source, puts them on one axis, ranked on closed revenue. The split between them can differ a great deal by industry, and it is more often assumed than measured.
A call log is noisier than it looks. It carries existing customers calling about a job in progress, suppliers, recruiters, wrong numbers and outright spam, and all of them are attributed to whichever number they happened to dial.
That noise inflates cost-per-call comparisons and it is not evenly distributed — a heavily advertised tracking number collects more of it than a quiet one. Matching against the sales export filters it out by construction: a call that never became revenue simply does not appear in the revenue column.
It also surfaces the opposite case, which is more interesting. An existing customer who calls a tracked number and then buys again is real revenue, and if that call is their earliest lead in the file it takes the credit. Whether it should is a judgment call, so map a new/existing customer column as Product / service and see that revenue apart.
Fair questions
That works when somebody consistently pushes a value onto the call record. This reads the money from the system that already holds it, so it does not depend on anyone remembering.
Nothing is being swapped. CallRail stays exactly where it is and its export becomes the lead file.
That is the normal case and the reason this exists. Two exports, one join, on the phone number.
No. CallRail supplies the lead file; this adds what the callers went on to pay. The two are complementary by design.
The call log with caller number, source, campaign, keyword and date.
Closed sales from whatever holds your money: CRM, practice management, job management or accounting.
On the phone number, normalized with a proper phone library on both sides rather than string comparison.
If the email matches, the sale still joins. If neither matches, the sale stays in Direct / Unknown; nothing is guessed. The one case held for a person is the same number under a different country code.
Yes. Combine both into one lead file, each row tagged with its source, and they rank on closed revenue on one axis.
Yes, with the qualified flag in the campaign value; the disagreement between the two rankings can be the most useful output.
Further than the call file, because the revenue lands after the call — often months after.
Yes. Any provider that exports a caller number with a source works the same way.
The call log's caller number, its source fields and a date. No recordings, no transcripts, no voicemail. What you upload is encrypted in transit and at rest, isolated to your workspace, and deleted with the import — recordings never leave CallRail because they are never part of the file.
They count, crediting their earliest lead in the file. Map a new/existing customer column as Product / service to see that revenue apart and decide whether it should credit the campaign.
They never appear in the revenue column, because they produced no revenue to match. That filtering is automatic.
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.
CallRail 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.
From the blog
Call tracking answers one question well: which campaign produced the ring. It has no view of what happened after the call ended, which is where the money is decided. This is what the gap costs, and how to close it without replacing the call tracker you already have.
Read the articleBefore you blame the matching algorithm, look at how phone numbers are stored on each side. Extensions, country codes, leading zeros and a spreadsheet that decided a number was maths — this is where most attribution quietly fails.
Read the articleEvery revenue-by-channel report is a sum grouped by one field: the lead source. If that field is free text, half the revenue lands on lines like "Phone", "Website", "Other" and blank, and the channels that bring customers in by phone look like they lose money. Here is how to set the field up as a short fixed list, who fills it in and when, how tracking numbers, hidden form fields and booking links fill it automatically, how to settle conflicting sources, and how to audit it every month.
Read the articleStart today
Nothing to install in CallRail, no API key, and no need to have been tracking anything until now. Last year works as well as this month.