Home / Symptoms / All platforms

ROAS differs although event counts match

When purchase counts match but revenue or ROAS does not, look at currency codes, duplicates, refunds and failed payments. Here is the order to check them in.

SymptomPurchase counts agree between your MMP and an ad network, but revenue or ROAS figures do not.
Most likely causeRevenue is sensitive to currency handling, refunds, failed purchases and single missing or duplicate events.
First checkCheck that every revenue event carries a currency code and that both tools treat refunds the same way.

Short answer: reconcile on counts first, then explain value differences. Google itself discourages reconciling on values, because one missing, duplicated or refunded purchase can move revenue a lot while barely changing counts. Currency codes are the most common fixable cause.

Why revenue drifts when counts agree

Return on ad spend (ROAS): revenue attributed to a campaign divided by what the campaign cost.

Counts treat every purchase as one. Revenue weights them, so a single large purchase missing in one tool, or counted in a different currency, moves ROAS far more than it moves counts.

Should I reconcile on revenue at all?

Reconcile counts as the main check. Google's help centre says reconciling on values is highly discouraged. Use revenue gaps as a prompt to check currency and refund handling, not as the test of whether tracking works.

Likely causes

  • Missing or mismatched currency codes. Google lists currency and value mismatches among discrepancy causes.
  • Duplicate events. Purchases sent from both app and server without a shared transaction ID count twice (general practice).
  • Refunds and failed payments. Google says Play excludes failed purchases; tools differ in how they handle refunds.
  • Different windows. Google tracks in-app conversions within 90 days of the ad interaction by default, and GA4 uses 90 days for most key events; your MMP may use another window.
  • Different date basis. Ad platforms often report revenue against the ad interaction day.

How to confirm it

  1. Confirm counts match on the same date range, time zone and date basis.
  2. Inspect a sample of revenue events for a currency code.
  3. Search for pairs of identical purchases seconds apart.
  4. Check how each tool records refunds and failed payments.
  5. Compare in-app event windows in the network and your MMP.

How to fix it

  1. Send an ISO currency code with every revenue event.
  2. Send each purchase from one source, or add a shared transaction ID.
  3. Agree one rule for refunds and apply it in every tool you report from.
  4. Align windows for in-app events where you can.
  5. Report ROAS from one tool consistently rather than switching between them.
Gap patternLikely cause
Revenue off by a steady multipleCurrency
Revenue higher in one toolDuplicates
Revenue lower in one toolRefunds or failed payments
Gap grows with cohort ageDifferent windows

The events and revenue troubleshooter covers these checks, revenue events missing covers missing counts, and which number to trust covers which ROAS to report.

FAQ

Common questions

Why does ROAS differ between my MMP and Google Ads?

Usually because of currency handling, refunds, duplicates or different windows. Google advises reconciling on counts, since values are affected by many small differences.

What does a steady multiple between revenues mean?

It usually means one tool reads values in a different currency. Sending an ISO currency code with each event fixes it.

Do refunds affect ROAS in MMPs?

It depends on how you send them. If one tool receives refund events and another does not, their revenue will drift apart over time.

Which ROAS should I report to the business?

Pick one source and keep it. Many teams use the MMP for cross-channel ROAS because it counts each install and purchase once.

What is mobile attribution?

Mobile attribution is the process of crediting each app install or in-app event to the ad, link or channel that drove it. A mobile measurement partner (MMP) does this across all your channels so each install is counted once.

Why do ad networks report more installs than my MMP?

Each network counts every install it touched within its own windows, including views, while an MMP gives each install to a single source. Adding the networks' numbers together therefore overstates real installs.