Reading the ROAS report and Insights
How to read every figure on the attribution ROAS report and the Insights tab, with worked examples, and which decisions each one supports.
What it is
The ROAS report tab shows, per ad platform and campaign, how many orders were credited, the net revenue, the profit, the ad spend, and two ratios: ROAS and POAS. The Insights tab looks at the whole business: overall ad efficiency, the cost of new customers, customer value over time, what each platform claims, and two estimates.
Why it matters: ad platforms judge a campaign by revenue they think they caused. Your business lives on profit after the goods, the courier, the payment fees and the refused parcels. The report shows both, side by side, from your own books.
Note Example (one month, in your currency): Campaign A spent 20,000 and brought 64,000 of net revenue: ROAS 3.2×. After goods cost 30,000, courier charges 9,000, payment fees 1,000 and refusals 6,000, profit is 18,000: POAS 0.9×. Campaign B had ROAS 2.4× but POAS 1.3×, because it sold higher-margin products. B is the better campaign.
Who it is for
- Owners deciding where to put the ad budget
- Marketing staff and agencies
- Accountants checking ad spend against the books
Before you start#
- Access to Integrations. Profit, cost and POAS figures also need the Gross profit report right, and margins must not be hidden from you. Without them the report shows revenue only, and says Cost and profit figures need the Gross profit report right.
- Order attribution set up and, for spend, at least one ad account connected or spend imported from a file.
Step by step#
- Open Integrations › CFI Order Attribution and choose the ROAS report tab.
- Choose the Period: 7, 30, 90, 180 or 365 days, or Custom dates and Apply.
- Choose a comparison: No comparison, Compare with the previous period or Compare with a year earlier.
- Choose the Credit model (see below) and the Lookback window (7, 28 or 90 days).
- Choose the Date basis: By order date (what the books show) or By click date (what marketers compare with spend).
- Choose the Value: ROAS (net revenue) or POAS (profit after every cost).
- Read the tiles, the From revenue to profit card and the daily chart (Show as a table lists the same days).
- Choose Orders on a campaign row to see its orders. Choose an order number to open its progress.
What each control means#
| Control | Meaning |
|---|---|
| First touch | The first visit from an ad or campaign gets the whole order (the default) |
| Last touch | The last visit before the order gets the whole order |
| Last non-direct click | The last visit from an ad, a campaign or another site; typed-in visits are skipped |
| Linear | Every visit gets an equal share |
| Position based | First and last visit get 40% each; the visits between share 20% |
| Time decay | Newer visits weigh more: a visit 7 days earlier counts half as much |
| Data-driven | Learned from your own orders. Needs at least 30 orders with visits from 2 or more channels; until then the report uses linear and says why |
| Lookback window | Only visits in that many days before the order can get credit. An order with no visit in that time counts as direct |
How credit works on the report explains each model in plain words.
What you see#
The campaign table (example)
| Platform | Campaign | Orders | Net revenue | Spend | ROAS | POAS |
|---|---|---|---|---|---|---|
| Eid sale | 118.0 | 172,400 | 41,000 | 4.20× | 1.10× | |
| Brand search | 54.5 | 96,300 | 9,800 | 9.83× | 3.40× | |
| tiktok | New arrivals | 31.5 | 38,900 | 15,000 | 2.59× | 0.62× |
| (unattributed spend) | — | — | 3,200 | — | — |
How to read it:
- Orders can have decimals: with shared credit models, an order is split between visits (Weighted orders).
- Net revenue is the order total without tax and without shipping charged, less returns, credit notes and refunds.
- ROAS = net revenue ÷ spend. POAS = profit ÷ spend. POAS above 1× means the ads paid for themselves after every cost.
- (unattributed spend) is spend that matched no order. It is never spread over other campaigns, so the rows add up to the total.
- A row marked matched by name has no campaign id; it breaks when someone renames the campaign. Add
utm_idwith the UTM template.
From revenue to profit
| Line | Example |
|---|---|
| Revenue (ex tax, ex shipping charged) | 320,000 |
| Refunds and returns | −12,400 |
| Net revenue | 307,600 |
| Shipping and fees charged to customers | +18,000 |
| Cost of goods | −151,000 |
| Shipping paid (courier bills) | −27,500 |
| Payment fees | −3,100 |
| Return shipping and COD refusals | −9,800 |
| Profit (contribution) | 134,200 |
| Ad spend | −69,000 |
| Profit after ads | 65,200 |
Cost of goods is what the books posted for the order. For goods not picked yet it is estimated from the order lines; each order says posted, partly estimated or estimated. A refused cash-on-delivery parcel brings no revenue, but its shipping and return costs stay against the campaign (marked COD returned in its orders).
Insights
- Executive KPIs (every sales order, attributed or not): MER (all net revenue ÷ all ad spend), nCAC (ad spend ÷ customers whose first-ever order is in the period), aMER (new customers' first-order revenue ÷ ad spend), New-customer revenue, Contribution after ads. Each is compared with the period before.
- Customer lifetime value by cohort: customers grouped by the month of their first order and where it came from, with what they bought within 30, 60, 90, 180 and 365 days. A dash means the cohort isn't that old yet. Payback is the first column where profit per customer reaches the cost of getting that customer.
- What the ad platforms say vs what CFI counted: Platform conversions, Platform value and Platform ROAS next to CFI orders, CFI net revenue and CFI ROAS. CFI credits each order once (last non-direct click); each platform counts by its own rules, so platforms usually claim more. Neither number is "wrong".
- Media mix model (Estimate): weekly net revenue against each platform's spend, with Modelled ROAS, Next unit of spend returns, Carry-over and a Confidence. It needs 26 weeks and shows correlation, not proof.
- Plan a geo-lift test (Estimate): choose test regions from your customers' regions and the lift to detect (5%, 10% or 20%); the plan says how many weeks to run. The app never pauses ads for you.
Daily use#
A cash-on-delivery shop in Bangladesh
Use POAS (profit after every cost) and Last non-direct click over 30 days. Campaigns with many refusals show a high ROAS but a low POAS. Open Orders on such a campaign: the COD returned rows show where the money went.
An EU store with cookie consent
Orders without consent still carry their campaign label, so they are credited. Compare CFI ROAS with Platform ROAS on Insights: the platform's figure is often higher, because it counts views and modelled conversions.
A multi-location retailer
Use MER and nCAC on Insights for the whole business, because shop-counter sales are influenced by ads too, but never carry a click.
Good practice#
- Decide on POAS, report on ROAS. Ad platforms only understand revenue; your business needs profit.
- Keep one credit model for decisions. Switching models changes who gets credit, not how much you sold.
- Compare like with like: use Compare with a year earlier in seasonal trades.
- Give COD campaigns time: last week's orders are not settled yet.
Troubleshooting#
| What you see | Why | What to do |
|---|---|---|
| No attributed orders in this window yet. | No captured orders in the period | Widen the period; check the Health tab |
| No ad account is connected — this shows orders by platform and campaign only. … | No spend yet | Connect an account or import spend from a file |
| Cost and profit figures need the Gross profit report right. | Your role can't see margins | Ask the owner for the right |
| Rows matched by name | No campaign id on the orders | Add the UTM template to your ads |
| Large (unattributed spend) | Spend on campaigns with no orders, or ads without tags | Tag the ads; check tracking health |
| Data-driven shows linear | Fewer than 30 orders with visits from 2 or more channels | Wait for more orders |
| A currency is missing from spend | No exchange rate for that currency | Add rates in Settings › Currencies |
Limits and what is not there yet#
- Built and tested on test data to the cent; not yet run on a real ad account.
- Marketplace commissions are not in the profit yet.
- The media mix model and geo-lift planner are estimates.
Questions#
Why does Meta show more purchases than the report?
Each platform credits itself, counts views, uses its own windows and adds modelled conversions. The Insights tab shows both numbers and the reasons for the gap.
Which model should I use?
Last non-direct click is the usual default in analytics tools and easy to explain. Use Data-driven once you have enough orders.
Is the spend in my currency?
Spend is kept in each ad account's own currency and converted to your business currency at your own exchange rate for each day.
Can I post ad spend to the books?
Yes, from Ad spend in the books, linked on the Ad platforms tab. See Ad attribution, ROAS and POAS.
