Skip to main content
Card class: HeroCategory: Ecommerce Platform
Orders fully fulfilled / total orders. <90% means the merchant is breaking shipping promises.

At a glance

The percentage of orders in the period whose displayFulfillmentStatus resolved to FULFILLED. The single ops health number, are we shipping the orders we promised, on time?
What it countsCOUNT(orders WHERE displayFulfillmentStatus = FULFILLED) ÷ COUNT(orders) × 100. Each order is 1 in the denominator regardless of value.
What “FULFILLED” means in ShopifyEvery 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 treatmentNot applicable (count metric).
ShippingNot applicable (count metric). The metric measures whether goods physically went out, not the £ paid for shipping.
DiscountsNot applicable (count metric).
RefundsA 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 ordersExcluded 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 / scheduledNOT in the numerator. OPEN, IN_PROGRESS, PENDING_FULFILLMENT, SCHEDULED orders all suppress the rate, the metric only credits orders that actually shipped.
CurrencyMulti-currency safe (count ratio, no FX).
Channels / sourcesNot 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 window30D vsP (default 30D vs the prior 30D)
Alert trigger<90%, sustained fulfillment rate below 90% triggers the fulfillment_rate sentiment key
Rolesowner, operations

Calculation

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

Worked example

A UK skincare DTC brand on Shopify Plus, single 3PL warehouse in Northamptonshire. Period: 14 Mar 26 to 12 Apr 26.
displayFulfillmentStatusOrder countShareNote
FULFILLED1,61284.5%Shipped and tracking-confirmed, this is the numerator
PARTIALLY_FULFILLED784.1%Backordered serum SKU, foam cleanser shipped
IN_PROGRESS965.0%Pick-and-pack in flight (yesterday’s orders mostly)
OPEN / UNFULFILLED1025.3%Sat for >24h, the ops red flag
RESTOCKED120.6%Customer cancelled before pick
VOIDED80.4%Payment voided pre-fulfilment
Total orders (denominator)1,908100%
Fulfillment Rate  =  1,612 ÷ 1,908 × 100  =  84.49%
vs the prior 30D where the rate was 92.7%. The card flags an 8.2 ppt drop and trips the <90% sentiment threshold. Five things to notice:
  1. The 5.3% OPEN bucket 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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:
CardWhy pair it with Fulfillment Rate
Unfulfilled OrdersThe 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 BreakdownSegments by status (OPEN, IN_PROGRESS, PARTIALLY_FULFILLED, etc). Tells you which bucket is bleeding.
Fulfillment Over TimeDaily / weekly trend. Catches step-changes (a 3PL outage on a specific date) the 30D average smooths out.
Products with Zero/Negative StockThe 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 RateWhen 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 FulfillmentDrills below the order to the line item. Useful when partials dominate and you need to know which line is stuck.
Total OrdersThe 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.
Why our number may legitimately differ from Shopify Admin:
ReasonDirectionWhy
Time zoneBoundary daysShopify 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 mappingTheirs higherShopify’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 storesEitherShops 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 ordersOurs slightly higherShopify Admin can hide test orders. Vortex IQ does not yet filter Order.test.
Sync lagOurs 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.
Cross-connector reconciliation: Fulfillment Rate is a Shopify-internal operational metric. It does not have direct counterparts on payment connectors (Stripe, PayPal) because those processors don’t see fulfillment events. The closest cross-connector signal is incident data:
CardExpected relationshipWhat causes legitimate divergence
datadog.dd_incident_countIndirect, when 3PL or warehouse systems alert in Datadog, fulfillment rate drops within 24 to 72hIf 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_incidentComposite, an open incident at a fulfillment partner correlates with a drop in this ratePair 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:
  1. Stockout on a high-velocity SKU. New orders pile up in OPEN while 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.
  2. 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.
  3. 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.
Action: before “fixing” the rate, identify which of the three it is. Each has a different remedy (reorder stock, engage 3PL ops, accept temporary degradation and protect customer comms). Does this card include partial fulfillments? No. Only orders fully 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:
  1. Open Unfulfilled Orders. The list is your real-time queue.
  2. Open Fulfillment Breakdown. Find which bucket is bleeding (OPEN vs IN_PROGRESS vs PARTIALLY_FULFILLED).
  3. Open Products with Zero/Negative Stock. If any high-velocity SKU is OOS, that’s almost certainly the cause.
  4. Pull the fulfillment-location split in Shopify Admin. If one location is responsible, escalate to that 3PL / warehouse manager.
  5. If the cause is volume (sale week), email customer-service to extend SLA messaging proactively.
  6. If the cause is a stockout, decide: ship-partial, hold-and-wait, or refund-and-relist. Each affects Refund Rate differently.

Tracked live in Vortex IQ Nerve Centre

Fulfillment 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.