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 endpoint | GET /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 treatment | n/a, count metric. |
| Shipping | n/a. |
| Discounts | n/a. |
| Refunds | Refunded customers still count as customers; their refunds don’t disqualify them from the repeat denominator. |
| Cancelled orders | Excluded from numerator. |
Incomplete orders | Excluded. |
| Currency | n/a. |
| Channel coverage | All 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 behaviour | B2B 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 repeat | A 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 window | 30 days. Prevents replacement orders for same item (broken returns, accidental orders) from inflating the rate. |
| Time window | 90D rolling. |
| Alert trigger | any channel <15%. Cohort thresholds: web 15%, marketplace 5%, B2B 70%, POS 30%. Configure under Settings → Alerts → Channel cohort. |
| Sentiment key | repeat_rate |
| Roles | owner, 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_id | Channel | Orders | Repeat orders | Rate | Cohort target | Status |
|---|---|---|---|---|---|---|
1 | DTC web | 14,200 | 4,260 | 30.0% | 15% (web) | Healthy (2x target) |
1019847 | Amazon | 3,400 | 272 | 8.0% | 5% (marketplace) | Healthy |
12000004 | B2B portal (cafes / offices wholesale) | 240 | 218 | 90.8% | 70% (B2B) | Healthy |
1020114 | POS Cafe Terminal | 22,800 | 14,820 | 65.0% | 30% (POS) | Healthy (regulars) |
1019850 | Facebook Shop | 380 | 18 | 4.7% | 15% (web) | ALERT FIRES |
- 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.
- 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.
- 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.
- 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.
- 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.
- Apply cohort thresholds before reading; web 15%, marketplace 5%, B2B 70%, POS 30%.
- For low-repeat web channels, audit the post-purchase email flow, customer-list growth, retention promotions.
- For Facebook Shop / Pinterest, accept low repeat as structural; optimise for CAC-vs-first-order-margin instead.
- For B2B drift below 70%, contact the affected wholesale customer directly; this is account management, not marketing.
- Pair with BC Top Customers to identify the high-LTV customers driving repeat.
Sibling cards merchants should reference together
| Card | Why pair it with Repeat Customer Rate by Channel |
|---|---|
| BC Top Customers | Identifies the high-LTV repeat customers driving the rate. |
| BC Channel AOV | Repeat-heavy channels often have higher AOV; pair to confirm. |
| BC Guest vs Registered | Repeat customers tend to be registered; the two cards complement. |
| BC Channel Conversion Rate | Repeat customers convert at higher rates; pair to surface the funnel quality. |
| BC Channel Refund Rate | Low-repeat + high-refund = bad customer experience compounding. |
| BC Channel Top Products | Identifies which SKUs drive repeat purchase. |
| BC Orders by Channel | Volume context. |
| Total Revenue | LTV 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:| Reason | Direction |
|---|---|
| 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 |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
klaviyo.kl_repeat_rate_by_segment | Klaviyo’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_rate | GA4 returning user rate at session-level correlates with order-level repeat | GA4 uses cookies; we use customer_id. Cross-device losses in GA4 depress the rate; we capture them. |
stripe.stripe_repeat_charge_rate | Stripe’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. |
customer_id and source_name) and Adobe Commerce (per customer_id and store_id); merchant-facing semantics are equivalent.