Blog

You Fixed Attribution and Your ROAS Is Still Wrong

Dark circuit board data landscape with glowing teal revenue paths, headline: You Fixed Attribution and Your ROAS Is Still Wrong

The meeting goes the same way in every company I have worked with. Paid search reports a 6.2 return on ad spend for the quarter. Finance pulls closed revenue against the same spend and gets something closer to 2. Somebody says the tracking must be broken and a data analyst loses three weeks.

The tracking is usually fine. Both numbers are being calculated correctly by systems that were never counting the same thing, and the reconciliation project that follows is the most reliably wasted quarter in paid search. What almost nobody does in that meeting is ask which searches produced the revenue that neither dashboard is attributing properly, which is the only version of the question with an answer you can act on.

Platform ROAS and CRM revenue are counting two different events

Return on ad spend is revenue divided by ad spend over a period. The disagreement starts with which revenue and which period.

Google reports conversions against the time of the click, not the time of the conversion. Its own documentation says so plainly, and notes that CRM platforms report against the actual conversion date instead. That single difference is enough to make any month over month comparison a comparison of click cohorts against revenue events. A deal that closed in March against a January click lands in January for Google and in March for finance, and neither system is wrong.

Then there is what the platform counts that your database has no row for. Modeled conversions, in Google's own words, "estimate conversions that Google is unable to observe directly." They exist because consent choices and cross device paths broke direct observation, and they are a reasonable engineering response to that. They are also, by construction, not things that happened to a customer you can name. Add two ad platforms independently claiming credit for one sale, currency and timezone drift, and refunds that the CRM subtracts months later, and the gap explains itself without anyone needing to have made a mistake.

The two numbers were never going to match

They will not match, and the pursuit is expensive in a way that does not show up on any line item. I have watched teams build reconciliation dashboards for two quarters and then quietly stop opening them, because every time the number moved somebody had to go find out why, and the answer was almost always a reporting convention rather than a business event.

Perfect alignment is not available. The systems have different observation windows, different crediting rules, and different definitions of when a sale exists. Forcing them into agreement produces a number with false precision, which is worse than two honest numbers that disagree for known reasons.

Every vendor writing about this problem has to promise you the gap closes, because a closeable gap is the thing they are selling. An agency has no such obligation. The useful goal is not one true number, it is a stable relationship between the two you already have.

A stable gap is a working measurement system

The more useful artifact is the ratio between platform reported revenue and CRM closed revenue, tracked month over month and split by campaign and by whatever segmentation the business genuinely runs on, because that ratio behaves like a measurement instrument even when neither of its inputs is trustworthy on its own.

A ratio that holds steady means both systems are behaving consistently, and the platform number becomes usable with a known haircut applied to it. Everyone on the call can stop arguing about which dashboard to trust, because the distance between them has been quantified. A ratio that moves is the real alarm, and it usually means a tracking change, a shift in channel mix, or something new in the sales process rather than an attribution mystery worth a research project.

The ratio belongs in the monthly report alongside every other trend line, and it rewards the same kind of attention.

The variance that matters is sitting below your campaign reports

Everything above is available elsewhere. This part is not, and it is the reason the reconciliation project keeps failing to produce a decision.

Account and campaign level reconciliation averages away the thing worth knowing. Inside one campaign carrying one reported ROAS you will find queries closing at many times the value of others, because intent varies at the query level and revenue follows intent. Aggregating past the query throws that signal away before anyone gets to look at it. The campaign report is not lying to you so much as answering at a resolution too coarse to be useful.

The join itself is not complicated. It is the search terms report with closed revenue attached through the click identifier, or through whatever lead identifier the CRM actually maintains, ranked by realized revenue rather than by platform conversions, over a window long enough that the sales cycle has had time to resolve. Nothing in that description asks for tooling the account does not already have.

What comes out is reliably uncomfortable. There is usually a set of terms with healthy platform conversion counts and almost no closed revenue behind them, sitting alongside a smaller set of low volume terms quietly carrying the account. Neither group is visible from the campaign summary, and the bid strategy has been treating both as the same kind of success. This is the work we productized as query level paid search optimization, and it is where the reconciliation argument finally turns into a budget decision.

Importing revenue teaches the algorithm whatever you send it

Getting real revenue back into the platform is the right move and it is worth understanding what it does.

Offline conversion imports send closed outcomes from your CRM back to the click that produced them. Enhanced conversions for leads matches on hashed first party data when the click identifier is missing, and since April 2026 it shares a single setting with enhanced conversions for web, so anyone whose account was migrated automatically should go look at what that setting is currently doing. There is also a deadline worth knowing: from June 15, 2026, the Google Ads API stopped accepting new adopters of offline conversion imports, and that function moved to the Data Manager API. Existing implementations continue to work. Nothing was switched off.

