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

At a glance

The percentage of orders in the period that were cancelled or voided. Cancellation in Shopify means the merchant (or a Shopify automation) marked the order cancelled before fulfilment, distinct from a refund (which acts on a paid, often shipped order).
What it countsCOUNT(orders WHERE cancelledAt IS NOT NULL) ÷ COUNT(orders) × 100. Each order is one in the denominator regardless of value.
API endpointAdmin GraphQL. Order.cancelledAt, Order.cancelReason. The card watches cancelledAt (a timestamp; non-null means cancelled) and surfaces cancelReason (CUSTOMER, FRAUD, INVENTORY, DECLINED, OTHER) for diagnosis.
VAT / tax treatmentNot applicable (count metric).
ShippingNot applicable (count metric).
DiscountsNot applicable (count metric).
RefundsDistinct from cancellation. A cancelled order is usually unpaid or pre-fulfilment; a refund is post-payment, often post-shipment. Some Shopify stores also issue a refund when cancelling a paid pre-shipment order; that order then appears in both Refund Rate and this card.
Cancelled / voided ordersThese ARE the numerator. A VOIDED payment status alone does not flip the order to cancelled; the merchant must explicitly cancel.
CurrencyMulti-currency safe (count ratio, no FX).
Channels / sourcesNot filtered. Online Store, POS, B2B, Buy Button all contribute. POS rarely cancels (the customer walked away with the goods); cancellations skew online.
Cancel reason breakdownCUSTOMER (changed mind), FRAUD (Shopify Protect / manual fraud catch), INVENTORY (oversold, restock), DECLINED (payment authorisation failed post-checkout), OTHER. Each reason needs a different operational response.
Time window30D vsP
Alert trigger>3% (sustained cancellation rate above 3%, or a vsP spike); driven by sentiment_key: cancellation_rate
Rolesowner, operations

Calculation

COUNT(displayFulfillmentStatus=VOIDED) / COUNT(_id)
  WHERE date BETWEEN [period_start, period_end]

Worked example

A US multi-channel home goods brand on Shopify Plus, mid-tier (5,000 to 8,000 orders / month). Period: 12 Apr 26 to 11 May 26.
cancelReasonOrder countShare of cancellationsNote
INVENTORY14247.5%Oversold on the spring drop, app-driven restocks
FRAUD7826.1%Shopify Protect auto-cancellations
CUSTOMER5117.1%Customer requested cancel within 24h
DECLINED227.4%Bank declined post-authorisation (saved card)
OTHER62.0%Manual ops cancellations, no reason logged
Total cancelled299100%
Total orders in window6,840
Cancellation Rate  =  299 ÷ 6,840 × 100  =  4.37%
vs the prior 30D, where the rate was 1.9%. The card flags a 2.5 ppt jump and trips the >3% sentiment threshold. Five things to notice:
  1. The cause is inventory, not fraud or service. 47.5% of cancellations are INVENTORY (oversold). Cross-reference Products with Zero/Negative Stock, the spring drop sold past available count because Continue selling when out of stock was on for high-velocity SKUs. The fix is policy (turn off Continue Selling on top-30 SKUs), not customer service.
  2. Fraud cancellations are rising in absolute count. 78 fraud cancellations vs 30 in the prior period. Shopify Protect tightened its risk model (April 2026 update) so more borderline orders are being auto-cancelled. Check the Shopify Plus Fraud Analysis view; if false-positive rate is climbing, log a Shopify support ticket.
  3. Customer-initiated cancellations are stable. 17% of cancellations from CUSTOMER is a healthy mix. Those are usually buyer’s-remorse within 24 hours; if the share rises above 30%, look at checkout friction (price shock, shipping cost surprise at the final step).
  4. DECLINED is the silent revenue leak. 22 orders authorised at checkout but the bank declined the capture 24 to 48 hours later. Each of these was a “real” customer who never received goods and may not realise the order was cancelled. Pair with Failed / Pending Charges, this is a checkout / payment-method UX issue.
  5. vsP did the alerting. 1.9% in the prior period was healthy; 4.37% trips the threshold. The 30D-vs-prior-30D comparison catches the structural move; a single bad day at 8% would be smoothed away by the 30D average. Tighten the window if you need same-day catch.

