ROAS · definition and formula

ROAS takes one division. You just need both numbers.

ROAS is attributed revenue divided by ad spend: $1,890 in revenue for $450 spent gives 4.20×, meaning $4.20 returned for every dollar spent. A link tool will give you the revenue. It will not tell you what the placement cost — so it cannot tell you whether it was worth it.

Connect a Meta accountCalculate a ROAS firstRead-only — nothing is written to Meta
Automatic daily import from MetaNo currency conversionBroken down by platform

150,05 €

imported from Meta in one request, day by day.

Cross-checked on 08/31 against what Meta reports for the same window: the same amount, to the cent. Broken down Facebook $3.55 / Instagram $146.50.

The formula

Revenue divided by spend

Attributed revenue on one side, ad spend on the other. ROAS is their ratio — 4.3× means every dollar spent returned $4.30.

These figures are not an example: they come from the real import of August 31 on the agency's ad account. $150.05 recorded, $150.05 reported by Meta.

See these columns on a live workspace

Automatic daily import

You connect the account once. After that, nothing left to do.

1

Spend is recorded day by day

Not a period total. Without the daily grain, "$300 for the month" would land entirely on one date, and the ROAS for the last seven days would be either zero or three hundred — never the real number.

2

It is broken down by delivery platform

A Meta ad runs on Facebook AND Instagram. Lumping them together would erase the distinction this product exists to show.

3

The last seven days are re-imported every cycle

Meta adjusts its figures for about 72 hours. Importing yesterday once is locking in a number that is not the final number.

4

Nothing is ever converted

The ad account currency is read from Meta and recorded as-is. Revenue in euros divided by spend in dollars produces a number that looks like a ROAS and is not one. When the two do not match, the figure stays blank.

The trap we avoided

Re-importing without duplicates

A unique constraint on nullable columns deduplicates nothing: Postgres treats two NULL values as distinct.

A re-import would have added a day to itself, silently, and ROAS would have drifted without any visible error. Hence a scope key that is never null.

@@unique([clientSpaceId, scopeKey, day, source])

// scopeKey vaut « link:… », « chan:… »
// ou « space » — JAMAIS null.

Understand attribution — the other half of the formula

In the product

No spend, no ROAS.

Spend from a boosted post attaches to its channel, not to a link — a sponsored post points to nothing. The workspace total carries it, even when no line shows it.

Without that, an agency connecting its Meta account would see nothing change at all.

What this changes for an agency

Subtraq analytics screen, with the Spend and ROAS columns by placement.
No spend, no columns. A half-empty table says nothing.

6

competitors checked. None import spend.

7

days re-imported every cycle

0

currency conversions, ever

ROASSpendBreak-evenAutomatic import

Common objections

What about Google Ads, TikTok Ads, LinkedIn Ads?

Not yet. Meta first because that is where the agencies we know spend — ours included. The table is already designed for other networks; the rest is work, not a rebuild. In the meantime, manual entry covers any ad network and spreads correctly across the days of the period.

Do I need a developer access token for my Meta account?

A read-only token for ad stats, with the ads_read permission. It cannot write, modify, or spend anything. It is verified on registration — a bad token is rejected immediately, rather than accepted silently by an integration that shows “connected” while importing nothing.

Why not a “Log in with Facebook” button?

It would require an approved Meta app for ads_read — a review process lasting several weeks that has not been started. A pasted token gives exactly the same access, read-only, today. When the app exists, the screen gains a button.

What no link tool does

ROAS

Revenue divided by spend

Others stop at revenue. This one fetches spend from Meta, day by day, and does the division.

Calculate mine


See the demo in actionSee the plans

Meta import is included from the paid plan.

Import your first ad spend

The import runs on its own every six hours. After seven days, you have ROAS on numbers from Meta — not a spreadsheet filled in by hand.

Create a workspace