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

At a glance

Percentage of customers who placed more than one order during the rolling 90-day window. Defined as COUNT(customers WITH 2+ orders in window) ÷ COUNT(customers in window) × 100. Headline retention KPI. Industry-typical: 25-40% for DTC, 50-80% for B2B-leaning Adobe stores.
What it countsThe set of distinct customers who ordered in the period; of those, how many ordered more than once. Aggregated by customer_id for registered customers, by customer_email for guests. B2B Companies are aggregated by company_id if the toggle is enabled.
API fieldcustomer_id, customer_email, extension_attributes.company_attributes.company_id, created_at, entity_id from GET /rest/V1/orders.
In-window vs cohort framingThis is the in-window repeat rate: customers who placed 2+ orders within the 90-day window. Different from cohort retention which asks “of customers who first ordered in March, what % returned by April?”. Both useful; this card is the simpler in-window view.
VAT / tax / shipping / discountsn/a, the card is a customer count ratio.
RefundsA refunded order still counts as an order placed; the customer is still counted.
Cancelled ordersIncluded by default. A customer who placed 1 captured + 1 cancelled order is “2 orders” → repeat. Toggle to exclude cancelled for “captured-only” repeat rate.
B2B Company toggleMany B2B Companies have multiple buyers (head office + branch); aggregating to company_id reveals true Company-level repeat behaviour. Without the toggle, each buyer is counted separately, deflating B2B repeat rate.
Guest dedup caveatGuests with two emails (work + personal, typo) appear as two distinct customers, deflating the rate. Real repeat rate is typically 5-10 percentage points higher than measured.
CurrencyUnitless; no currency.
Multi-store scopeAll Store Views by default. A customer who shops on UK and US Store Views (same email) is counted once across views.
Time window90D rolling. Shorter (30D) under-counts repeat (not enough time to repeat); longer (365D) over-counts (includes churned customers). 90D is the marketing standard.
Alert trigger<25% (Tier-1 retention floor). Below 25% indicates an acquisition-heavy growth pattern with weak retention; over the long term, unsustainable.
Sentiment keyrepeat_rate
Rolesowner, marketing

Calculation

COUNT(orders > 1 by customer_email) / CARDINALITY(customer_email)
  WHERE date BETWEEN [period_start, period_end]

Worked example

A B2B+DTC industrial-supplies merchant on Adobe Commerce 2.4.7. 90-day rolling, 14,420 orders, 9,820 distinct customers/companies (after Company aggregation). Customer-level repeat:
SliceDistinct customers2+ ordersRepeat rate
All customers (Company-aggregated)9,8202,64026.9%
DTC consumers only8,6401,82021.1%
B2B Companies only1,18082069.5%
Wholesale Customer Group (subset of B2B)95074077.9%
VIP Customer Group25023092.0%
Guest checkouts (by email)1,8401106.0%
Excluding cancelled-only customers9,7202,61026.9% (no material change)
Comparison to prior 90 days:
WindowRepeat rateThreshold (25%)
13 Feb to 13 May 2626.9%clean (above)
14 Nov 25 to 12 Feb 2624.2%breached
Change+2.7 ppimproving
Insight pattern:
  1. Headline 26.9% is just above the 25% floor. Healthy for a B2B+DTC mix. Below 25% would have triggered the sentiment alert.
  2. DTC repeat at 21.1% drags the headline down. This is the lever to pull, post-purchase email flows, second-order incentives, replenishment-product subscriptions.
  3. B2B repeat at 69.5% is healthy but should be 80%+ for industrial-supplies (where buyers reorder consumables). The 20-30% non-repeat B2B Companies are either: (a) one-off purchasers, (b) accounts that went silent (cross-link with B2B Account Silence), or (c) accounts that re-routed to a different supplier.
  4. VIP Customer Group at 92% is the loyalty cohort working as designed. Use this as the upper-bound benchmark.
  5. Guest 6% repeat is low because of email-dedup caveat. A guest using multiple emails appears as multiple “1 order” customers. The actual same-person repeat rate among guests is closer to 12-15%; the card under-counts.
  6. Improvement of +2.7 pp over the prior period suggests retention work is landing. Cross-link with klaviyo.flow_revenue_share for email-flow attribution.
  7. Cross-link with Customer Order Frequency for the per-bucket distribution that this rate is the headline of.

Sibling cards merchants should reference together

CardWhy pair it with Repeat Customer Rate
Customer Order FrequencyThe per-bucket distribution this rate summarises.
New CustomersThe first-time-buyer cohort; the conversion-to-repeat target.
Customer CountThe denominator.
Customer TrendCustomer count over time; pair with this card for retention vs acquisition.
B2B Account SilenceB2B-specific retention card; flags the silent accounts.
Churn RiskThe forward-looking version of repeat rate.
Customer SegmentsCustomer Group breakdown.
shopify.repeat_rateCross-platform peer.
klaviyo.flow_revenue_shareEmail-flow attribution; pair to attribute repeat-rate lift.

