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 counts | The 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 field | customer_id, customer_email, extension_attributes.company_attributes.company_id, created_at, entity_id from GET /rest/V1/orders. |
| In-window vs cohort framing | This 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 / discounts | n/a, the card is a customer count ratio. |
| Refunds | A refunded order still counts as an order placed; the customer is still counted. |
| Cancelled orders | Included 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 toggle | Many 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 caveat | Guests 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. |
| Currency | Unitless; no currency. |
| Multi-store scope | All Store Views by default. A customer who shops on UK and US Store Views (same email) is counted once across views. |
| Time window | 90D 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 key | repeat_rate |
| Roles | owner, marketing |
Calculation
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:| Slice | Distinct customers | 2+ orders | Repeat rate |
|---|---|---|---|
| All customers (Company-aggregated) | 9,820 | 2,640 | 26.9% |
| DTC consumers only | 8,640 | 1,820 | 21.1% |
| B2B Companies only | 1,180 | 820 | 69.5% |
| Wholesale Customer Group (subset of B2B) | 950 | 740 | 77.9% |
| VIP Customer Group | 250 | 230 | 92.0% |
| Guest checkouts (by email) | 1,840 | 110 | 6.0% |
| Excluding cancelled-only customers | 9,720 | 2,610 | 26.9% (no material change) |
| Window | Repeat rate | Threshold (25%) |
|---|---|---|
| 13 Feb to 13 May 26 | 26.9% | clean (above) |
| 14 Nov 25 to 12 Feb 26 | 24.2% | breached |
| Change | +2.7 pp | improving |
- Headline 26.9% is just above the 25% floor. Healthy for a B2B+DTC mix. Below 25% would have triggered the sentiment alert.
- 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.
- 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.
- VIP Customer Group at 92% is the loyalty cohort working as designed. Use this as the upper-bound benchmark.
- 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.
- Improvement of +2.7 pp over the prior period suggests retention work is landing. Cross-link with
klaviyo.flow_revenue_sharefor email-flow attribution. - Cross-link with Customer Order Frequency for the per-bucket distribution that this rate is the headline of.
Sibling cards merchants should reference together
| Card | Why pair it with Repeat Customer Rate |
|---|---|
| Customer Order Frequency | The per-bucket distribution this rate summarises. |
| New Customers | The first-time-buyer cohort; the conversion-to-repeat target. |
| Customer Count | The denominator. |
| Customer Trend | Customer count over time; pair with this card for retention vs acquisition. |
| B2B Account Silence | B2B-specific retention card; flags the silent accounts. |
| Churn Risk | The forward-looking version of repeat rate. |
| Customer Segments | Customer Group breakdown. |
shopify.repeat_rate | Cross-platform peer. |
klaviyo.flow_revenue_share | Email-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:
| Reason | Direction 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 |
repeat_rate = COUNT(customers in period WITH 2+ orders) ÷ COUNT(customers in period) × 100
Component cards (self-consistency):
adobe_commerce.customer_countadobe_commerce.order_frequency(sum of “2 orders” + “3-5” + “6-10” + “11+” buckets ÷ total = repeat rate)
| Card | Expected relationship | What divergence tells you |
|---|---|---|
klaviyo.repeat_segment_size | Klaviyo’s “2+ orders” segment should match this card’s repeat-customer count | Material gaps mean the order-event sync from Adobe to Klaviyo has data quality issues. |
google_analytics.ga_returning_users_rate | GA4 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%+. UseCompany 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.