Here is the part the vendors soften. Value based bidding is only as good as the values you send, and a thin or laggy revenue signal teaches Smart Bidding the wrong lesson faster than manual bidding ever could. Frederick Vallaeys put it well in July: Smart Bidding will optimize toward whatever value you feed it, and what it cannot do is tell you whether that value represents real profit. Target ROAS also needs roughly fifteen conversions in the preceding thirty days to have anything stable to work from, and switching your reported conversion from form fills to closed deals will cut your conversion count hard on the way to making it meaningful. That is a real tradeoff and it should be made deliberately rather than discovered.

One honest limitation, since over reliance on automation is how most of these programs go wrong. Stapling closed revenue onto a click identifier gives you a real dollar in place of a modeled one, and it is still last click attribution underneath. A CRM true ROAS can be exactly as non incremental as the platform number was. The academic record on this is unkind to everyone: across 663 experiments at Facebook, researchers with access to more than five thousand user level features concluded they were unable to reliably estimate an ad campaign's causal effect. If a platform holding that much data cannot recover causality from observation, neither will your CRM export.

What do you do when the CRM cannot give you a clean number?

Most accounts cannot produce clean closed revenue, and the advice written for the ones that can is useless to everybody else. Sales does not fill in the amount field. Stages go stale. The cycle runs longer than any window the platform offers, and Google's upload rules are unforgiving about that: click identifier uploads have to land within ninety days, hashed first party uploads within sixty three, and conversion adjustments within fifty five. If your average deal takes four months, you physically cannot attach the revenue to the click that earned it.

The workable answer in those accounts is a proxy, named openly as one. A mid funnel event the sales team does maintain reliably, valued at its historical close rate against expected revenue rather than at a guess, carries most of what the closed number would have carried. Conversion actions ranked by observed downstream close rate rather than by opinion tend to order the account roughly the way the revenue join would have ordered it, at lower fidelity. Segmentation on whatever field the CRM genuinely keeps current does useful work even when that field has nothing to do with revenue.

A rough proxy applied consistently beats a precise number that arrives ninety days after the decision needed making. It also beats waiting for a CRM cleanup project that has been six months away for two years.

The thirty day version is smaller than the reconciliation project it replaces

It is ninety days of search terms with revenue joined at whatever fidelity is available, ranked twice, once by platform conversions and once by realized revenue. The terms where the two rankings disagree most violently are the entire output. Those disagreements are the decisions the reconciliation argument was pointing at the whole time, and they are answerable before anyone touches a bid, a target, or an attribution setting.

The platform is not lying to you. It is answering a narrower question than the one you asked, at a resolution one level above where the answer lives.

Frequently asked questions

Why is my Google Ads ROAS higher than my actual revenue? Usually because the two systems count different things rather than because either is broken. Google credits a conversion inside its conversion window using the attribution model the account is set to, which can include modeled conversions with no matching row in your database, and it reports against the click date. Your CRM counts revenue when a deal closes and removes it again on a refund or a cancellation. The shape of the gap across one finished month, reconciled at the order level, is what separates those causes from each other, and it is worth having before any conclusion gets drawn.

Does platform ROAS always overstate performance? No, and assuming so will make you wrong in a specific direction. Haus, running 640 incrementality experiments, found that Meta under reported its own incrementality by around 15 percent on seven day click attribution. Platform numbers are biased rather than uniformly inflated, and the direction of the bias varies by platform, by campaign type, and by how much of your demand is already captured.

What is a good ROAS? There is no such number without a margin. A 4x return is comfortable on a high margin service and a slow loss on hardware with a return rate. The only figure that means anything is the return required to clear contribution margin at your own cost structure, which leaves published benchmark tables as trivia, particularly since the largest search benchmark study in the market reports cost per lead and does not publish ROAS at all.

How do I get real CRM revenue into Google Ads? The mechanism is the click identifier stored on the lead record at form submission, then the closed deal uploaded with its actual value once it lands. Enhanced conversions for leads can match on hashed email when the identifier is missing. The part that fails in practice is organizational rather than technical, since somebody has to own an export that runs on a schedule and sales has to keep close dates honest, and without both you have automated the delivery of bad numbers.

Should I optimize to platform ROAS or blended return? Blended belongs to the business decision and platform to the bidding decision, and the two are supposed to disagree. Blended return is total revenue over total ad spend with no attribution logic applied, so no platform's crediting rules can inflate it, and it is also useless for telling you which campaign to cut. The granular numbers are the only ones you can act on inside an account, which is exactly why they need checking against something the platform does not control.

All insights and articles

Reading about it is the easy part

Stop guessing. Start knowing your growth potential.

Get a free, no obligation audit of your paid search account, real math from your own query data, not a sales pitch.

The Optimal Path to Conversion

With precision bidding strategy, delivering the right Keyword/Match Type, to the right Ad Message, to the right Landing Page.

Wasteful Themes Pruned - Negatives
See how queryDNA works →