Sibling cards merchants should reference together

Cancellations are the canary. Pair with these to find the cause and act on it:
CardWhy pair it with Cancellation RateWhat the combination tells you
Cancelled Over TimeThe daily / weekly trend.Catches step-changes the 30D average smooths out. A spike on a specific day is usually a single root cause.
Refund RateThe post-payment / post-shipment counterpart.Cancellations + refunds together = total order failure rate. Some merchants prefer the combined view.
Products with Zero/Negative StockThe #1 cause of INVENTORY cancellations.A sustained OOS on a top-30 SKU drives oversells which drive cancellations 24 to 72h later.
Fulfillment RateWhen inventory cancellations rise, fulfillment rate drops too.A simultaneous fulfillment dip + cancellation spike is a classic stockout-induced failure.
Financial StatusSurfaces PENDING, AUTHORIZED, VOIDED orders.DECLINED cancellations correlate with a high VOIDED count.
Order CountThe denominator.A 30% volume spike + flat cancellation count = falling rate; flat volume + rising count = real problem.
bigcommerce.cancellation_rateSame definition for agencies running cross-platform.Documentation cross-link.
adobe_commerce.cancellation_rateSame definition for Adobe Commerce stores.Documentation cross-link.

Reconciling against the vendor’s own dashboard

Where to look in Shopify Admin: Orders → filter Status: Cancelled and a date range matching this card. The matching count divided by the total order count for that range gives Shopify’s cancellation rate. There is no single dedicated cancellation-rate tile in Shopify Reports; merchants reconstruct it from the Orders list. Other Shopify Admin views that look similar but are not the same:
  • Reports → Sales by order status: a £-revenue split, not a count rate. Useful for understanding the £ value of cancelled orders.
  • Settings → Shopify Protect: the fraud-cancel subset only. Shows protected vs unprotected orders and the fraud-driven cancel decisions.
  • Apps like Eva.guru, NoFraud: dedicated fraud apps may auto-cancel before Shopify’s cancelledAt is set; the timing on the card and the app dashboard can diverge by minutes.
Why our number may legitimately differ from Shopify Admin:
ReasonDirectionWhy
Time zoneBoundary daysShopify Admin uses store time zone; Vortex IQ uses UTC. Orders cancelled near midnight on the boundary day fall on different sides.
Refund-then-cancel timingEitherSome merchants refund a paid order (within Shopify) and the order is also marked cancelled. This card counts the cancel; Refund Rate counts the refund. The order appears in both. Shopify’s Status: Cancelled filter shows it once.
Test ordersOurs slightly higherThe card does not yet filter Order.test = true. If you cancel test orders frequently they inflate the rate.
Multi-storePer-storeEach Shopify store is a separate integration; the card runs per store. A merchant with 3 stores has 3 cancellation rates.
Sync lagOurs lower for “today”Webhooks fire within seconds but the OpenSearch index can lag by 5 to 15 minutes. Cancellations made in the last few minutes may not show.
Shopify Plus reasonsExtra granularityShopify Plus stores expose a richer set of cancelReason values (e.g. STAFF, DECLINED_BY_BANK); basic plans see fewer. The rate is the same; the breakdown differs.
Cross-connector reconciliation:
CardExpected relationshipWhat causes legitimate divergence
stripe.failed_chargesDECLINED cancellations correlate with Stripe failed-capture eventsSome failed Stripe captures do not result in cancellations (the merchant may retry the charge); not all DECLINED cancels are Stripe (PayPal, Klarna, AfterPay can also decline post-authorisation).
paypal.paypal_disputesA subset of fraud cancellations correlate with PayPal disputesDisputes can also be raised on shipped (non-cancelled) orders; not 1:1.

