E-commerce reporting on contribution margin, not ROAS
Return on ad spend flatters campaigns and hides losses. The daily report — revenue, returns, COGS, shipping, payment fees, ad spend — that shows what each channel actually contributes, built automatically from the store, the ads and the ledger.
25 Feb 2026 · 2 min read · by HeiSyn
Return on ad spend is the number the ad platforms report, and it is the number that makes a losing campaign look like a winning one. It ignores returns, cost of goods, shipping, payment fees and discounts. A brand can scale a campaign with a great ROAS straight into a cash crisis. The number that matters is contribution after all of those, by channel, by day.
The ingredients
Gross revenue by order and source from the store. Returns and refunds, netted off when they happen. Cost of goods per SKU from the catalogue or the ERP. Shipping cost per order from the courier. Payment processing fees. Discounts applied. Ad spend by platform and campaign. Every one of these exists in a system with an API.
The calculation
Per order: revenue minus discounts minus refunds minus COGS minus shipping minus fees. Summed by source and by day, with ad spend for that source subtracted, gives contribution after marketing. Divide by orders for contribution per order; compare with acquisition cost for payback.
Automate it daily
A scheduled job pulls each source, joins on order ID and SKU, computes the contribution and posts the day's figures by channel to a dashboard and a morning message. Returns arriving later revise earlier days; the report shows the revision.
Decide with it
Campaigns with high ROAS and negative contribution are stopped or repriced. Products with high return rates are investigated. Channels with strong contribution get more budget. Discounts that do not lift contribution are ended. The daily number replaces the monthly argument about whether marketing is working.
Questions people ask next
- Where do we get cost of goods per SKU?
- From the inventory or accounting system if it exists, otherwise from a maintained sheet with landed cost per SKU that the report reads. An approximate COGS updated quarterly is far better than none; without it, ROAS is the only number and it lies.
- How do we handle returns that arrive weeks later?
- Net them against the original order's date in the report, so historical days are revised as returns arrive, and show a return rate by product and channel so the pattern is visible. A channel with strong sales and high returns is not a strong channel.
- What margin target should we aim for per channel?
- Enough contribution after marketing to cover fixed costs and profit at your volume — a number from your own accounts, not a benchmark. Channels above it get more budget; channels below it get fixed or cut. The daily report makes the comparison automatic.
Want this built for your team?
A free scoping call: we map your motion, name the number that should move, and quote a fixed-scope build.
Related
- Subscription churn prevention: the signals before a cancellation and the automation that acts on them
- Collecting reviews and customer content automatically: the flow that fills product pages with proof
- Loyalty programmes that change behaviour: points, tiers and the automation that makes them feel personal
- Marketplace seller onboarding and activation: getting supply-side users to their first listing and first sale

