At a glance
Distribution of customers by their order count over the rolling 90 days. Buckets: 1 order, 2 orders, 3-5 orders, 6-10 orders, 11+ orders. Reveals the customer-frequency mix that drives repeat-rate, LTV, and churn calculations. B2B-leaning Adobe stores skew to higher buckets (cadence-driven repeat); DTC apparel stores skew to “1 order” with a long tail.
| What it counts | For each customer (registered or guest aggregated by email), count their orders in the 90-day window. Bucket customers by that count. The distribution shows what percent of customers placed N orders. |
| API field | customer_id, customer_email, created_at from the orders index. Adobe Commerce REST: GET /rest/V1/orders with searchCriteria filter on date range. |
| B2B Company aggregation | When the Adobe Commerce B2B module is enabled, customers can be aggregated by company_id rather than per-buyer. A Company with 4 buyers each placing 5 POs aggregates to 20 orders for the Company. Toggle on the card detail panel. |
| Guest customers | Aggregated by customer_email since guests have no customer_id. A guest using two emails appears twice; this artificially inflates the “1 order” bucket and deflates higher buckets. The most common data-quality caveat for this card. |
| VAT / tax / shipping / discounts / currency | n/a, a count distribution. |
| Cancelled orders | Included in the count by default. A customer who placed 3 orders, one cancelled, two completed, counts as “3 orders” here. Toggle to exclude cancelled for “captured-orders frequency”. |
| Refunds | Refunded orders still count. Refunds happen later; this is creation-time. |
| State filter | All states included by default, including pending_payment and holded. |
| Multi-store scope | Sums across Store Views by default. A customer who shops on both US and UK Store Views (rare) is counted once if they share customer_email. |
| Time window | 90D rolling. Shorter windows (30D) over-emphasise the “1 order” bucket because there’s less time to repeat; longer windows (365D) over-emphasise high-frequency buckets but include churned customers. 90D is the merchant-default for repeat-rate analysis. |
| Alert trigger | None on this card directly. Pair with Repeat Customer Rate for alerting. |
| Roles | owner, marketing |
Calculation
Calculated automatically from your Adobe Commerce 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 B2B+DTC industrial-supplies merchant on Adobe Commerce 2.4.7 with B2B Companies. Snapshot 13 May 26, 90-day rolling. 14,420 orders, 9,820 distinct customers/companies. Per-customer order distribution (rolled up to Company where applicable):| Bucket | Customer/Company count | % of customers | Total orders | % of orders |
|---|---|---|---|---|
| 1 order | 7,180 | 73.1% | 7,180 | 49.8% |
| 2 orders | 1,640 | 16.7% | 3,280 | 22.7% |
| 3-5 orders | 720 | 7.3% | 2,640 | 18.3% |
| 6-10 orders | 200 | 2.0% | 1,490 | 10.3% |
| 11+ orders | 80 | 0.8% | 1,830 | 12.7% |
| Total | 9,820 | 100% | 14,420 | 100% |
| Type | 1 order % | 2 orders % | 3-5 orders % | 6+ orders % | Avg orders / customer |
|---|---|---|---|---|---|
| DTC consumers | 79% | 14% | 5% | 2% | 1.4 |
| B2B Companies | 12% | 18% | 32% | 38% | 5.7 |
- The 73.1% one-time-customer share is dominated by DTC. That ratio is reasonable for an industrial-supplies brand acquiring new buyers; the question is whether they convert into 2nd-time. Repeat Customer Rate should be tracking the conversion of “1-order” → “2-orders” cohort over time.
- The top 12.8% of customers (3-5+ orders) drive 41% of order volume. Not quite Pareto but typical. If you slice by value (
SUM(grand_total)) the concentration is sharper because B2B accounts have higher AOV. - B2B customer profile is dramatically different. 38% of B2B Companies have 6+ orders in 90 days (i.e., monthly+ ordering cadence). The card surfaces this without splitting by type; toggle the Type slice to see it.
- Action implications: (a) the 1-order DTC cohort (7,180 customers) is the acquisition-to-retention conversion target; activate post-purchase email flows, (b) the 80 customers with 11+ orders are the VIP list; tag them in Klaviyo for early access on new products, (c) the B2B “1-order” segment (12% of B2B) is anomalous, B2B accounts should not be one-and-done; investigate whether they are dormant/silent (cross-link with B2B Account Silence).
- Cross-link with Customer Count: total customers = 9,820. Total orders = 14,420. Naive average = 1.47 orders/customer. The distribution shows this average is misleading; 73% of customers placed exactly 1 order, while the top 0.8% placed 23 orders on average.
- Guest aggregation caveat: approximately 22% of orders are guest-checkout. If guests use multiple emails, they inflate the “1 order” bucket. The merchant’s actual repeat-customer rate (after de-duping guests by IP/credit-card-fingerprint, which Vortex IQ does as an opt-in feature) is closer to 31% than the 26.9% shown here.
Sibling cards merchants should reference together
| Card | Why pair it with Customer Order Frequency |
|---|---|
| Repeat Customer Rate | The headline summary. % customers with 2+ orders. |
| New Customers | The “1 order” bucket is mostly first-time buyers. |
| Customer Count | The denominator. |
| Customer Trend | Customer count over time pairs with the per-customer cadence. |
| B2B Account Silence | B2B “1-order” customers are anomalous; cross-check for silence patterns. |
| Top Refunding Customers | High-frequency customers with high refund rate is the fraud pattern. |
| Customer Segments | Adobe Customer Groups (Wholesale, Retail, VIP) pair with frequency for personalisation. |
shopify.order_frequency | Shopify peer. |
klaviyo.frequency_segment | Klaviyo segment of high-frequency customers. |
Reconciling against the vendor’s own dashboard
Where to look in Adobe Commerce Admin:
Reports > Customers > Customers by Number of Orders. The closest native equivalent. Lifetime, not 90-day windowed; aggregates by customer_id (excludes guests entirely). Useful for top-N lifetime buyers, less useful for in-period frequency.
For 90-day windowed:
No native Admin view. The data is inFor Customer Group cohorts:sales_orderkeyed bycustomer_id/customer_email; a merchant would build a custom report or export the orders grid and pivot in a spreadsheet.
Customers > Customer Groups to define groups; Customers > All Customers filtered by group. The card’s frequency-by-Customer-Group slice mirrors this.Why our number may legitimately differ from a manual Admin computation:
| Reason | Direction of divergence |
|---|---|
Guests excluded vs included. The Admin Reports > Customers excludes guests entirely (customer_id IS NULL). This card includes guests aggregated by email. | Card has more “1 order” buckets |
| Window framing. Admin reports are lifetime; this card is 90-day rolling. A customer who placed 50 orders all-time but only 2 in the last 90 days is “11+” in Admin and “2 orders” here. | Card buckets lower than lifetime |
B2B Company aggregation. This card optionally rolls up to company_id; Admin doesn’t. | Card buckets higher when Company toggle is on |
| Email duplication for guests. Same customer, two emails = two rows in the card. Admin’s customer-by-orders excludes guests so doesn’t have this issue. | Card under-aggregates guests |
| Time-zone, sync lag. Standard. | Minor |
| Card | Expected relationship | What divergence tells you |
|---|---|---|
klaviyo.frequency_segment | Klaviyo profiles bucketed by total orders should overlap with this card’s higher buckets | Big differences mean the Adobe-Klaviyo customer sync is incomplete; check the Klaviyo connector’s order-event subscription. |
google_analytics.ga_returning_users | GA4 returning-users approximate the “2+ orders” bucket here | GA4 uses session-cookie-based identity; very different from order-based identity. Don’t reconcile directly; treat as directional. |
Known limitations / merchant FAQs
Why do guests skew the “1 order” bucket? Because guests have nocustomer_id. We aggregate them by customer_email. A guest using two different emails (work + personal) appears as two “1 order” customers, even though it’s the same person on the second order. This artificially inflates “1 order” and deflates “2 orders”. The merchant’s true repeat rate is typically 5-10 percentage points higher than this card shows.
Can I see frequency by Customer Group?
Yes. Adobe Commerce Customer Groups (Wholesale, Retail, VIP, custom) are exposed as a slice on the card. B2B groups will show very different distributions than DTC groups; slice for clarity.
Why is my B2B Company average 5.7 orders but the headline median is 1?
Because the distribution is bimodal. DTC drives the median; B2B drives the average. A single chart hides this. Use the Company-aggregated toggle to see B2B-only median (typically 4-6 in 90 days for healthy B2B).
A customer placed 5 orders, 4 cancelled, do they count as 5 or 1?
Defaults to 5 (state-agnostic count). Toggle the chart to “captured-only” to count just the 1 captured order. Useful for “real” frequency vs “intent” frequency.
Why does the 90-day window matter?
Shorter windows (30D) overstate first-time customers because there’s not enough time for repeat purchases. Longer windows (365D) include churned customers (someone who bought 5 times last year and zero times this year shows as 5+ orders, falsely positive). 90D is the marketing-default for repeat-rate analysis.
Can I see frequency over time?
Use Customer Trend for the rolling counts and New Customers for the first-time-buyer flow. The frequency distribution is a snapshot at the period end.
How do I activate the “1 order DTC” cohort?
Build a Klaviyo segment from the connector: profile property vortex_order_count_90d = 1 AND vortex_customer_type = DTC. Trigger a 14-day post-purchase flow with cross-sell, review request, and a one-time discount on the 2nd order.
My multi-store, can I see per-Store-View frequency?
Yes. Filter the card by store_id. Useful when one store (e.g. UK Black Friday-heavy) has different repeat patterns than another.
Why does today’s number sometimes go down?
It can’t. Order count per customer is monotonically non-decreasing within a window (orders are added, never subtracted in this dimension). What can happen: a customer’s earliest order rolls out of the 90-day window, dropping them from “5 orders” to “4 orders”. This is correct behaviour for rolling-window framing.
Do guest customers really not link to registered accounts?
Adobe Commerce has a “Customer Account Sharing” config and a “Convert Guest to Customer” admin action, but these aren’t automatic. Most guest orders never link to a registered account even if the same email registers later. The card’s per-customer count reflects what’s in sales_order_address.customer_email; merging requires manual intervention or the Vortex IQ identity-resolution feature.