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

At a glance

Per-channel repeat customer rate over the trailing 90 days, percentage of orders coming from customers who placed at least one prior order on the same channel. The leading indicator of channel health: a channel that converts but doesn’t generate repeat is acquiring expensive one-time buyers. For BigCommerce stores, this card matters more than for Shopify because BC’s B2B Edition produces extreme repeat rates (90%+) that need separating from DTC.
What it counts(orders_from_repeat_customers_90d / total_orders_90d) * 100 GROUP BY channel_id. A “repeat customer” is one whose customer_id placed an order more than 30 days before the current order on any channel. The 30-day cooldown prevents same-week-replacement orders from inflating the rate.
API endpointGET /stores/{store_hash}/v2/orders with customer_id plus GET /v3/customers for first-order-date. The OpenSearch index materialises per-customer-per-channel order history.
VAT / tax treatmentn/a, count metric.
Shippingn/a.
Discountsn/a.
RefundsRefunded customers still count as customers; their refunds don’t disqualify them from the repeat denominator.
Cancelled ordersExcluded from numerator.
Incomplete ordersExcluded.
Currencyn/a.
Channel coverageAll BC channels. POS shows extreme repeat rates (50-80%) for stores with regular-customer flagship traffic. B2B portal shows 90%+ because PO cycles are inherently repeat. Marketplaces show low rates (5-15% on Amazon) because Amazon discourages off-platform customer relationships. Web typically 18-35% depending on brand maturity and category.
B2B Edition behaviourB2B portal repeat is structural; account-based selling is by definition repeat. The card auto-detects B2B and applies a B2B-cohort threshold (typically 70%, fires when below).
Cross-channel repeatA customer who buys on Amazon then on web is a “repeat” by global metric but not per-channel. The default uses per-channel; configure cross-channel-allowed under Settings → Repeat definition for omnichannel reads.
Cooldown window30 days. Prevents replacement orders for same item (broken returns, accidental orders) from inflating the rate.
Time window90D rolling.
Alert triggerany channel <15%. Cohort thresholds: web 15%, marketplace 5%, B2B 70%, POS 30%. Configure under Settings → Alerts → Channel cohort.
Sentiment keyrepeat_rate
Rolesowner, marketing

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 coffee brand on BigCommerce Pro with subscription-friendly DTC web, Amazon Channel Manager, and POS at flagship cafe. Snapshot for 1 Feb to 30 Apr 26 (90-day window).
channel_idChannelOrdersRepeat ordersRateCohort targetStatus
1DTC web14,2004,26030.0%15% (web)Healthy (2x target)
1019847Amazon3,4002728.0%5% (marketplace)Healthy
12000004B2B portal (cafes / offices wholesale)24021890.8%70% (B2B)Healthy
1020114POS Cafe Terminal22,80014,82065.0%30% (POS)Healthy (regulars)
1019850Facebook Shop380184.7%15% (web)ALERT FIRES
What’s interesting:
  1. Facebook Shop alert at 4.7% vs 15% web threshold. The card correctly flags Facebook Shop as a one-time-buyer channel. This is structural for Facebook Shop, the platform attracts impulse buyers who rarely return. The right response isn’t usually “fix repeat rate”; it’s “decide if Facebook Shop is worth running at all given its CAC vs CLV profile”. For this merchant it remained worth running because the per-customer revenue still covered Meta’s ad cost; for many merchants it doesn’t.
  2. DTC web at 30% is excellent for the category. Coffee is structurally repeat-friendly (subscriptions, replenishment cadence) but 30% on a 90-day window means the brand has built a loyal customer base. This is the kind of repeat rate that justifies aggressive new-customer acquisition spend; CLV on web is high enough to absorb $50-100 CAC.
  3. POS at 65% is the regulars rate. The flagship cafe has a regular weekday-coffee crowd; 65% repeat is the structural pattern. POS repeat above 60% is the leading indicator of a healthy local-customer base; below 40% suggests the cafe is mostly tourist / one-time foot traffic.
  4. B2B portal at 90.8% is healthy and structural. The 9.2% non-repeat is new wholesale onboarding; good wholesale channels balance ~10-20% new-account-onboarding with 80-90% repeat to existing accounts. Below 70% suggests the wholesale book is shrinking; above 95% suggests no new-account growth.
  5. Amazon at 8% is fine but not exceptional. Amazon’s customer relationship is mediated by Amazon, not the seller, so repeat is structurally low. For Amazon-heavy stores invest in Amazon Brand Analytics for customer-cohort visibility; you can’t optimise what you can’t see.
Action priority order:
  1. Apply cohort thresholds before reading; web 15%, marketplace 5%, B2B 70%, POS 30%.
  2. For low-repeat web channels, audit the post-purchase email flow, customer-list growth, retention promotions.
  3. For Facebook Shop / Pinterest, accept low repeat as structural; optimise for CAC-vs-first-order-margin instead.
  4. For B2B drift below 70%, contact the affected wholesale customer directly; this is account management, not marketing.
  5. Pair with BC Top Customers to identify the high-LTV customers driving repeat.

Sibling cards merchants should reference together

CardWhy pair it with Repeat Customer Rate by Channel
BC Top CustomersIdentifies the high-LTV repeat customers driving the rate.
BC Channel AOVRepeat-heavy channels often have higher AOV; pair to confirm.
BC Guest vs RegisteredRepeat customers tend to be registered; the two cards complement.
BC Channel Conversion RateRepeat customers convert at higher rates; pair to surface the funnel quality.
BC Channel Refund RateLow-repeat + high-refund = bad customer experience compounding.
BC Channel Top ProductsIdentifies which SKUs drive repeat purchase.
BC Orders by ChannelVolume context.
Total RevenueLTV revenue context for the repeat cohort.

