Skip to main content
Metrics type: Supporting MetricsCategory: 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.

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. Decomposition (DTC vs B2B): 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

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: Cross-connector reconciliation (when accounting integrations are connected): 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.