Skip to main content
Card class: HeroCategory: Ecommerce Platform
The share of customers in the window who have placed more than one completed order, the single clearest signal of loyalty and retention health.

At a glance

Repeat Customer Rate is the proportion of your customers who have come back to buy again. It is the loyalty number that matters most because winning a repeat order is far cheaper than acquiring a new customer, and a healthy repeat rate is the foundation of predictable revenue. A falling rate is an early warning that something after the first purchase, product, delivery, email, or service, is failing to bring people back. This card reads the rate over a 30-day window against the prior period so you see the direction, not just the level.
What it measuresCustomers with more than one completed order ÷ total customers, expressed as a percentage.
Customer sourceRegistered customers live in oc_customer; orders in oc_order link to a customer (and carry an email for guests).
What counts as “repeat”A customer with two or more completed orders. The completed-order qualifier excludes pending, failed, and cancelled orders from the loyalty signal.
Guest checkoutsOpenCart allows guest orders that may not create an oc_customer record. Repeat detection across guest orders relies on matching email; pure-guest stores will read lower until accounts or email-matching are in play.
Order status filteringOnly completed orders qualify; an order stuck in Pending or one that was Cancelled does not make a customer “repeat”.
Currency / refundsNot applicable to the rate itself. This is a count-based loyalty metric.
Multi-storeCustomers and orders carry a store_id; by default the rate is computed across the whole estate.
Time window30D vsP (30 days against the prior period)
Alert trigger< 25%
Rolesowner, marketing, finance

Calculation

repeat_customers / total_customers * 100
  repeat_customers = COUNT(customers WITH >1 completed order)
  WHERE order date BETWEEN [period_start, period_end]

Worked example

A Dutch coffee-subscription-adjacent store on OpenCart 4.x selling beans and equipment. The 30-day window covers 16 Feb 26 to 17 Mar 26, compared against the prior 30 days. The store added a post-purchase email flow midway through.
SegmentCustomersRepeat (2+ completed orders)Read
Beans buyers (consumable, reorder)1,20054045%, strong
Equipment-only buyers (one-time)800648%, expected for durables
Total2,000604
Repeat Customer Rate (this card)30.2%up from 26.1% prior period
What’s interesting here:
  1. 30.2% clears the 25% alarm, and the trend is the good news. The rate rose from 26.1% to 30.2% across the two windows. The vsP comparison is what turns a static “30%” into “improving”, which is the read the owner actually acts on.
  2. The blended rate masks two very different products. Consumable beans reorder at 45%; one-time equipment sits at 8%. A blended 30% is healthy precisely because the consumable base carries it. If beans loyalty slipped, the equipment drag would expose it fast.
  3. The email flow plausibly drove the lift. The post-purchase flow launched mid-window, and the repeat rate climbed in the same period. The card cannot prove causation, but it is the place the effect of a retention initiative shows up first.
  4. Guest checkouts could be hiding repeats. If the store accepts guest orders, a customer who bought twice as a guest may not be detected as repeat unless emails are matched. The owner encourages account creation partly to make this number trustworthy.

Sibling cards merchants should reference together

CardWhy pair it with Repeat Customer Rate
Total CustomersThe denominator base. Repeat rate is only as meaningful as the customer count behind it.
New Customers (30D)The acquisition counterpart. A flood of new customers can mechanically depress the repeat rate even when loyalty is fine.
Average Order ValueRepeat customers often spend more per order; read the two together to size loyalty’s revenue value.
Newsletter Opt-In RateEmail-engaged customers repeat more; opt-in health is a leading indicator of repeat rate.
Refund RateRefunds erode loyalty; a rising refund rate often precedes a fall here.
High-Value Customers Unengaged on EmailPinpoints the loyal-but-at-risk segment whose churn would hit this rate hardest.

Reconciling against OpenCart

Where to look in the OpenCart admin: Customers → Customers lists registered accounts, the base for the denominator. Reports → Customers → Customer Orders shows orders and totals per customer, which is the closest native view to “who ordered more than once”. Reports → Customers → Customers Online and the Sales reports help you cross-check counts. Each customer’s order history (via Sales → Orders filtered by customer) confirms how many completed orders an account has, which is the qualifier this card uses. OpenCart admin views that look like the same number but aren’t:
  • Customers → Customers total counts all registered accounts, including those who never completed an order, so it is not the denominator of completed-order repeat rate by itself.
  • Reports → Customers → Customer Orders can include all order statuses, not just completed ones; this card counts only completed orders toward “repeat”.
  • A guest-order email appearing twice in the orders list is a repeat purchase, but if no oc_customer account exists, the native customer reports may not link them as one repeating customer.
Why our number may legitimately differ from the OpenCart admin:
ReasonDirection of divergence
Timezone. The window is evaluated in UTC by default; OpenCart timestamps follow the store timezone. Boundary-day orders fall on different sides.±1 day’s orders at the boundary
Multi-store. Customers and orders carry a store_id; the rate is computed across all storefronts unless filtered.Either direction
Guest vs registered. Repeat detection across guests relies on email matching; native reports key on the account record.Card may differ from an account-only report
Completed-only qualifier. This card counts only completed orders as repeat-qualifying; an admin report including all statuses counts more.Card lower than an all-status report
Window definition. “Repeat in the window” depends on how order dates fall in the 30-day period versus a lifetime customer view.Either direction
API / DB sync lag. A second order placed in the last minute may not yet be reflected.Self-resolves at next sync
Cross-connector note: if you run an email platform, its “returning purchaser” or “second-purchase” segment should track this card. A divergence usually means the email tool is keying on a different definition of repeat (any order vs completed order) or is missing guest purchases that OpenCart records by email.

Known limitations / merchant FAQs

Why does my repeat rate drop when I run a successful acquisition campaign? Acquisition adds first-time customers to the denominator faster than they can become repeat. A big new-customer intake mechanically pushes the repeat rate down for a window even though loyalty has not worsened. Read it alongside New Customers (30D) to separate the two effects. Do guest checkouts count as repeat customers? Only if their orders can be matched, usually by email. OpenCart allows guest orders that may not create an oc_customer record, so a customer who bought twice as a guest can read as two separate one-time buyers unless email matching links them. Encouraging account creation makes this number more accurate. What counts as a “repeat” order, exactly? Two or more completed orders by the same customer. Orders stuck in Pending, or that were Cancelled or failed, do not qualify a customer as repeat. This keeps the loyalty signal clean: an abandoned second attempt does not inflate it. Why is my rate lower than my email tool’s “returning customer” figure? The two usually use different definitions. Email platforms often count any second order regardless of status, and may segment differently. This card counts completed orders only and matches OpenCart’s customer and order records. The gap is a definitional one, not an error. Is a low repeat rate always bad? Not for every catalogue. Stores selling durable, one-time goods (furniture, equipment) naturally run lower than consumables or replenishables. Judge the rate against your own category and trend, which is why the card shows 30D vsP rather than an absolute target alone. How can I lift this number? Post-purchase email flows, loyalty incentives, and reliable fulfilment are the usual levers. Watch the rate’s vsP trend after any retention initiative; this card is where the effect surfaces first. Pair it with High-Value Customers Unengaged on Email to target the customers most worth re-engaging. Does it count across all my storefronts? Yes by default. Customers and orders carry a store_id, and the rate is computed across the whole estate unless you filter to one store.

Tracked live in Vortex IQ Nerve Centre

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