True ROAS AI is my own Shopify app, published under Lift Apps Studio. It answers one question that ad platforms are structurally unable to answer honestly: did this campaign make money?
Problem
Meta reports revenue, not profit. Its ROAS number excludes cost of goods, shipping, payment fees, refunds and discounts — every cost that decides whether a sale was worth making. It also over-attributes: the network claims credit for orders it didn’t drive, and when UTM parameters are missing or malformed, attribution degrades silently with no warning anywhere in the dashboard.
The result is a merchant scaling a 4× campaign that is quietly losing money on every order.
My role
I build and run the product end to end — Shopify OAuth and webhooks, the Meta Marketing API integration, the attribution and profit engines, the sync infrastructure, and the embedded Vue 3 interface merchants actually use.
Key decisions
Shopify is the source of truth, not the ad network. Every revenue figure is reconciled
against Shopify orders and refunds before it reaches a chart. Attribution matches orders to
campaigns through UTM parameters, fbclid, landing page and referrer, and each match carries
a confidence score instead of pretending certainty.
The profit engine uses exact decimals. Configurable COGS, shipping, fee structures and fixed operating costs feed a calculation that has to survive a merchant checking it against their own accounting. Floating-point drift is not acceptable in a number someone budgets on.
Freshness is a queue problem. A PostgreSQL-backed job queue runs incremental syncs of catalog, costs, orders and refunds, so the dashboard is current without hammering either API.
The integration layer is provider-agnostic. Meta ships first; Google, TikTok, Pinterest, Snapchat, LinkedIn and Microsoft Ads plug into the same attribution and profit engines without touching their core.
Outcomes
- Merchants see net profit, true ROAS, net ROAS, MER, CAC and margin side by side, with period comparisons and their best and worst campaigns called out.
- A campaign Meta reports at 4.20× resolves to a true ROAS of 1.80× once costs are deducted — the gap between those two numbers is the entire product.
- Campaign, product and order-level views all reconcile to the same figures, so a merchant can drill from “this campaign lost money” to the specific SKU and refund rate behind it.
- Access stays read-only and least-privilege, with GDPR webhooks and encrypted credential storage.
Lessons
Trust is the feature. A profit number is only useful if a merchant will act on it, and they only act on it if it survives being checked against their own books. That pushed almost every decision toward conservatism — exact decimals, confidence scores instead of confident guesses, and loud alerts when the inputs are wrong.

