Skip to main content
Card class: Non-HeroCategory: Ecommerce Platform

At a glance

Store-wide gross margin gauge: total gross profit divided by total revenue across all line items over the trailing 30 days, with prior-30 comparison. The single most important profitability signal on the BC dashboard. Where individual brand or product margins live in BC Margin by Brand, this card aggregates everything to one number and fires an alert when it slips below 35%, the floor at which most BC stores are no longer covering their fully-loaded operating costs.
What it counts(SUM(line_revenue_ex_tax) - SUM(line_cost)) / SUM(line_revenue_ex_tax) * 100 over the trailing 30 days, vs prior 30. Cost from cost_price field per SKU; revenue from line items (excluding shipping).
API endpointGET /v3/catalog/products for cost_price per SKU; GET /v2/orders/{id}/products for line revenue. The OpenSearch index materialises per-SKU revenue and cost per day, then aggregates store-wide.
VAT / tax treatmentEx-tax revenue (VAT and sales-tax stripped before margin computation).
ShippingExcluded from both revenue and cost; shipping has its own margin equation.
DiscountsDeducted from revenue side; cost stays the same, so heavy promo periods compress margin.
RefundsNot deducted (gross margin). For net margin including refunds, configure under Settings → Refund handling.
Cancelled ordersExcluded.
Incomplete ordersExcluded.
CurrencyMulti-currency aggregated using daily FX. Cost is in primary currency by convention.
ChannelsAll channels included by default. Per-channel margin would be valuable for B2B-vs-DTC visibility; configure under Settings → Margin scope → Channel filter.
B2B Edition behaviourB2B price-list orders carry lower margin (wholesale price < retail). B2B-active stores see headline margin pulled down 5-15pp from the DTC-only equivalent. Configure DTC-only view to read pure DTC margin separate from B2B.
Cost data qualitycost_price is merchant-maintained in BC; missing values default to zero, inflating margin to 100%. The card warns when cost-data coverage is below 90% of revenue-weighted SKUs. Run a cost-data audit before relying on the margin number.
Promotional cyclesCart-level discounts pro-rate across line items, depressing margin during promo days; expect 3-7pp margin compression on heavy promo days. The card’s 30-day window smooths this; weekly views show more volatility.
Time window30D vsP (rolling 30 days vs prior 30).
Alert trigger<35% (margin pressure). The 35% floor is the BC-ecosystem-wide threshold below which most stores struggle to cover fully-loaded operating costs (3PL, ad spend, payment fees, customer service). Stores with structurally lower-margin assortments (commodity goods, electronics) should configure their own floor.
Rolesowner

Calculation

Calculated automatically from your BigCommerce 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 US specialty foods retailer on BigCommerce Pro with own-label + reseller brands, B2B Edition active. Snapshot for 1 Apr to 30 Apr 26 vs prior 30 days.
MetricCurrent 30DPrior 30DDelta
Revenue (ex-tax)$354,000$341,000+3.8%
Cost (COGS)$185,330$176,200+5.2%
Gross profit$168,670$164,800+2.3%
Gross margin %47.7%48.3%-0.6pp
Alert statusHealthy (above 35% floor)
Decomposition (DTC vs B2B):
CohortRevenueMargin
DTC (web + Amazon + POS)$186,00054.2%
B2B Edition portal$168,00040.5%
Aggregate$354,00047.7%
What’s interesting:
  1. Headline 47.7% (-0.6pp) is healthy and within normal MoM variance. The 35% alert floor isn’t close. The slight compression (-0.6pp) is within the noise band of ±1pp; not yet trend-worthy.
  2. DTC at 54.2% vs B2B at 40.5% = a 13.7pp gap. This is the structural wholesale discount, perfectly normal. The headline 47.7% is the volume-weighted blend of the two cohorts. For DTC-only assessment, read 54.2%; for finance and board reporting, read 47.7%; both are correct at their own scope.
  3. Cost grew 5.2% MoM while revenue grew 3.8%. Cost is outpacing revenue, the leading indicator of margin compression. Investigation: did a key supplier raise prices? Did shipping cost (when included in cost_price as landed cost) increase? Cost growth above revenue growth is the canary; track for two more months before calling it a trend.
  4. The 35% floor is conservative for specialty foods (typical specialty-foods margin 45-60%); a more realistic alert floor for this merchant is 42% (5pp below their typical baseline of 47-50%). Configure category-aware floors under Settings → Alerts → Margin floor.
  5. B2B at 40.5% is healthy for B2B Edition. B2B margins of 35-45% are normal; below 30% suggests over-discounting wholesale; above 50% suggests under-using B2B’s wholesale pricing capability (you’re missing the wholesale-discount opportunity).
Action priority order:
  1. Read alongside BC Margin by Brand to decompose; a 0.6pp headline drop usually traces to one or two brands.
  2. Audit cost-data coverage. If <90% of SKUs have populated cost_price, the headline number is unreliable.
  3. For 2 consecutive periods of margin compression, investigate: supplier price increases, mix shift toward lower-margin SKUs, increased promo density.
  4. Configure category-aware alert floor. The 35% default is a floor for general retail; specialty / premium categories should be 5-10pp higher.
  5. For B2B-active stores, run separate DTC-only and B2B-only margin reads to separate operational signals.

Sibling cards merchants should reference together

