At a glance
Average percentage gap between the merchant’s OnBuy price and their DTC (Shopify, BigCommerce, Adobe Commerce) list price for the same SKU. Read together with onbuy_xc_catalogue_drift (OnBuy vs Amazon) to spot when OnBuy is being treated as a discount channel that cannibalises DTC margin.
| What it counts | AVG((onbuy.price - dtc.list_price) / dtc.list_price) across SKUs listed on both. Result is a signed percentage; negative means OnBuy is cheaper, positive means OnBuy is more expensive. |
| Direction expectation | Most healthy merchants land at -3% to +5% on average (OnBuy slightly cheaper or roughly at parity with DTC). Below -10% is the alert. |
| Source data | OnBuy GET /v2/listings price field joined to the merchant’s connected DTC platform (shopify.product.variant.price, bigcommerce.products.price, or adobe_commerce.product.price). |
| Match key precedence | (1) Barcode (EAN/UPC), (2) seller-SKU, (3) manual cross-reference where the merchant has set it. |
| Includes promo prices? | DTC side uses list_price (not the active discount price), to avoid flagging temporary sales. The OnBuy side uses the live storefront price. |
| Currency | GBP only on both sides. Non-GBP DTC listings are filtered out. |
| Refunds / cancellations | Not relevant. This is a price-comparison card; no order-level data feeds it. |
| Time window | 30D. Used as a stability filter, the gap must hold for at least 7 consecutive days to count toward the average; transient DTC promo discounts are excluded. |
| Alert trigger | OnBuy >10% below DTC list. The alert fires on the average across all matched SKUs. |
| Sentiment | Negative (OnBuy cheaper) is mildly concerning above 10% gap; rising negative trend over 90 days is the structural warning. |
| Roles | owner, finance, marketing. |
| Only when | has_commerce_sibling = true (Shopify, BigCommerce, or Adobe Commerce connected). |
Calculation
Calculated automatically from your OnBuy data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A small UK kitchen-and-tableware seller, snapshot taken 27 Apr 26. The seller has 95 SKUs on OnBuy and 220 on Shopify (DTC). 88 SKUs match across both. Sample of the matched-SKU price comparison:| SKU | OnBuy price | Shopify list price | Gap |
|---|---|---|---|
| KT-2104 (oak chopping board) | £18.99 | £24.99 | -24.0% |
| KT-2118 (linen tea-towel set) | £14.50 | £19.99 | -27.5% |
| KT-2202 (wooden serving platter) | £29.99 | £39.99 | -25.0% |
| KT-2450 (cast-iron skillet) | £42.00 | £52.00 | -19.2% |
| KT-3201 (ceramic mug, navy) | £8.99 | £11.99 | -25.0% |
| KT-3504 (storage tin) | £12.99 | £14.50 | -10.4% |
| KT-3601 (wooden spoon) | £6.99 | £6.99 | 0.0% |
| (… 81 more rows …) |
| Effect | Mechanism | Estimated impact |
|---|---|---|
| DTC cannibalisation | Brand-loyal customers who would have bought direct (full margin) instead buy via OnBuy at -15% (lower margin after fees). | 10 to 20% of DTC-attributable sales rerouted to OnBuy |
| Margin compression | OnBuy’s net margin (after 7% commission, 9p fee, packaging) lands at ~£8 to £12 per order vs DTC’s ~£15 to £22. | Lost margin per cannibalised order: £5 to £12 |
| Brand perception | Repeat DTC customers see the brand as “always cheaper on OnBuy”; they pre-search OnBuy on every visit. | Long-tail DTC AOV erosion of 5 to 10% over 12 months |
| Amazon Buy Box risk | If the OnBuy listing is also cheaper than Amazon by >15%, it can trigger Buy Box suspension on Amazon for the same SKU. | See onbuy_xc_catalogue_drift |
Sibling cards merchants should reference together
This card is the DTC-vs-marketplace pricing-discipline read. The natural pairings:| Card | Why it matters next to DTC price gap | What the combination tells you |
|---|---|---|
| Catalogue Drift vs Amazon UK | The marketplace twin. | If OnBuy is cheaper than DTC AND cheaper than Amazon, the merchant has positioned OnBuy as the lowest-price channel; the cumulative risk (DTC cannibalisation + Amazon Buy Box loss) compounds. |
| Avg Discount vs RRP | The OnBuy-internal view. | If OnBuy avg discount is also high vs RRP, the price gap is the merchant’s deliberate channel-level discount, not just relative cheapness. |
| OnBuy Total Revenue | Sizes the channel. | Lets you weigh the lost DTC margin against the OnBuy revenue it generates. |
| OnBuy Commission % of Revenue | The fee context. | Some merchants discount OnBuy to “pass commission savings to the buyer”; that logic only works to ~7%, not 15%. |
| Shopify Total Revenue | The DTC channel. | A flat or declining DTC revenue line alongside high OnBuy gap suggests cannibalisation; growing DTC despite the gap suggests the channels reach different audiences. |
| Shopify AOV | DTC basket size. | DTC AOV erosion over time correlates strongly with persistent OnBuy price-gap; it is the leading indicator that brand-loyal customers are switching channels. |
| OnBuy Share of UK Revenue | The portfolio view. | Rising OnBuy share + widening DTC gap = cannibalisation in motion; rising OnBuy share + narrow gap = healthy channel growth. |
Reconciling against the vendor’s own dashboard
Where to look in OnBuy’s own dashboard: OnBuy does not provide a DTC comparison view; the data lives in the merchant’s own DTC platform. The closest manual workflow is:
OnBuy Seller Console (https://seller.onbuy.com) -> Listings -> All Listings (export CSV with prices)
Shopify Admin -> Products -> Export (or BigCommerce / Adobe equivalent)
Compare in Excel using EAN or SKU as the join key.
Most merchants only run this comparison after a brand or distributor flags a MAP violation, by which time the cannibalisation has already happened.
Why our number may legitimately differ from a manual comparison:
| Reason | Direction | Why |
|---|---|---|
| DTC promo prices | Ours larger gap | We compare to list_price, ignoring active DTC promotions. A merchant doing a 20% Shopify storewide sale will see “the OnBuy gap looks fine” in their own dashboard but the structural gap (post-promo) is what we measure. |
| Stability filter | Ours lower | We require a 7-day price-stability window; manual snapshots include flash-sale moments. |
| Match key precedence | Either | Manual SKU-based comparisons miss SKUs where the merchant uses different SKU codes per channel; our EAN-first matcher catches more. |
| Variant rollup | Marginal | Shopify variants and OnBuy listings should be 1:1 matched; in apparel categories with size and colour combinations this is occasionally off by a few SKUs. |
| Currency | Ours stricter | We filter strictly to GBP DTC. A Shopify store with an EUR or USD storefront on the same backend will see those products excluded from the average. |
| Bundle products | Excluded both sides | Bundles (a single SKU containing multiple sub-items) are excluded from the average because the price comparison is meaningless without unbundling. |
onbuy_xc_dtc_price_gap = AVG((onbuy.price - dtc.list_price) / dtc.list_price) for matched SKUs
The drill-down view shows the per-SKU breakdown ranked by absolute gap; the top of that list is where action concentrates.
Known limitations / merchant FAQs
Should OnBuy be cheaper than my own DTC site? Slightly, yes; the rough rule is OnBuy at -3% to -7% vs DTC list. The reasoning: OnBuy buyers are more price-sensitive than direct buyers, and OnBuy commission (5 to 9%) is lower than DTC effective acquisition cost (often 15 to 25% of price for ad-funded brands), so a small OnBuy discount makes economic sense without cannibalising. The alert fires at -10%, which is the band where cannibalisation typically begins to outweigh the marketplace-native discount logic. Why is the alert on the average, not the worst SKU? Because the action is portfolio-level. A single SKU at -25% might be a deliberate clearance move; the average rising past -10% across the catalogue is a signal that the merchant has structurally repositioned OnBuy as a discount channel. The drill-down view ranks SKUs by absolute gap so the worst offenders are still actionable individually. My OnBuy is more expensive than DTC. Is that bad? No, that is unusually disciplined and usually correlates with low cannibalisation risk. The downside is that OnBuy revenue tops out lower than it could; OnBuy buyers will simply not buy at the higher price. Practical band: between 0% (parity) and +5% (slightly more expensive on OnBuy) is a defensible position for premium brands that do not want OnBuy to undercut DTC perception. My DTC site has frequent promo discounts. Does that affect this card? We compare to DTClist_price, not the active promo price, specifically to insulate this card from short-term promotions. The 7-day stability filter further smooths out brief sales. If a merchant runs a permanent “always 20% off” coupon, they should update the list price to reflect the true selling price and let our card recalibrate; otherwise the card will under-state the real gap.
Does this account for shipping?
No. Both sides use list price excluding shipping. OnBuy buyers pay shipping at checkout (separate from order.amount’s headline number); DTC merchants typically charge shipping or have a free-shipping threshold. The card compares advertised list prices because that is what buyers see and compare. A more sophisticated “delivered cost” view would account for shipping but is not how merchants or shoppers think about it.
My OnBuy gap dropped from -18% to -8%. What probably happened?
Three usual causes, in order of likelihood. (1) The merchant ran a manual repricing on OnBuy (most common, especially after this card flagged the issue). (2) DTC list prices dropped (a Shopify storewide price reduction without OnBuy following). (3) Match-set changed (new SKUs added to OnBuy with different price profile). Open the drill-down to see whether the gap-rank order is similar (cause 1) or has reshuffled (cause 3).
Can I exclude SKUs that are deliberately cheaper on OnBuy (e.g. clearance lines)?
Yes; mark them as “OnBuy-clearance” in the Vortex Mind catalogue settings and they are excluded from the average. The exclusion persists until removed. Use this for end-of-line, distressed inventory, and seasonal closeouts that the merchant deliberately routes through OnBuy at lower margin to clear stock.
Does this card flag DTC subscription pricing differently from one-time purchases?
DTC subscription products typically expose two prices: the one-time price (closer to OnBuy) and the subscribe-and-save price (often 10 to 15% lower). We compare to the one-time price; the subscribe price would distort the comparison since OnBuy does not offer subscription pricing.
How does this interact with Amazon’s Fair Pricing crawler?
Amazon’s crawler watches OnBuy independently of DTC, so this card and onbuy_xc_catalogue_drift work together. The dangerous combination is OnBuy >10% below DTC AND OnBuy >15% below Amazon. That is when the merchant gets MAP-policed by Amazon and cannibalises DTC simultaneously, the worst-case Sunday-night discovery a merchant can wake up to on Monday.