Earlier this year I built an embedded Shopify app that answers one question for a merchant spending money on Google Ads: what did that spend actually return? Orders come from the Shopify Admin API, spend comes from the Google Ads API, and the app joins them by day. React Router v7, TypeScript, Prisma, Shopify’s Admin GraphQL and ShopifyQL on the order side, the Google Ads API on the spend side. It is production grade, and it does a few things the tools most merchants use do not.
Then I went looking for the merchants it was for, and what I found changed the offer, the price and the platform list. This post is about that.
What the dashboard does differently
Every return-on-ad-spend number is revenue divided by spend, and the whole argument is about which revenue. Shopify’s Google channel reports gross: tax and shipping in, before discounts, refunds and gift cards. Most ROAS apps take that number as given. On a UK store that overstates the return by about a fifth before a single refund is counted.
So the dashboard reports ROAS on net revenue, after tax, shipping, discounts, refunds and gift cards, and reconciles it against the store’s own net sales to the penny before a merchant sees a figure. If the number does not match what the accounts show, the number is wrong, and it is not shown.
Two other choices follow from the same instinct.
- The campaign table is sorted worst first, by attributed revenue minus spend, so the campaign losing money is the first row. On the demo data that is a Display campaign that ran at 0.47x for a quarter. Nobody’s reporting puts that at the top, and it is the row a merchant most needs to see.
- Untracked orders go in an honest unattributed bucket rather than being spread across campaigns to flatter them. And blended ROAS, all revenue over all spend, sits beside first-order ROAS, revenue from first-time buyers only. Blended flatters: repeat customers who would have bought anyway get counted as ad revenue. On the demo data blended reads 5.4x and first-order 3.9x. The gap is what the ads are actually acquiring.
There is a live demo on a year of synthetic data at demo.risdonautomation.com. No sign-up, and nothing in it is a real merchant.
The thesis I started with
The tools merchants actually use for this, Triple Whale, Polar Analytics, Northbeam, TrueProfit, Lifetimely, are built Shopify first. Their app listings are there, their onboarding assumes it, and their design is for that merchant. I assumed, without ever saying it out loud, that this was because Shopify is ecommerce, and so I built a Shopify app.
What the screening found
Before selling anything I did the thing I should have done first. I built lists of UK ecommerce businesses, checked each one in Google’s Ads Transparency Centre to see whether it was actually running ads right now, and looked at what its storefront was running on. It is not hard: the page tells you, and where it does not, the source does.
The first list was Devon-leaning and mixed by category, 27 merchants. Of the 14 running live Google Ads, five were on Shopify. About a third. That number rattled me, and it is the number that started this post.
Then I widened the screen to about 150 merchants across the UK, chosen by category rather than by postcode, and the picture settled. Among the 46 advertisers whose platform I could confirm, Shopify was 63%. Across all five rounds it came out at roughly two-thirds Shopify, a tenth custom or headless, a tenth WooCommerce, a bit under a tenth Magento, and a twentieth BigCommerce.
So Shopify is the majority. Fine. The number that stuck is the other one: one in three merchants spending real money on Google Ads is on a platform that none of the tools above were built for. Their reporting is Google’s own figures, which count gross and mark their own homework, or a spreadsheet.
A few things the screening taught me that had nothing to do with platforms.
- Category beats geography. Devon, mixed categories: two advertisers in thirteen. UK-wide, in categories I chose: fourteen in fifteen. Filtering by proximity was costing me almost every lead.
- Inferred signals are not qualification. Three merchants a research report had flagged as top priority, on the strength of a case study or a Shopping presence, had zero live ads on a direct check. Only the Transparency Centre count counts.
- Supplied lists skew large. About half of one round’s Shopify hits were scaled or funded brands with in-house teams. A 200-ad count can sit on a four-person business or a four-hundred-person one, and the ad count cannot tell you which. LinkedIn’s headcount band can.
What that meant for the product
The dashboard’s value was never the Shopify part. Its value is the join: orders on one side, ad spend on the other, lined up by day, reconciled to the accounts, with the three numbers a merchant actually asks about on top. Shopify was the order source, and I had let the order source define the market.
Two-thirds of merchants can install a Shopify app. The other third cannot, but every one of them has orders and a Google Ads account, and the join works the same. So the Shopify connector became the first connector rather than the product. BigCommerce, WooCommerce and Magento each need one of their own, about eight days of work apiece, and each gets built the moment a merchant on that platform commits, not before. Whoever replies first decides which is next.
From an app to a service
The bigger change was in what I am selling. Not a dashboard a merchant installs and interprets, but a done-for-you reporting service. I connect whatever platform the store is on to its ad accounts, I check the numbers against the store’s own reporting before anyone sees them, and the merchant gets ROAS on net revenue, the worst-first campaign table and the blended-versus-first-order gap, kept up to date, with a person to ring when a number looks wrong.
The pricing is £750 to set up, then £199 a month per store, no contract. The first month is free for the first three clients, because the first three are also how the non-Shopify connectors get built and I would rather say that plainly than hide it in the price.
For a Shopify store the install is two permissions and it is done. For everything else, set-up is mine to do: the merchant grants read access, I build the connection and reconcile it before they see a figure.
What I would tell someone doing this
Screen the market before you pick the stack. I built for a platform because the tooling around it was excellent, and the excellence of the tooling told me nothing about who my customers were. A hundred and fifty storefronts and a few evenings changed the architecture, and the offer, and the price.
Separate the value from the source. If your product’s worth is a join, a calculation or a reconciliation, the system it reads from is a detail. Design it as one, with a connector at the edge, and the market gets wider for free.
Sell the outcome, not the tool. A merchant does not want a dashboard. They want to know, on a Tuesday, whether Monday’s spend bought anything, and to trust the number. The dashboard is how I get there. It is not what they are paying for.
If you run a shop on WooCommerce, Magento, BigCommerce or something of your own, and the only ROAS figure you have is the one Google shows you, that is the gap this was built for. Have a look at the demo, and if twenty minutes seeing it beside your own numbers would be useful, get in touch.