Workflow
How to calculate your true ROAS
The ROAS in your ad account is not wrong. It is simply answering a different question from the one you are asking it.
What Google’s ROAS includes
Conversion value divided by cost, over the attribution window and model you have configured, credited to the day of the click rather than the day of the order.
That is a measure of advertising performance, and for comparing two campaigns against each other on the same day it is a perfectly good one.
What it leaves out
- VAT, if your conversion value is sent gross — which inflates every ROAS by the tax rate
- Refunds and cancellations, unless you send conversion adjustments back
- What the goods cost you, which Google has never seen
- Payment processing fees
- Shipping you bear rather than charge
- The exchange rate between your ad account’s currency and your store’s
None of these is an error on Google’s part. They are simply facts that live in Shopify and in your bank, and the ad platform has no access to any of them.
The adjustment, in order
Step 1: Start from orders, not from conversions
Take gross sales from Shopify for the period, on the order date. This anchors the calculation to money that actually arrived rather than to credited conversions.
Step 2: Subtract refunds
Revenue is gross sales minus refunds. Do this on the same period as the sales — a refund recorded in the period reduces it, even if the order is older.
Step 3: Strip VAT if your prices include it
Revenue for this purpose is what you keep, not what the customer paid. Tax collected on behalf of a government was never yours.
Step 4: Convert spend at each day’s rate
If the ad account bills in another currency, convert day by day and then sum, rather than converting the period total. A closed period should keep the profit it was earned at.
Step 5: Divide
True ROAS is adjusted revenue divided by converted ad spend. If a day has ad activity and no usable exchange rate, leave the period unreported rather than estimating it — a silently estimated day is a number nobody can audit later.
Step 6: Then go one step further to POAS
Subtract cost of goods from revenue and divide by the same spend. POAS answers the question a ROAS never can: after paying for the goods, did the advertising pay for itself? Break-even is 1.00×.
Let it run per order instead
Opteno performs this adjustment continuously rather than at month end. Revenue is gross sales minus refunds; cost of goods is summed from each sold variant’s cost-per-item, or from a store-wide percentage if you set one; spend is converted at each day’s own rate and then summed.
ROAS and POAS both appear on the product row, over rolling 7, 14 and 30-day windows, with variant, country and market breakdowns underneath. Where a variant has no cost or a day has no rate, the figure comes back unavailable with the reason attached — because an average that quietly includes a guess is worse than no average.
See which products are losing you money
Connect Shopify and Google Ads in under five minutes. From $14.99 a month, cancel whenever you want, and no change to your store or your campaigns without your approval.