Reconciling against the vendor’s own dashboard

Where to look in Adobe Commerce Admin:
Reports > Customers > Customers by Number of Orders. Lifetime view of repeat behaviour. Lifetime ≠ in-period; use as a directional check.
For the in-period customer set:
Sales > Orders filtered to the period; export to CSV; group by Customer Email; count distinct emails with 2+ orders. Compare to total distinct emails. Tedious; the card is faster.
For B2B Companies:
Customers > Companies > [Company] > Orders tab for each Company. Manual, only practical for spot-checks.
Why our number may legitimately differ from a manual Admin computation:
ReasonDirection of divergence
Lifetime vs in-period framing. Reports > Customers > Customers by Orders is lifetime; this card is 90D rolling. A customer with 50 lifetime orders but only 1 in the last 90 days is “repeat” lifetime, “new” here.Material difference
B2B Company aggregation. Default in this card is per-Company; Admin doesn’t aggregate.Card higher when toggle is on
Guest dedup. Card aggregates guests by email; multiple emails inflate the unique-customer count.Card under-counts repeat
Cancelled inclusion. Card includes by default; manual count usually excludes.Standard
Time-zone, sync lag. Standard.Minor
Internal identity: repeat_rate = COUNT(customers in period WITH 2+ orders) ÷ COUNT(customers in period) × 100 Component cards (self-consistency): Cross-connector reconciliation (when these connectors are connected for this merchant):
CardExpected relationshipWhat divergence tells you
klaviyo.repeat_segment_sizeKlaviyo’s “2+ orders” segment should match this card’s repeat-customer countMaterial gaps mean the order-event sync from Adobe to Klaviyo has data quality issues.
google_analytics.ga_returning_users_rateGA4 returning-user % is session-cookie based; usually higher than this card (sessions repeat more than orders do)Don’t reconcile directly; treat as directional.

Known limitations / merchant FAQs

My DTC repeat rate is 21%, is that bad? Below the 25% Tier-1 floor, yes. DTC ecommerce typically should run 25-40%. Below 25% suggests acquisition is winning new customers but they’re not coming back, classic “leaky bucket” growth. Investigate post-purchase email flows, second-order incentive thresholds, and product-quality (refund rate, NPS). B2B repeat at 70% but I think it should be higher, why? Two main causes: (1) Companies that went silent (cross-link B2B Account Silence); (2) buyers within a Company who place once-per-quarter, falling outside the 90-day window. For B2B-heavy industrial supply, target 80%+. Use Company aggregation toggle for the right number. Why use 90 days and not 30 or 365? 30 days under-counts repeat (not enough time for a second purchase). 365 days over-counts (includes anyone who bought 11 months ago who may have churned by now). 90 days is the marketing-standard balance for ecommerce. Guest dedup is undercounting my repeat rate, can I fix? Vortex IQ supports identity-resolution as an opt-in feature: matches guests by IP + credit-card-fingerprint + email-similarity to dedupe. Adds 5-10 percentage points to most merchants’ apparent repeat rate. Contact support to enable. Wholesale Customer Group at 78% repeat, should we leave it? B2B Wholesale should approach 90%+ for healthy retention. 78% means ~20% of Wholesale accounts didn’t repeat in 90 days, that’s a churn risk. Cross-link with B2B Account Silence for the at-risk list. A customer placed 1 order, refunded the next day, do they count as 1 or 0 customers? 1 customer (they ordered). They count for 1 in the denominator. If they later return for a 2nd order, they’d count for the numerator (2+ orders). Refund is a creation-time event; this card uses creation-time identity. My multi-store, can I see repeat per Store View? Yes. Filter by store_id. UK and US have very different repeat patterns (UK B2B-heavy, US DTC-heavy in this hypothetical). Why does the rate sometimes go down day-to-day? The denominator includes new customers who are inherently “1 order” until they return. A burst of new acquisition (e.g. a successful PR placement) deflates the rate temporarily. Use 7-day rolling on the rate itself for trend; the underlying retention behaviour didn’t change. Klaviyo says my repeat rate is 35%, this card says 26.9%, gap? Klaviyo computes repeat from placed_order events; if event sync from Adobe to Klaviyo is incomplete, Klaviyo sees fewer customers and inflates the rate. Or Klaviyo uses a different window. The card uses Adobe’s order index directly, more reliable. Cancelled-only customers, are they “real”? A customer who only ever placed cancelled orders (no captured) is debatable. The card includes them by default in the denominator, which slightly deflates the rate. Toggle to exclude for “captured-only” view; usually changes the rate by <1 pp.

Tracked live in Vortex IQ Nerve Centre

Repeat Customer Rate is one of hundreds of KPI pulses Vortex IQ tracks across Adobe Commerce 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.