Offline orders, online channels
Phone and in-store revenue attributed to the ads that produced it.
Marketing attribution for ecommerce and retail brands
Attribute phone orders, quote requests and in-store purchases to the channels that produced them — the revenue your pixel never sees.
$196,000 70% of $280,000 paid
The blind spot
Your pixel measures the checkout perfectly. It is blind to the customer who researched online, called to ask about stock, and bought the expensive configuration over the phone — which is often where the margin is.
What you get
Phone and in-store revenue attributed to the ads that produced it.
This is not a replacement for on-site analytics. It covers the orders analytics cannot see.
Large phone-in configurations stop being invisible next to small self-serve carts.
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 | 84 | $98,000 | 35% | |
| Meta Ads | 61 | $53,200 | 19% | |
| Email marketing | 47 | $44,800 | 16% | |
| Direct / Unknown | 72 | $84,000 | 30% |
For retailers selling anything configured, fitted, delivered or expensive, a meaningful share of orders never goes through the cart. The customer researches online and then calls, emails a quote request, or walks in.
That revenue is not small and it is not random — it skews toward the largest orders, because the bigger the purchase the more likely someone wants to speak to a person first. Measuring only what the pixel sees systematically undervalues whichever channels produce considered purchases.
Keep your pixel and your on-site analytics. They do their job well for the checkout, and CloseRev makes no attempt to replicate them.
What it adds is the other half: an export of phone, quote and in-store orders matched against your ad and call data, so the channel report finally covers all of the revenue rather than the convenient part of it.
Open three advertising dashboards for the same month and add the conversions together. The total will exceed the orders in your own system, often substantially. Each platform counts a sale it believes it influenced, using its own rules about what qualifies and how long the credit lasts, and none of them is under any obligation to reconcile with the others. That is not dishonesty, it is three separate measurements of overlapping populations presented as though they were one ledger. The retailer is left holding three answers and one bank statement.
Consent choices, cross-device shopping and the plain fact that people research on a phone and buy on a laptop widen the gap further. Whatever the causes, the practical effect is identical: the platform figures cannot be summed, cannot be compared like for like, and cannot settle an argument about where the next dollar of budget should go, because each one is answering the question from inside its own boundary. A number only its own author can compute is not a shared measurement of anything.
Matching your own order export against the lead and click exports from each platform produces one ledger instead of three. Every order is counted once, against one source, and the total ties back to what you actually sold in the period. Orders that cannot be traced stay in Direct / Unknown rather than being divided up to improve the attributed share. That single constraint is why the resulting numbers can go in front of a finance director without a paragraph of explanation attached.
Gross revenue by channel is the wrong ranking for most retailers, and it is usually the only one they have. Two channels can produce identical revenue while one sells full-price stock to people who keep it and the other sells discounted stock to people who send half of it back. After returns and after the cost of goods those are not the same business at all, and the difference between them is frequently larger than anything a bid adjustment could ever deliver.
Both corrections happen in the export rather than in a project. Export net of returns, because the report counts the amount each row carries and does not subtract a returns column. Profit works the same way: the ranking runs on whatever amount you export, so a workspace that exports margin as the amount ranks channels on profit instead of revenue. Choose one and keep to it, because the report adds up every row in the workspace and margin and revenue should not be mixed. A margin ranking can disagree with a revenue ranking, sometimes right at the top, and the channel that looked best on revenue can turn out to be the most expensive way you have of moving stock.
Category, mapped as Product / service, is the breakdown worth adding, because a channel does not have a returns rate; the products it sells do. The report then shows revenue by category with how much of each traces to a channel, which turns an unflattering total into a question about which lines are selling and which are being advertised. It does not rank channels within each category, so it is a starting point rather than a verdict on any one channel.
Acquisition cost only means something against what a customer is eventually worth, and for anything consumable, replaceable or collectable the first order is a poor guide to that. The customer who buys once and the customer who buys four times a year for three years cost the same to acquire and are worth nothing like the same amount. Ranking channels on first-order revenue therefore rewards whichever source is cheapest at producing a single transaction, which is rarely the source producing customers worth having.
Because the match is on the person, every later order credits the channel that produced them originally, with no window in between and no cookie that needed to survive. Export two or three years of orders rather than one month and the ranking rearranges itself. Sources that looked expensive rise because their customers came back; sources that looked efficient fall because they were buying one-off purchases from people shopping on price alone. That reordering is usually larger than any optimization available inside an ad account.
Subscriptions and replenishment make the effect starker still. A recurring order credited every month to whatever campaign was running that month makes recent advertising look remarkable and the acquisition campaign look pointless, which is precisely backwards. Attaching the whole stream to the source that produced the subscriber is the only reading that describes what happened, and it is what lets a retailer justify spending more to acquire a customer than the first order is worth on its own. That decision is impossible to justify from a report built on single transactions.
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
Keep both. They measure the cart; this measures the orders that never reach it. The two answer different questions and the numbers should be read side by side, not summed.
Only the offline orders need to be in the file — the ones the pixel already attributed do not need re-attributing. That usually keeps the row count well inside a standard plan.
Email works as well, and both files are matched on both. Orders with neither simply stay in Direct / Unknown rather than being guessed at.
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 retailers whose larger orders close by phone or in store — 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.
Offline orders: a customer phone number or email, the order value, and the date. Most order-management and POS systems export this directly.
No. GA4 measures on-site behavior and the checkout. This covers orders that close by phone or in store, which GA4 cannot see.
Yes, if the POS captures a phone number or email. Without a contact detail there is nothing to match on and the order lands in Direct / Unknown.
Include them and they match the same way. It is often revealing to see which channel produced customers who came back.
Yes — include a product column and the report breaks down by it.
No. Your ad platform lead exports or call-tracker export work as the second file.
Yes, and it suits them: those almost never close in a cart, and the order values make the channel differences stark.
Order rows analyzed in a calendar month. Lead and call rows do not count.
Each counts conversions it believes it influenced, by its own rules, across overlapping populations. They were never built to reconcile with one another. Matching your own order export gives one ledger where every order counts once.
Yes, by exporting margin instead of revenue as each row's amount. The report ranks on whatever amount it is given and does not hold cost of goods beside revenue, and it adds up every row in the workspace, so choose margin or revenue and keep to it rather than mixing the two. A margin ranking can disagree with a revenue one, and a channel that looks strong on revenue can turn out to be the most expensive way you move stock.
Export net of returns. The report counts each row's amount as it stands and does not subtract a returns column. A channel has no returns rate of its own; its products do, so a category mapped as Product / service shows revenue by line, with how much of each traces to a channel.
Yes. Every later order carries the same contact detail, so the whole stream attaches to the source that produced the customer rather than to whichever campaign happened to be live that month.
Two or three years if you have it. A single month ranks channels on first orders alone, which rewards whichever source is cheapest at producing one transaction rather than a customer worth acquiring.
Leave them out, or include them with an order-type column mapped as Product / service so they can be read separately. They rarely come from your own campaigns, and leaving them unlabeled inflates the unattributed share without telling you anything useful.
Nearby
Match delivered vehicles and front-end gross to the calls, forms and ads that produced them.
See how it worksMatch your invoiced jobs to the calls and ads that produced them, and find out which channel is actually paying for the trucks.
See how it worksMatch your clients' closed-sales exports to their ad and call data, and hand them a per-channel revenue report at renewal time.
See how it worksWhere your sales already are
Export your orders, upload your calls and leads beside them, and see which marketing produced the sales that never had a click on them.
What to exportFor off-marketplace campaigns, use your own tagged lead records and match them against closed sales in your own system.
What to exportExport contacts with their original source and deals with their value, and rank on what each channel actually produced.
What to exportExport leads and invoices from Odoo, join them on the customer, and rank sources on invoiced revenue.
What to exportFrom the blog
Email platforms report attributed revenue, and the number is usually enormous. It is also the number most likely to be counting sales that were going to happen anyway — because email is the one channel whose audience is a list of people who have already bought from you.
Read the articleAffiliate and partner programs pay on the last click before a sale, which rewards whoever stands closest to the till rather than whoever found the customer. The cookie was always a weak witness. Here is how to check a partner's claims against your own closed sales, and what to pay for instead.
Read the articleThe marketing ROI formula is one line of arithmetic. The hard part is the number at the top of it: the revenue your marketing actually brought in, when the sale closed on a phone call or at a kitchen table. Here is how to get that number from your own sales, which costs belong underneath it, why ROI on margin ranks channels differently from ROI on revenue, and what to do about time lag and the sales nobody can trace.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.