Agency operations

Your ROAS looks great, so why is the business not growing?

Your ROAS looks great, so why is the business not growing?

Rhobin

July 30, 2026

7 min read

Reported ROAS measures the value attributed to your ad interactions inside one platform, not whether the spend created revenue, so it can rise while the business stands still. Growth shows up in a holdout test and in your own first-party data, never in the platform's ROAS column.

The symptom

The Google Ads account is hitting its target ROAS. The reported return is up on last quarter. You put it in the monthly report, the arrows point the right way, and then the client's finance lead says the thing that ends the meeting early: revenue is flat.

Nobody in the room is wrong. The platform numbers are internally consistent, the client's numbers are internally consistent, and the two measure different things. What follows is usually a hunt for a broken tag, which finds nothing, because nothing is broken.

The worse version: you pause a campaign reporting a strong return, expect a dip in revenue, and revenue does not move.

Why it happens

Reported ROAS is a real number, calculated correctly. It answers a narrower question than the client asked, and four documented behaviours pull it away from growth. The examples are Google's, because Google documents them in public detail, and the specifics differ per platform.

The platform only reports on itself

Google Ads reports a conversion only where there was a Google Ads interaction, such as a click, from that same account, per Google Ads Help. Attribution then decides which of those interactions gets the credit, and the menu has shrunk: first click, linear, time decay and position-based are no longer supported, those conversion actions were upgraded to data-driven attribution, and last click remains, per Google Ads Help.

An attribution model divides credit between your ads. It cannot tell you whether the revenue would have existed without them, because it never observes the week without ads. Two agencies can hold two honest reports that together claim more revenue than the client banked.

One nuance before anyone accuses a platform of inventing conversions. In Google Ads a view-through conversion, where someone sees an ad without interacting and converts later, is reporting only, outside the Conversions column, except in Performance Max for store goals, App and Demand Gen campaigns where it can be biddable, per Google Ads Help.

The date on the report is not the date of the money

Google Ads calculates its primary conversion columns on the time of the click, not the time of the conversion, per Google Ads Help. Its discrepancy documentation adds the other side: Ads reports on the ad interaction date, while other tools attribute to the conversion date.

Add the conversion window, the period after an ad interaction in which a conversion still counts, settable from 1 to 90 days with a 30-day default on Search and Display, per Google Ads Help. Last month's ROAS carries on improving after last month closed. A week-by-week comparison puts a curve that is still filling in next to one that is already final.

A repeat customer scores exactly like a new one

This is where a strong ROAS and a flat business live together most comfortably. Value-based bidding maximizes total conversion value, and by default it has no reason to prefer a first-time buyer over someone who reorders every six weeks. The clearest evidence is that Google sells the distinction as a feature: the new customer acquisition goal exists to "prioritize bidding that can reach and acquire new customers", per Google Ads Help.

How does it know who is new? Either Google autodetects, building an audience list from up to the last 540 days of campaign activity and tracked purchases, or you supply an existing-customer list through Customer Match, per Google Ads Help. Both routes inherit your data quality: autodetection only sees purchases that were tracked, and an uploaded list is as current as the last CRM export. Meanwhile branded search reports the best return in the account, because the person typing the client's name already knew it.

Revenue is not profit, and the value column is yours

ROAS is computed from the conversion value you send. Automated bid strategies use the values you set up, and Target ROAS maximizes conversion value such as revenue or profit margins, per Google Ads Help. Send gross revenue and gross revenue is what gets optimized, discounts included.

Returns are the sharp end. A refunded order stays in the reported value unless someone sends an adjustment: retract removes the conversion and zeroes its value, restate changes the value, online conversions need a transaction ID, and adjustments have to arrive within 55 days, per Google Ads Help. Plenty of setups never send one, so reported revenue includes money that went back to customers.

Profit needs its own step. Reporting POAS rather than ROAS is the right instinct, and the margin data has to reach the platform first: gross profit reporting for Shopping requires the cost of goods sold attribute in the Merchant Center feed, where Google computes profit as revenue minus COGS, per Google Ads Help. Without it, bidding can shift the mix toward cheap, discounted products and report a better return while the client earns less.

And the input was incomplete before any of this

Everything above assumes the events arrived. On a standard browser-side setup 15-30% of conversions go uncaptured and ad blockers strip 30-40% of events, which pushes reported ROAS the other way. Two errors, opposite signs, a different net per account. It is the same collection problem behind why conversions never reach GA4.

What good looks like

The platforms already document the honest answer, and it is not a column in the interface. Google describes Conversion Lift as measuring conversions driven by people seeing the ads, splitting an audience into a treatment group that sees them and a control group that does not, and reporting incremental return on ad spend as incremental conversion value over spend, per Google Ads Help. That is a holdout, and a holdout is the only structure that answers the client's question.

You cannot run one on a dataset you do not trust. Three things have to be true of the client's own data first: new versus returning at customer level, value net of returns and expressed as margin, and a baseline that does not inherit the platform's click-date logic.

That first-party dataset is what Archon Pixel is built for, your own analytics layer collected server-side, capturing roughly +25% more events than a standard GA4 setup and keeping the customer-level history new versus returning depends on. The ceiling on any setup is roughly 95% of events, a ceiling rather than a promise, because a consent refusal stays a refusal. The point is a baseline that moves for real reasons, not one missing a different share each month.

Then the caveat most articles skip. Whether an account's reported ROAS overstates or understates growth depends on four things: how much spend sits on brand terms, how high the repeat rate is, how wide the margin spread is, and how much of the collection layer is already lost. Anyone naming the direction without checking those is guessing, and what a tracking audit covers is largely the work of establishing which applies here.

FAQ

We hit the target ROAS every month. Is the number simply wrong?

No, it is right about what it measures, which is the value attributed to your ad interactions inside that platform. It misleads when it is read as a growth number. The gap is widest on accounts with heavy brand spend and a high repeat rate, narrowest on accounts selling something people buy once from a brand they had never heard of.

Can we just compare platform revenue to the client's own revenue?

Right instinct, and it needs care. The dates do not line up, because Ads counts on the click date and conversions can arrive up to 90 days later, and platform totals overlap when two platforms claim the same order. Compare as a ratio over a quarter rather than a week, and treat the change in that ratio as the signal.

Do we really need a holdout test?

It depends on how much budget rides on the answer. A lift test costs real spend, because the control group is money you deliberately do not spend on reachable customers, and it needs volume to detect a difference. Below that volume the better investment is the measurement base, since getting new versus returning and margin into the client's own data resolves much of the mystery without an experiment.

Does new customer acquisition bidding fix this?

It changes what bidding optimizes toward, which is useful, and it does not change what the reporting shows. It also runs on the data you already have, since detection uses tracked purchases from the last 540 days or a list you upload. If purchase tracking is patchy or the CRM export is stale, the feature inherits both problems.

If a client's ROAS and their revenue have stopped agreeing, request a free tracking audit and we will tell you which number describes the business.

© 2026 Archon LabsPrivacyTermsBuilt on unsampled data.