Guide

ROAS reporting automation: stop rebuilding the same sheet every week

A practical, no-fluff guide for performance teams and agencies.

ROAS is the most quoted and least standardized metric in paid media: cohort or activity basis, platform or MMP revenue, fresh or matured — every pair gives a different number from the same week. Automating ROAS reporting is therefore mostly definition engineering; the pulls are the easy part. This guide locks the definitions, then the pipeline.

The four decisions that define your ROAS

  1. Basiscohort (revenue from users acquired in the period ÷ that period's spend) answers "was the spend good?"; activity (revenue received in the period ÷ spend in it) answers "what came in?" UA teams need cohort; finance often wants activity. Label which one every column is.
  2. Revenue source — MMP-attributed revenue for the headline; platform-claimed revenue only as the labeled optimization signal (it double-counts across channels by construction)
  3. Maturity — D7 ROAS means measured at day 7: young cohorts must show blank or "maturing," never a false low that panics someone
  4. Refunds & net — gross or net of refunds, decided once, written in the header

The cohort mechanics

Revenue keeps arriving for weeks after acquisition, so cohort ROAS is a grid, not a column: acquisition week down, age across.

Cohort (install wk) Spend D1 D7 D14 D30
May 18–24 $21,300 0.21 0.58 0.84 1.12
May 25–31 $22,900 0.19 0.55 0.79 maturing
Jun 1–7 $22,400 0.22 0.61 maturing
Jun 8–14 $24,150 0.20 maturing

The automation burden is the refresh: every run re-pulls maturing cohorts, because last month's rows are still changing. This is the most tedious manual reporting there is, and the strongest automation case.

The pipeline

  1. Pull spend per platform, pinned settings, period in the report's timezone
  2. Pull MMP revenue by install cohort at your grain (channel, geo)
  3. Update every cohort younger than your longest window; append the new cohort row
  4. Compute ROAS cells; stamp maturity labels; keep platform-claimed ROAS in its own labeled column
  5. Previewed append/refresh; summary flags cohorts pacing under target at their age (D7 vs the D7 baseline — never vs a blended target)

What breaks in manual ROAS

Blended-maturity averages ("our ROAS is 0.9" across cohorts aged 3 to 90 days — a meaningless number), platform revenue summed with MMP revenue, refunds applied to some months, and the panic cycle when a 5-day-old cohort is compared to a target meant for D30.

QA checklist

  • ✓ Basis, revenue source, maturity rule and refund policy written in the header
  • ✓ One cohort cell recomputed by hand from raw revenue rows
  • ✓ Maturity labels verified — no young cohort displaying as final
  • ✓ Refresh observed: an old cohort's D30 should tick up as it matures

When not to automate

Pre-monetization products, or while the team still argues cohort vs activity weekly. Decide, write it down, then schedule.

How Opera runs it

Opera maintains the cohort grid as a living object — maturing cohorts re-pulled, labels stamped, new rows appended, age-appropriate flags in the summary — through the same reporting pipeline as everything else. (Definition deep-dive: the ROAS guide.)

"Update the ROAS report: refresh maturing cohorts and flag anything pacing under the D7 target."

See this running on your own reports.A 45-minute workflow audit maps your current process and shows exactly what Opera automates — step by step.

Frequently asked questions

Platform ROAS says 2.1, MMP says 1.4 — which is right?
They measure different revenue claims under different attribution. Report MMP for outcomes, keep platform ROAS as the labeled per-channel signal, and watch the gap for breaks rather than arguing it to zero.
What's a good D7 ROAS target?
Whatever your payback model says it must be — it derives from margin and your D7→D90 maturation curve, not from a benchmark blog. The report's job is consistency against *your* target.
Can we report one blended ROAS number to leadership?
Yes — as activity-basis, labeled, beside the cohort view. The danger is only ever the unlabeled blend.

Put a number on the reporting tax.

Estimate the hours and fully-loaded labor cost your team spends on recurring reports — and what Opera gives back.