Compare product-channel combinations at equal ad spend using total contribution profit, not the highest attributed revenue ROAS.
60-second answer
The highest ROAS can produce the least contribution profit.
ROAS measures attributed revenue per ad dollar. A product-channel combination also carries its own average order value, product mix, fulfillment, fees, returns, and other variable costs. Rank comparable scenarios by the contribution left after those costs and ad spend.
Scenario revenue = ad spend x attributed ROAS
Normalized orders = scenario revenue / average order value
Contribution profit after ads = scenario revenue x contribution margin - ad spend
Equal spend controls only the amount invested in each scenario. It does not equalize impressions, clicks, conversion rate, order availability, customer quality, attribution rules, or incrementality.
Input contract
Build a contribution margin for each product-channel pair.
Input
Possible evidence
Required boundary
Attributed revenue and ROAS
Channel report using a documented window and value field
Attribution is reporting credit, not causal proof
AOV and item mix
GA4 ecommerce events and selected Data API metrics/dimensions
Use the same revenue and refund basis
Product unit cost
Shopify InventoryItem unitCost when populated and current
Unit cost is not complete contribution cost
Other variable costs
Fulfillment, payment, marketplace, returns, duties, packaging, and service ledgers
Include costs caused by the order or channel
Ad spend
Matched channel, product set, dates, timezone, and currency
Do not mix different spend populations
Shopify unitCost can support merchandise-cost mapping, but it does not include the complete product-channel cost boundary. Add fulfillment, payment and marketplace fees, return loss, duties, packaging, incentives, and other variable costs before treating the result as contribution margin.
Shopify manual workflow
Join product evidence before entering three aggregate scenarios.
Freeze one period, timezone, currency, advertising attribution setting, and refund-maturity date.
Build one compatible Shopify data exploration at product, variant, and Shopify sales-channel grain. Preserve Product ID and Product variant ID when compatible, product and variant labels, SKU, gross sales, discounts, Sales reversals, net sales, net quantity, matched Order ID or same-grain Orders, COGS, and net sales with and without cost recorded.
Export the matched advertising rows separately with ad product or product-set key, attributed revenue, ad spend, dates, timezone, currency, and attribution setting. Shopify Sales channel identifies where an order was placed; it is not an advertising attribution channel.
Create an explicit crosswalk for the extract period. Prefer Shopify Product variant ID mapped to the ad item key; use SKU only after proving it is populated, unique, and stable. Titles are display labels, not fuzzy join keys, and a replacement variant can have a new ID.
Add fulfillment, fees, reverse-logistics loss not already represented in net sales or COGS, duties, packaging, and other order-driven costs from their source ledgers.
Compatibility boundary: Shopify disables incompatible dimensions and metrics while a report is edited. Exact columns depend on the compatible exploration you select; do not assume every field appears in one default export. If split extracts lack a shared lossless key such as Order ID, Sale ID, or Product variant ID, stop instead of inferring a product-by-channel result from separate totals.
Cost-coverage gate: A missing product cost can make Shopify COGS display as $0. Check net sales with cost recorded against net sales without cost recorded and stop the scenario when material revenue lacks cost coverage; never convert missing cost into a verified zero.
Aggregate
Ratio-of-sums calculation
Scenario parameter
Period contract
Period + currency + timezone + advertising attribution setting
period
Scenario label
Non-sensitive product-channel alias
s#n
Modeled scenario AOV
Sum mature net sales / count unique matched orders
s#a
Contribution margin
(Sum net sales - COGS - fulfillment - fees - uncovered reverse logistics - other variable costs) / sum net sales
s#m
Attributed ROAS
Sum attributed revenue / sum matched ad spend
s#r
Ad spend
Sum matched ad spend
s#s
Never average the row ratios. Add their numerators and denominators first. This net-sales-per-order value is ROAS Break's modeled scenario AOV, not Shopify's official Average order value metric. Net quantity is not an order count; unless one item is proven to equal one order, it cannot supply the denominator. If orders contain multiple selected products, deduplicate Order ID within each scenario before counting.
Sales reversals are not physical returns. Shopify uses Sales reversals for the monetary value reversed through returns, cancellations, and order edits; it is the successor to the legacy Returns metric. Keep physical return handling and reverse-logistics loss in the external cost ledger.
Privacy boundary: Keep raw exports in your controlled workspace. Put only aggregate values and non-sensitive aliases in the shareable Scenario Planner URL; never include SKU, product or variant ID, order ID, customer data, or source filenames. This workflow does not upload a file.
Aggregation check
The combined row is 4.00x ROAS, not the average of two ROAS values.
This fictional two-row extract shows why every ratio must be rebuilt from totals. Contribution before ads uses the same net-sales and cost boundary in both rows.
A simple average would instead report $76.67 AOV, 35.71% margin, and 3.83x ROAS. Those values are wrong because the rows have different denominators. The ratio-of-sums result maps to s2a=80, s2m=40, s2r=4, and s2s=10000.
Equal-spend example
3.00x ROAS earns $500 more than 4.00x and $6,500 more than 5.00x.
Give three fictional product-channel combinations the same $10,000 ad spend. The margin is contribution before advertising, not gross margin. Each scenario assumes its entered AOV, contribution margin, and attributed ROAS hold at that spend level.
Scenario
AOV
Contribution margin
ROAS
Revenue
Normalized orders
Contribution profit
High ROAS low margin
$50
20%
5.00x
$50,000
1,000
$50,000 x 20% - $10,000 = $0
Balanced mix
$80
40%
4.00x
$40,000
500
$40,000 x 40% - $10,000 = $6,000
Lower ROAS high margin
$100
55%
3.00x
$30,000
300
$30,000 x 55% - $10,000 = $6,500
The 5.00x scenario merely breaks even after advertising because its 20% contribution margin supplies exactly $10,000 for the $10,000 spend. The 3.00x scenario wins because 55% of $30,000 creates $16,500 of contribution before ads and leaves $6,500 afterward.
Orders are normalization only: The planner divides revenue by AOV. The resulting 1,000, 500, and 300 are not imported order counts and should not replace observed transactions when those are available.
If Lower ROAS high margin falls from 3.00x to 2.80x at the same $10,000 spend, revenue becomes $28,000, normalized orders become 280, and contribution profit becomes $28,000 x 55% - $10,000 = $5,400. Balanced mix remains at $6,000 and becomes the winner.
Stress test
Revenue
Normalized orders
Contribution profit
Rank
Balanced mix at 4.00x
$40,000
500
$6,000
Winner
Lower ROAS high margin at 2.80x
$28,000
280
$5,400
Second
High ROAS low margin at 5.00x
$50,000
1,000
$0
Third
Do not scale this ranking linearly. More spend can change auction price, traffic quality, conversion rate, AOV, stock availability, discounting, fulfillment cost, return rate, and product mix. Recalculate marginal contribution at realistic spend steps instead of multiplying the current winner.
Attributed revenue is not proof of incremental revenue. Use experiments or another credible causal design when the decision depends on lift. If multiple channels credit the same order, reconcile those claims separately rather than adding scenario revenue.
Operating workflow
Keep extraction, economics, and decision ownership visible.
Define each product-channel pair and freeze report dates, attribution settings, timezone, currency, and revenue field.
Export observed product and transaction evidence from GA4 and the commerce platform.
Map Shopify unit cost where useful, then complete the variable cost boundary outside that field.
Calculate scenario-specific contribution margin and document whether refunds are mature.
Compare at equal spend, then stress-test ROAS, AOV, margin, and spend independently.
Choose the action from total and marginal contribution, inventory capacity, and uncertainty, not ratio rank alone.
Boundary: The POAS guide defines profit-on-ad-spend metrics. The attribution-versus-MER guide reconciles channel credit with the store. The Shopify guide maps report fields. This page uses already-defined inputs to rank product-channel combinations on total contribution profit.
Official sources and model limits
Source the fields, then declare every modeling assumption.
Google documents ecommerce collection and Data API reporting fields. Shopify documents analytics dimensions and metrics, compatibility controls, sales and profit reports, report exports, SKU behavior, InventoryItem, and unitCost. Amazon Ads supplies the ROAS terminology used in the scenario. ROAS Break supplies the manual crosswalk, ratio-of-sums method, privacy boundary, fictional inputs, equal-spend control, and profit ranking.