Known limitations / merchant FAQs

Why is my cancellation rate spiking? Three usual causes, in order of likelihood:
  1. Inventory oversells. Continue selling when out of stock is on for high-velocity SKUs and they are running into negative stock. Cancellations follow within 24 to 72 hours when the merchant catches up. Cross-reference Products with Zero/Negative Stock.
  2. Fraud filter tightening. Shopify Protect or a fraud app raised its risk threshold. More borderline orders are being auto-cancelled. Check the fraud-cancel reason share.
  3. Bank declines on saved cards. A bank-side fraud alert or expired saved cards on a re-engagement campaign can produce a spike of DECLINED cancellations days after checkout.
Action: identify which cancelReason jumped most. Each has a different remedy. Is a cancellation the same as a refund? No. A cancellation flips cancelledAt on the order before fulfilment; the goods never ship. A refund moves money back to the customer, usually after the goods have shipped (or, less commonly, on a paid-but-not-yet-shipped order). Some workflows do both, mark cancelled and issue a refund, in which case the order shows in both this card and Refund Rate. Why is my POS cancellation rate near zero? POS orders are paid and goods-handed-over in the same moment. Cancellation post-checkout is rare. Online-store cancellation rates are 5 to 20× higher than POS; do not benchmark POS-heavy stores against pure-DTC peers without filtering channels. Multi-currency, does this affect the rate? The rate itself is currency-blind (count over count). The cancel-reason mix can vary by currency / region; e.g. the EU has stronger consumer-protection laws and may produce more CUSTOMER-initiated cancellations within the 14-day cooling-off window. The rate is consistent across currencies; benchmarks differ by region. Shopify Plus vs basic, any difference? Plus stores get richer cancelReason values (STAFF, DECLINED_BY_BANK, INVENTORY_NOT_AVAILABLE) and can build automated cancel-on-fraud-flag rules via Flow. Basic stores see the standard 5-reason enum. The card behaves identically; the diagnostic granularity differs. Refresh cadence? Webhooks fire within seconds; the OpenSearch index updates within 5 to 15 minutes. The 30D rolling window updates each ingest cycle. The card is suitable for daily standup but not real-time incident triage; for the latter, watch the Shopify Admin Orders list directly. Is 3% a good threshold? Industry-typical DTC apparel runs 1 to 2.5%. Multi-channel stores run 2 to 4% (because some channels increase cancel risk). B2B can run 5% or higher (large orders, complex specs, frequent change-of-mind). Set the threshold to 1.5× your trailing 12-week median; that catches genuine moves rather than seasonal noise. B2B vs DTC, does the card behave differently? Yes. B2B orders are larger, more often quoted-and-amended pre-fulfilment, and have higher legitimate cancel rates as the buyer’s procurement process changes. A B2B store running at 5 to 8% structural cancellation is not a problem; the same rate on a DTC store is. Filter by B2B tag if your store mixes both, but Shopify’s Order index does not yet expose tags to Vortex IQ; for now, this is a manual mental adjustment. The card moved this week, what should I do?
  1. Open Cancelled Over Time. Find the day the rate spiked.
  2. Pull that day’s cancelled orders in Shopify Admin. Look at the cancelReason mix.
  3. If INVENTORY dominates: open Products with Zero/Negative Stock, turn off Continue Selling on the affected SKUs.
  4. If FRAUD dominates: review the Shopify Protect decisions; raise a support ticket if false-positives are climbing.
  5. If DECLINED dominates: look at payment-gateway logs (Stripe / PayPal). Check whether saved cards expired or a bank issued a fraud-decline pattern.
  6. Email customer-service to extend SLA messaging proactively for cancelled customers.

Tracked live in Vortex IQ Nerve Centre

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