Reconciling against the vendor’s own dashboard

Where to look in BigCommerce Control Panel: Analytics → Customers (Plus / Pro / Enterprise) shows new vs returning customer counts on a daily / weekly cadence; the per-channel decomposition is not natively shown but can be built via Reports → Custom. For B2B-specific repeat: Channel Manager → B2B Edition → Customers shows wholesale account order history. Why our repeat rate may differ from BC’s customer analytics:
ReasonDirection
Repeat definition. We use 30-day cooldown; BC’s analytics defines “returning” as anyone with prior order, no cooldown.Vortex IQ LOWER (excludes same-week replacements)
Per-channel attribution. We attribute repeat per-channel; BC’s analytics is store-wide. A customer who bought on Amazon then on web shows as repeat in BC analytics, not in this per-channel card.Vortex IQ LOWER per-channel; cross-channel mode matches BC
Customer-id matching. We match on email-normalised customer-id; BC matches on customer_id only. Guest checkouts with same email but different orders may be counted as separate customers in BC.Vortex IQ HIGHER (better matching)
B2B vs DTC split. We split B2B by customer-group; BC main analytics aggregates.Different denominators
Window alignment. We use rolling-90; BC uses calendar-quarter or rolling-30.Either direction near boundaries
Cross-connector reconciliation (when CRM and email integrations are connected):
CardExpected relationshipWhat causes legitimate divergence
klaviyo.kl_repeat_rate_by_segmentKlaviyo’s segmented repeat rates align with channel cohorts within 5%Klaviyo’s segments are user-defined; alignment depends on segment configuration.
google_analytics.ga_returning_user_rateGA4 returning user rate at session-level correlates with order-level repeatGA4 uses cookies; we use customer_id. Cross-device losses in GA4 depress the rate; we capture them.
stripe.stripe_repeat_charge_rateStripe’s repeat-customer-charge rate matches web channel within 2-5%Stripe sees only Stripe-paid; multi-gateway stores have additional repeat invisible to Stripe.
The per-channel repeat rate view is BC-aligned with similar cards on Shopify (per customer_id and source_name) and Adobe Commerce (per customer_id and store_id); merchant-facing semantics are equivalent.

Known limitations / merchant FAQs

My Facebook Shop reads 4.7% repeat. Should I shut down Facebook? Not necessarily. Facebook Shop attracts impulse buyers who don’t return; that’s structural to Meta’s commerce surface. The right read is: does Facebook’s CAC + first-order margin still pencil out at this repeat rate? If yes, keep running; if no, reduce or pause. Don’t try to “fix” Facebook repeat rate, the platform doesn’t enable repeat the way email or web ads do. My Amazon repeat is 8% but my web is 30%. Why such a big gap? Amazon mediates the customer relationship; Amazon doesn’t surface customer email to sellers, so you can’t email Amazon buyers to bring them back. Amazon-only customers stay Amazon-only. The 4-5x web/Amazon repeat gap is the BC ecosystem norm; the strategic implication is “use Amazon for new-customer acquisition, web for retention”. My B2B portal at 90.8% sounds great. What would ‘bad’ look like? B2B below 70% is bad, the wholesale book is shrinking (existing accounts not reordering). 95%+ is over-concentrated, you have no new-account growth. The healthy band is 75-90%. B2B repeat rate is more about account management than marketing. My POS at 65% is high but I just opened the cafe. Real? Probably yes. POS repeat ramps fast in cafe / specialty-retail because regulars form within weeks. 65% within the first 90 days suggests strong product-market fit; below 30% on a 90-day-old cafe is a concern. My alert fires every Monday morning. Why? Likely a calendar effect, the 90-day window rolls each day, dropping orders that were 91 days old. If your customer base is heavily weighted toward weekend buyers, the rolling window can produce small Monday dips. Most merchants prefer to read repeat rate weekly rather than daily; configure under Settings → Display → Refresh cadence. My alert is set to 15% but my new brand has only 8% repeat. What should I do? Be patient or tighten the threshold. Repeat rate ramps over the first 90-180 days as customers complete their second purchase cycle. For brands under 6 months old, set alert threshold to 10% to avoid noise; raise to 15% once the brand matures. Cross-channel customers: does buying on Amazon then web count as web-repeat? By default no, the per-channel mode treats each channel separately. Configure cross-channel-allowed mode under Settings → Repeat definition → Allow cross-channel for omnichannel reads. We recommend per-channel default for marketing decisions, cross-channel for finance / customer-LTV reads. My subscription customers should drive high repeat. Are they counted? Yes, every subscription cycle order counts. Subscription-heavy stores typically read 60-80% repeat on web; this is the structural baseline. If your subscription store reads below 50%, the cause is usually subscription churn, not new-customer dilution. Why is the cooldown 30 days instead of 60 or 90? 30 days catches replacement orders (broken returns, accidental orders) that would inflate the rate. 60 / 90 day cooldowns lose meaningful repeat signal (a customer ordering monthly looks like one-time-buyer with 60-day cooldown). 30 is the sweet spot. Configure under Settings → Repeat definition → Cooldown if your category has unusually long replacement cycles (furniture, appliances). My multi-storefront stores have shared customer base. Does the metric aggregate? By default per-storefront. Customers buying across storefronts count as repeat only on the same storefront. Configure cross-storefront-allowed under Settings if you have unified-customer marketing.

Tracked live in Vortex IQ Nerve Centre

Repeat Customer Rate by Channel 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.