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.
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.
Automatic daily import
You connect the account once. After that, nothing left to do.
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.
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.
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.
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.
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.

6
competitors checked. None import spend.
7
days re-imported every cycle
0
currency conversions, ever
Common objections
What about Google Ads, TikTok Ads, LinkedIn Ads?
Do I need a developer access token for my Meta account?
Why not a “Log in with Facebook” 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 a ROAS right now →
A free tool: ROAS, break-even, and cost per acquisition. No account needed.
Understand attribution first →
ROAS assumes knowing what a placement brought in. That is the other half.
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