Refunded orders / total orders. Persistent >5% signals product quality or expectation mismatch.
At a glance
The percentage of orders in the period whosedisplayFinancialStatusresolved toREFUNDED. The blunt count-based view of how often money goes back out the door, not how much.
| What it counts | COUNT(orders WHERE displayFinancialStatus = REFUNDED) ÷ COUNT(orders) × 100. Each fully-refunded order counts as 1, regardless of order value. |
| Partial refunds | NOT counted. A £200 order refunded for £40 stays in PARTIALLY_REFUNDED state and does NOT trip this metric. Use Refund Value for the £-leakage view that catches partials. |
| VAT / tax treatment | Not applicable. This is a count ratio, not a money figure. The orders being counted may include or exclude VAT depending on Order.taxesIncluded, but the rate itself is currency-agnostic. |
| Shipping | Not applicable (count metric). The underlying totalPrice includes shipping but it doesn’t affect the rate. |
| Discounts | Not applicable (count metric). |
| Refunds | This IS the refund metric. Only orders flipped to REFUNDED in Shopify count; orders in PARTIALLY_REFUNDED, PENDING, or VOIDED are excluded from the numerator. |
| Cancelled / voided orders | Excluded from the numerator (VOIDED is a separate status), but they DO sit in the denominator, which inflates the denominator and slightly lowers the rate. See Cancellation Rate for the void-side view. |
| Currency | Multi-currency safe, this is a ratio not a sum. A store taking GBP, EUR, and USD orders gets one valid rate. |
| Channels / sources | Not filtered. Online Store, Shop POS, Buy Button, Shop App, TikTok Shop, B2B / wholesale orders all contribute. POS refunds (in-store returns) push the rate up disproportionately for hybrid retail brands; B2B refunds are rare but each one moves the needle on a small-volume wholesale book. |
| Time window | 30D vsP (default 30D vs the prior 30D) |
| Alert trigger | >5%, sustained refund rate above 5% triggers the refund_rate sentiment key |
| Roles | owner, operations |
Calculation
Worked example
A US homewares brand on Shopify Advanced. Period: 12 Mar 26 to 11 Apr 26 (30D), comparing against the prior 30D (10 Feb 26 to 11 Mar 26).| Status (in window) | Order count | Share | Note |
|---|---|---|---|
PAID | 2,140 | 84.3% | Clean orders, no refund activity |
PARTIALLY_REFUNDED | 184 | 7.2% | Damaged-in-transit replacements, partial £ back |
REFUNDED | 192 | 7.6% | Full refunds, this is the numerator |
VOIDED | 22 | 0.9% | Cancelled before payment captured |
| Total orders (denominator) | 2,538 | 100% |
>5% sentiment alert. Five things to notice:
- The £ leakage is bigger than the count suggests. 7.2% of orders are partially refunded, those don’t show in this rate but they’re real cash going back. Always pair this card with Refund Value, which sums
totalRefundedacross all refund states. - The headline number jumped because the denominator shrank. Order count dropped from 2,204 to 2,538 doesn’t explain the spike on its own; the numerator nearly doubled (108 to 192). Something changed.
- Likely cause: a single SKU. Drilling into Top Refunded Products would typically show one or two SKUs accounting for 40 to 60% of refunds. A common pattern for this homewares vertical is a glass / ceramic item arriving broken; the brand replaces (partial) or refunds (full) at the customer’s choice.
- Channel mix matters. If 30% of refunds come from POS returns (customers walking back into the store), the online refund rate is structurally lower than the headline. The card doesn’t split by channel today, but a manual filter in Shopify Admin → Orders by Sales channel gives the same view.
- vsP is the diagnostic, not the headline. A flat 7.6% week-over-week is just “this is the brand’s natural rate.” A sudden jump of >2 ppt is the signal Vortex IQ Nerve Centre is engineered to catch, the alert is calibrated to the change, not the absolute number.
Sibling cards merchants should reference together
Refund Rate is a count ratio. It hides a lot. Pair it with these to make decisions:| Card | Why pair it with Refund Rate |
|---|---|
| Refund Value | The £ view. Catches partial refunds that this card misses. A flat refund rate but rising refund value means partials are growing, possibly a damaged-in-transit pattern. |
| Refund Count | The raw numerator. Useful when order count is shifting fast (sale week, viral moment), the rate can move just because the denominator changed. |
| Top Refunded Products | Tells you which SKUs are driving refunds. 80% of refunds usually come from 20% of SKUs; this card surfaces them. |
| Cancellation Rate | Cousin metric. Cancellations (VOIDED) happen before payment captures; refunds happen after. Both signal customer dissatisfaction but call for different fixes. |
| Total Orders | The denominator. Always sanity-check the denominator before reading the rate, a small-volume week can produce noisy rates from 2 or 3 refunds. |
| Refunds Over Time | Daily / weekly trend. Catches step-changes (a bad batch landing on Monday) that the 30D average smooths out. |
| Stripe Refund Rate | Cross-check against the payment processor. If Stripe’s rate is materially different, the gap is informative (gift cards, manual refunds, COD orders). |
Reconciling against the vendor’s own dashboard
Where to look in Shopify Admin: Reports → Returns over time under the Sales category. Set the same date range you’ve selected here, and look at the Returns count alongside Net sales. The closest one-to-one comparison is Shopify’s own Refund return rate tile in the same report (calculated as returns ÷ orders). Other Shopify Admin views that look like the same number but aren’t:- Home → Average return rate widget: this is a lifetime rolling figure, not a 30D snapshot. It will read lower than this card if your refund rate has been climbing recently.
- Orders → Filter “Refunded”: counts every order ever refunded, not just orders created in the window. Useful for ops, useless for trend reconciliation.
- Reports → Refunds by product: this is a £-value view, not a rate. It pairs with Refund Value, not this card.
- Settings → Returns → Return rate: only available on Shopify Returns Beta accounts; uses a different denominator (fulfilled orders, not all orders).
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days | Shopify reports run in the shop’s configured time zone (Settings → General); Vortex IQ uses UTC for period boundaries. Refunds processed near midnight on the boundary days fall on different sides. |
| Status definition | Theirs higher | Shopify’s Returns over time report counts both REFUNDED and PARTIALLY_REFUNDED as a “return”. Vortex IQ counts only REFUNDED for this rate. To match Shopify’s number, use the Refund Count card and divide by Order Count manually. |
| Multi-currency | Either | If multi-currency selling is enabled, Shopify’s UI reports in shop currency. The rate is currency-agnostic so this rarely causes divergence, but the underlying refund counts can differ if some orders are excluded from one report’s currency filter. |
| Refund-period overlap | Theirs lower | A refund issued on 12 Apr 26 against an order placed on 28 Feb 26. Vortex IQ counts that order as REFUNDED in the period when the order was created (Feb), so the rate goes up retroactively. Shopify’s report can attribute refunds to either order date or refund date depending on the view. |
| Draft / test orders | Ours slightly higher | Shopify Admin can hide test orders. Vortex IQ does not yet filter Order.test. |
shopify.refund_rate = shopify.refund_count ÷ shopify.order_count × 100
These three cards are mathematically tied. If they don’t match it’s a sampling or rounding artefact, not a real disagreement.
Cross-connector reconciliation. Stripe vs Shopify:
stripe.stripe_refund_rate should sit close to this card for stores that route most payments through Stripe / Shopify Payments (which is Stripe under the hood). Expected gaps:
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
stripe.stripe_refund_rate | Stripe ≈ Shopify, often within ±0.5 ppt for Stripe-only stores | Stripe sees only Stripe-routed refunds. PayPal refunds, gift-card returns, manual / COD refunds, and Klarna / Afterpay reversals are invisible to Stripe but counted by Shopify. |
paypal.pp_refund_value | PayPal subset of Shopify | Only PayPal-checkout refunds. Subset by definition. |
refund_count. A persistent gap > 5% means a payment processor is missing from the Vortex IQ workspace, or one is double-counting (rare; usually a misconfigured webhook).
Known limitations / merchant FAQs
Why is my Refund Rate higher than Shopify’s “Average return rate”? The Shopify Home dashboard tile is lifetime (often calculated over all orders ever placed), so it benefits from years of low-refund history pulling the rate down. This card is a 30-day window; recent refund spikes are not yet smoothed out by historical baseline. Use Shopify Admin → Reports → Returns over time with the same date range you’ve selected here for an apples-to-apples reconciliation, not the dashboard tile. Does this card include partial refunds? No. Only orders that flipped fully todisplayFinancialStatus = REFUNDED count in the numerator. Orders sitting in PARTIALLY_REFUNDED are excluded, even if 90% of the order value has been returned. To capture the £-leakage from partials, watch Refund Value which sums totalRefunded across every refund-bearing order regardless of status.
My refund rate spiked but I don’t see a problem in any specific SKU. Why?
Three usual causes that hide at the SKU level: (1) a delivery carrier issue causing damage in transit, look at refund tags / reasons in Shopify Admin; (2) a sizing or expectation gap from a recent ad creative (people bought based on a misleading image), check ad set landing pages; (3) an internal payment-processing glitch where Shopify auto-refunded some duplicate-charge orders, look at Settings → Payments → Activity log. The headline rate moves before any single SKU does.
Why doesn’t the Stripe refund rate match this card?
Stripe sees only Stripe-routed refunds, which is most of your money but not all. PayPal refunds, gift-card returns, manual cash refunds, and Klarna / Afterpay reversals don’t appear in Stripe. Expect Stripe’s refund rate to read slightly LOWER than Shopify’s, often 0.5 to 2 ppt lower depending on PayPal share. A Stripe rate that matches Shopify exactly suggests the merchant runs Shopify Payments only.
Does multi-currency affect the rate?
Not directly, this is a count ratio. But if your store sells across GBP, EUR, and USD, returns from one currency tend to cluster (EU stores see higher refund rates than US for fashion, lower for electronics). Per-currency refund rates are on the roadmap; for now use Shopify Admin’s currency filter to slice manually.
B2B / wholesale orders, do they count?
Yes. Every order in the index contributes to both numerator and denominator. B2B orders are usually low-volume (fewer wholesale buyers than retail), high-value (large basket sizes), and rarely refunded (returns happen via credit-note rather than refund). So they barely move the rate. The exception is a one-time large B2B refund (a single £15,000 wholesale order returned), which on a small-volume week can spike the rate by 2 to 4 ppt on its own.
My subscription store, do recurring billings count?
Yes. Each Shopify Subscriptions billing event is a separate order. Customers cancelling a subscription mid-cycle and receiving a partial pro-rata refund show up in PARTIALLY_REFUNDED (excluded). Customers cancelling within the refund window and getting a full refund show up in REFUNDED (included). Subscription churn that doesn’t trigger a refund (just a future cancellation) is invisible to this card; pair with Churn Risk for that view.
The card says “>5%” alert, is that the right threshold for my industry?
5% is a coarse default for direct-to-consumer brands. Apparel and footwear typically run 15 to 30% even in healthy operations (sizing returns); homewares and consumables run 2 to 5%; electronics 5 to 10%. The threshold is configurable per workspace in Nerve Centre → Alerts. The right number is whatever signals “abnormal for THIS brand”, typically baseline + 2 standard deviations.
Action playbook when this card alerts:
- Open Refund Value and Top Refunded Products, look for SKU concentration.
- Check Refunds Over Time for a step-change date, ties to a specific batch / shipment / ad campaign.
- Pull refund reasons from Shopify Admin → Orders → Refunded. Three most common: damaged in transit, sizing, doesn’t match description.
- If concentrated on one SKU: pause its ads, audit listing photos and copy, talk to the supplier.
- If spread across SKUs but tied to a date: investigate carrier / warehouse / payment-processor incident.
- If spread across SKUs and time: brand-level expectation gap, audit recent creative and merchandising.