ROAS on cash
you actually collected.
Ad platforms optimise to the order. We import what they spent, per campaign per day, and divide it by what was delivered — ordered, confirmed and delivered: three columns, one truth.
Ninety seconds to a real ROAS.
- 1
Spend imports itself.
A daily job pulls Meta and TikTok per campaign per day — and re-states the last days, because the platforms revise. Google and the rest come in as CSV.
- 2
Money is stamped once.
Each row converts at your shop rate effective that day, at import time. Reports read the stamp and never re-convert — yesterday's numbers don't move.
- 3
Read the three ROAS columns.
Ordered, confirmed, delivered — revenue over spend at each gate of the lifecycle, with the refusal rate beside them. The delivered column is the one you pay salaries from.
The platforms restate. So do we.
Re-importing a day overwrites that day's rows and re-stamps the same rate — idempotent by unique key, logged per run, with the platform's own purchases shown beside ours and never added to them.
Every campaign meets its orders.
Spend joins to orders through the attribution stamped at checkout — UTM campaign, id first, name second, case-insensitive. Campaigns with orders but no spend row get listed too, because organic is not zero; it is unattributed.
The funnel ends at collected.
Created to confirmed to dispatched to delivered to collected — cumulative on the orders placed in the window, with returns broken down by governorate, product and channel. The leak has an address.
Platform-reported vs delivered.
| The ad platform | Raizn | |
|---|---|---|
| Revenue | What the pixel claims. | Orders from your own checkout, stamped at placement. |
| ROAS | On purchases the platform counted. | Three gates: ordered, confirmed, delivered cash. |
| FX | Re-converted every time you look. | Converted once at import, at your shop rate, stamped. |