CardWhy pair it with Gross Margin
BC Margin by BrandBrand-level decomposition; identifies which brand is moving the headline.
Total RevenueRevenue side of the margin equation.
BC Top SKUs RevenueHero-SKU contribution to overall margin.
BC Top CouponsPromo cycles compress margin.
BC AOV with/without DiscountDiscount-density’s margin impact.
BC Channel Refund RateHigh-refund + thin-margin = bleed.
BC Revenue by BrandVolume context for margin contribution.
BC Revenue by CategoryCategory mix impact on overall margin.

Reconciling against the vendor’s own dashboard

Where to look in BigCommerce Control Panel: BigCommerce does not natively surface gross margin as a single dashboard tile. Reports → Sales (Plus / Pro / Enterprise) shows revenue but cost / margin requires Custom Reports or Insights add-ons. For per-product cost: Products → individual product → Identifiers shows the cost_price field. The lack of native margin reporting is the single most-common reason BC merchants implement Vortex IQ. Why our margin may differ from BC reports / accounting:
ReasonDirection
Cost data freshness. We use whatever cost_price is currently in BC; stale costs inflate margin.Vortex IQ HIGHER (using stale low cost)
VAT / tax handling. We use ex-tax revenue; BC’s reports vary.Vortex IQ MARGIN MATCHES if both ex-tax
Refund treatment. We don’t deduct refunds (gross); accounting does (net).Vortex IQ HIGHER
Currency conversion. Daily FX vs accounting month-end FX.Sub-1% gap
Bundle costs. Bundle parent vs component cost varies.Either direction
Cancelled-order impact. We exclude cancelled; accounting may include reversal entries.Vortex IQ HIGHER
Landed-cost vs FOB. We use whatever’s in cost_price; if you populate FOB only and landed includes freight + duty, accounting will show lower margin.Vortex IQ HIGHER
Cross-connector reconciliation (when accounting integrations are connected):
CardExpected relationshipWhat causes legitimate divergence
netsuite.netsuite_gross_marginNetSuite GL-grounded margin should match within 1-3%NetSuite uses costing method (FIFO, weighted avg); BC’s cost_price is point-in-time.
quickbooks.qb_gross_marginQuickBooks gross margin correlates stronglyQuickBooks accrues COGS at fulfilment; we attribute at order. Timing differences.
xero.xero_gross_marginXero’s GP report should match within 1-2%Xero’s COGS includes some operational costs; we measure pure product cost only.
shipbob.sb_landed_costAdds 3PL fees to COGSConfigure landed-cost mode if your books include 3PL fees in COGS.
The gross margin gauge is BC-aligned with similar cards on Shopify (per cost_per_item) and Adobe Commerce (per cost); merchant-facing semantics are equivalent.

Known limitations / merchant FAQs

My margin reads 100%. Is the brand a gold mine? Almost certainly not. Most likely cause: missing cost_price data. BC defaults the field to zero, so revenue minus zero cost = 100% margin. Audit cost coverage in Products → Inventory by filtering for cost_price = 0. Populate cost data; the margin will normalise. Why is the alert floor 35%? Because most BC stores below 35% gross margin can’t cover their fully-loaded operating costs (3PL ~5-8%, ad spend ~10-15%, payment fees ~3%, customer service ~2%, platform fees ~2-3%). Total operating typically 25-30%; gross margin needs to be at least that plus net profit target. Below 35% gross is structurally hard to be profitable. Configure a higher floor for premium-category stores. My margin reads 47% but my P&L says 38%. Why? Most likely we measure gross margin (revenue minus product cost) while your P&L measures operating margin (gross minus operating expenses). The 9pp gap is your operating cost. Both are correct at their own scope; reconcile by adding operating costs to our gross to land on operating margin. My B2B margin is 40% but DTC is 54%. Should I stop selling B2B? No, don’t confuse gross margin with business value. B2B at 40% gross with 0.51MrevenuemaynetmorethanDTCat540.5-1M revenue may net more than DTC at 54% gross with 0.2M revenue. Compute net margin (gross minus B2B operating costs: sales rep, support, payment terms financing) before making cohort-shutdown decisions. My alert fires on every promo period. Is that wrong? Promo periods compress margin temporarily; the 30-day rolling smooths most of this but heavy promo days can drop the headline below 35% briefly. Configure promo-period silence under Settings → Alerts → Silence calendar to suppress alerts on known promo dates. Should I include shipping in margin? Generally no. Shipping is a separate equation (collected from customer minus paid to carrier). We exclude both shipping revenue and shipping cost. For total-margin including shipping, configure Settings → Margin scope → Include shipping; the headline will shift by 1-3pp. Why doesn’t this card include refunds? Default is gross margin (pre-refund). Refunds are post-fact and have their own cards. Configure net margin under Settings → Refund handling if your finance team prefers net. For most operational decisions gross is the right view; for accounting reconciliation use net. My multi-storefront has different prices per storefront. How does this card aggregate? Default aggregates across storefronts. Configure per-storefront filter for storefront-specific margin (UK premium pricing produces different margin than US discount pricing). Per-storefront margin is the right read for multi-brand merchants running different pricing strategies per market. My cost data is stale; some cost_price values are 18 months old. What’s the impact? If supplier costs increased and you didn’t update BC, your margin reads HIGHER than reality. Run a cost-data refresh quarterly. Most BC merchants have stale cost_price data; this is the single most common cause of margin overstatement. Can I see the alert fire history? Yes, the alert log under Settings → Alerts → History shows when this card crossed the 35% threshold over the past 12 months. Useful for “how often did margin slip into the danger zone?” pattern analysis.

Tracked live in Vortex IQ Nerve Centre

Gross Margin is one of hundreds of KPI pulses Vortex IQ tracks across BigCommerce and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.