Orders fully fulfilled / total orders. <90% means the merchant is breaking shipping promises.
At a glance
The percentage of orders in the period whosedisplayFulfillmentStatusresolved toFULFILLED. The single ops health number, are we shipping the orders we promised, on time?
| What it counts | COUNT(orders WHERE displayFulfillmentStatus = FULFILLED) ÷ COUNT(orders) × 100. Each order is 1 in the denominator regardless of value. |
| What “FULFILLED” means in Shopify | Every line item on the order has a Fulfillment record marked complete. PARTIALLY_FULFILLED (some items shipped, others pending) does NOT count toward the numerator, even if 90% of the order value has shipped. |
| VAT / tax treatment | Not applicable (count metric). |
| Shipping | Not applicable (count metric). The metric measures whether goods physically went out, not the £ paid for shipping. |
| Discounts | Not applicable (count metric). |
| Refunds | A refunded order can still be FULFILLED (you shipped it, then refunded later). Both states are independent in Shopify. So a refunded order CAN count toward this rate’s numerator. |
| Cancelled / voided orders | Excluded from numerator (VOIDED is a separate status), but they sit in the denominator, dragging the rate down. To exclude voids from the denominator, use the fulfilled / non-voided view in Shopify Admin. |
| Pending / open / scheduled | NOT in the numerator. OPEN, IN_PROGRESS, PENDING_FULFILLMENT, SCHEDULED orders all suppress the rate, the metric only credits orders that actually shipped. |
| Currency | Multi-currency safe (count ratio, no FX). |
| Channels / sources | Not filtered. Online Store, POS (which auto-marks fulfilled at checkout), Buy Button, B2B, marketplace channels all contribute. POS orders push the rate UP because they fulfil instantly at the till. |
| Time window | 30D vsP (default 30D vs the prior 30D) |
| Alert trigger | <90%, sustained fulfillment rate below 90% triggers the fulfillment_rate sentiment key |
| Roles | owner, operations |
Calculation
Worked example
A UK skincare DTC brand on Shopify Plus, single 3PL warehouse in Northamptonshire. Period: 14 Mar 26 to 12 Apr 26.displayFulfillmentStatus | Order count | Share | Note |
|---|---|---|---|
FULFILLED | 1,612 | 84.5% | Shipped and tracking-confirmed, this is the numerator |
PARTIALLY_FULFILLED | 78 | 4.1% | Backordered serum SKU, foam cleanser shipped |
IN_PROGRESS | 96 | 5.0% | Pick-and-pack in flight (yesterday’s orders mostly) |
OPEN / UNFULFILLED | 102 | 5.3% | Sat for >24h, the ops red flag |
RESTOCKED | 12 | 0.6% | Customer cancelled before pick |
VOIDED | 8 | 0.4% | Payment voided pre-fulfilment |
| Total orders (denominator) | 1,908 | 100% |
<90% sentiment threshold. Five things to notice:
- The 5.3%
OPENbucket is the operational fire. 102 orders that haven’t even started picking after 24h+. That’s the number a COO can act on tonight, the headline rate is the symptom, not the cause. - Partials matter even though they’re “almost done”. 78 partially fulfilled orders represent customers waiting for the second half of their bundle. Each is a brand promise still in limbo. Pair this card with Line Item Fulfillment for the SKU-level view.
- The cause is usually inventory, not labour. 84% of merchants who breach
<90%for >5 days have a stockout on a high-velocity SKU. Cross-reference Products with Zero/Negative Stock, if the breach SKU is one of the top-50 by revenue, it explains both the partials and the opens. - POS orders flatter the rate. If this brand had a retail outlet on Shop POS doing 200 orders / month auto-fulfilled at the till, the headline would have read closer to 88%. The DTC-only rate is harsher than the blended one. To see the e-commerce-only view, filter by sales channel in Shopify Admin.
- vsP is doing the alerting work. Some categories (made-to-order furniture, monogrammed gifts, drop-ship) operate at structural 60 to 75% rates and that’s healthy for them. Vortex IQ Nerve Centre alerts on the change (8.2 ppt), not the absolute level. The threshold is configurable per workspace.
Sibling cards merchants should reference together
Fulfillment Rate is the headline. The cause lives in these:| Card | Why pair it with Fulfillment Rate |
|---|---|
| Unfulfilled Orders | The numerator-failure count, in real time. The number ops should clear by EOD. If this list is climbing day-on-day, the rate will follow within a week. |
| Fulfillment Breakdown | Segments by status (OPEN, IN_PROGRESS, PARTIALLY_FULFILLED, etc). Tells you which bucket is bleeding. |
| Fulfillment Over Time | Daily / weekly trend. Catches step-changes (a 3PL outage on a specific date) the 30D average smooths out. |
| Products with Zero/Negative Stock | The single most common cause of a fulfillment-rate drop is a stockout on a high-velocity SKU. Pair these and the bottleneck SKU usually surfaces. |
| Cancellation Rate | When stockouts persist, customers cancel rather than wait. A simultaneous fulfillment-rate drop and cancellation-rate rise is a classic backlog-induced churn signal. |
| Line Item Fulfillment | Drills below the order to the line item. Useful when partials dominate and you need to know which line is stuck. |
| Total Orders | The denominator. A spike in orders (sale, viral moment) can crash the rate without anything in ops actually breaking; sanity-check the denominator first. |
Reconciling against the vendor’s own dashboard
Where to look in Shopify Admin: Orders → filter by Fulfillment status: Fulfilled and a date range matching this card. The count of matching orders divided by the total orders in the same date range gives Shopify’s view of fulfillment rate. There isn’t a single dedicated “Fulfillment Rate” tile in Shopify reports; merchants reconstruct it from the Orders list. Other Shopify Admin views that look like the same number but aren’t:- Settings → Shipping & delivery → Performance: Shopify Plus only. Reports on-time delivery against the promised date, a stricter metric than this card. Will read lower.
- Reports → Sales by fulfillment status: a £-revenue split, not a count rate. Useful for understanding £ at risk in unfulfilled, but not directly comparable to this percentage.
- Apps like ShipStation / ShipBob dashboards: those measure 3PL pick-and-pack speed (label-printed-to-shipped). Not the same as Shopify’s
displayFulfillmentStatus, which flips on the Fulfillment record being created. - Home → “Orders to fulfill” widget: a real-time backlog count, not a rate.
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days | Shopify Admin runs in shop time zone; Vortex IQ uses UTC for window boundaries. Orders placed near midnight on the boundary days fall on different sides. |
| Status mapping | Theirs higher | Shopify’s Orders list “Fulfilled” filter typically also catches PARTIALLY_FULFILLED if you’ve enabled the show partials toggle. Vortex IQ counts only fully FULFILLED. To match, use the strict-fulfilled view. |
| Multi-location stores | Either | Shops with multiple fulfillment locations may flip FULFILLED only when the last location ships. If one location is slow and the order is fulfilled-from-multiple, the rate looks worse than the operational reality. |
| Draft / test orders | Ours slightly higher | Shopify Admin can hide test orders. Vortex IQ does not yet filter Order.test. |
| Sync lag | Ours lower for “today” | The index is updated by Shopify webhooks; the most recent 5 to 15 minutes of fulfillment events may not be in yet. Yesterday and earlier are fully caught up. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
datadog.dd_incident_count | Indirect, when 3PL or warehouse systems alert in Datadog, fulfillment rate drops within 24 to 72h | If you’ve connected your warehouse / 3PL monitoring to Datadog, an incident there is a leading indicator for this card. |
shopify_xc_revenue_at_risk_from_incident | Composite, an open incident at a fulfillment partner correlates with a drop in this rate | Pair them on the same dashboard during ops outages. |
Known limitations / merchant FAQs
Why is my Fulfillment Rate dropping? Three usual causes, in order of likelihood:- Stockout on a high-velocity SKU. New orders pile up in
OPENwhile waiting for inventory, the rate falls a few days later. Cross-reference Products with Zero/Negative Stock. If one of your top-50 SKUs is on the list, that’s almost certainly the cause. - 3PL or warehouse incident. A staffing shortage, a system outage, a holiday backup. Look at Fulfillment Over Time for the day-of-week step-change. A weekday drop to 70% then recovery to 92% over 5 days is a classic 3PL-staffing signature.
- Order volume spike. Sale weeks and viral moments crash the rate even if ops did everything right; pick-and-pack throughput is fixed in the short term. Sanity-check Total Orders, if the denominator is up 50%, the rate dropping 5 to 10 ppt is mechanical not a problem.
FULFILLED count toward the numerator. An order with 3 line items where 2 have shipped and 1 is backordered sits in PARTIALLY_FULFILLED and DOESN’T count, even though most of the value is out the door. Use Line Item Fulfillment for the line-level view.
Why does the rate drop on Mondays?
Backlog. Most 3PLs and in-house warehouses don’t pick on Sunday, so all weekend orders move into the IN_PROGRESS bucket on Monday morning. The denominator (orders in window) caught Friday-Sunday volume; the numerator (fulfilled) didn’t catch up until Monday-Tuesday. The Mon-Tue effect is structural and not actionable. The 30D window mostly absorbs it.
Are POS orders counted?
Yes, and they boost the rate. Shop POS orders are FULFILLED at the till (the customer walks out with the goods, the order auto-marks fulfilled). Hybrid retail brands with strong POS volume show artificially high blended rates. The DTC-only view (e-commerce sales channel filter) is the harsher and more operationally useful number.
My subscription store, do recurring billings count?
Yes. Each Shopify Subscriptions order is a separate row with its own fulfillment lifecycle. A monthly box subscription where the box ships within the cycle counts as FULFILLED. A subscription billing where the customer cancels mid-cycle and the box never ships will sit in OPEN then transition to RESTOCKED, dragging the rate down. Subscription-heavy brands typically run 95%+ rates because the goods are pre-packed and ready to go.
B2B / wholesale orders, how do they affect the rate?
Big effect, in both directions. B2B orders are usually scheduled (SCHEDULED status) so they sit in the denominator without contributing to the numerator until they actually ship; this drags the rate down. Conversely, wholesale orders typically ship in batches and flip from OPEN to FULFILLED cleanly, so once a batch goes out the rate jumps. A small number of large B2B orders can move the headline rate by several ppt on their own.
Why is my Shopify Admin “Orders to fulfill” count higher than the unfulfilled-order share implied by this card?
Shopify Admin’s Orders to fulfill widget is a real-time backlog (every order ever placed that isn’t fulfilled, all-time). This card’s denominator is bounded to the 30-day window. So your all-time backlog can be 500 orders while the 30D OPEN/IN_PROGRESS share is only 5%. They measure different things, the widget is for ops urgency, this card is for trend.
Is “FULFILLED” the same as “Delivered”?
No. FULFILLED means a fulfillment record exists in Shopify, typically when the warehouse prints a label and marks the order picked. The parcel may not arrive at the customer for another 1 to 7 days. Carrier-delivery tracking is a separate signal, ShipStation / ShipBob / Royal Mail tracking webhooks. Vortex IQ doesn’t yet ingest delivery confirmations, but they’re on the connector roadmap.
Action playbook when this card alerts:
- Open Unfulfilled Orders. The list is your real-time queue.
- Open Fulfillment Breakdown. Find which bucket is bleeding (
OPENvsIN_PROGRESSvsPARTIALLY_FULFILLED). - Open Products with Zero/Negative Stock. If any high-velocity SKU is OOS, that’s almost certainly the cause.
- Pull the fulfillment-location split in Shopify Admin. If one location is responsible, escalate to that 3PL / warehouse manager.
- If the cause is volume (sale week), email customer-service to extend SLA messaging proactively.
- If the cause is a stockout, decide: ship-partial, hold-and-wait, or refund-and-relist. Each affects Refund Rate differently.