> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Fulfillment Rate, Shopify

> Orders fully fulfilled / total orders. &lt;90% means the merchant is breaking shipping promises. How to read it, why it matters, and how to act on it.

**Metrics type:** [Key Metrics](/nerve-centre/overview#metrics-types-explained)  •  **Category:** [Ecommerce Platform](/nerve-centre/connectors#connectors-by-type)

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

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

| `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%** |                                                       |

```text theme={null}
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](/nerve-centre/kpi-cards/shopify/line-item-fulfillment-status) 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](/nerve-centre/kpi-cards/shopify/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:

| Card                                                                                                   | Why pair it with Fulfillment Rate                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Unfulfilled Orders](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/fulfillment-status)                            | Segments by status (`OPEN`, `IN_PROGRESS`, `PARTIALLY_FULFILLED`, etc). Tells you which bucket is bleeding.                                                           |
| [Fulfillment Over Time](/nerve-centre/kpi-cards/shopify/fulfillment-rate-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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/line-item-fulfillment-status)                  | Drills below the order to the line item. Useful when partials dominate and you need to know *which* line is stuck.                                                    |
| [Total Orders](/nerve-centre/kpi-cards/shopify/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](https://admin.shopify.com/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:**

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

**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:

| Card                                                                                          | Expected relationship                                                                             | What causes legitimate divergence                                                                                       |
| --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| [`datadog.dd_incident_count`](/nerve-centre/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`](/nerve-centre/kpi-cards/shopify/revenue-at-risk) | Composite, an open incident at a fulfillment partner correlates with a drop in this rate          | Pair them on the same dashboard during ops outages.                                                                     |

***

<details>
  <summary><em>Same-metric documentation cross-reference (for agencies running multiple platforms)</em></summary>

  The same definition of Fulfillment Rate lives on other commerce platforms. This is **not a reconciliation**, your Shopify store doesn't have a parallel store on BigCommerce or Adobe Commerce to compare numbers against. These cross-links exist so agencies running multi-platform client books can navigate between identical metrics across the docs.

  * [`bigcommerce.fulfillment_rate`](/nerve-centre/kpi-cards/bigcommerce/fulfillment-rate)
  * [`adobe_commerce.fulfillment_rate`](/nerve-centre/kpi-cards/adobe-commerce/fulfillment-rate)
</details>

## 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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/fulfillment-rate-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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/line-item-fulfillment-status) 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](/nerve-centre/kpi-cards/shopify/unfulfilled-orders). The list is your real-time queue.
2. Open [Fulfillment Breakdown](/nerve-centre/kpi-cards/shopify/fulfillment-status). Find which bucket is bleeding (`OPEN` vs `IN_PROGRESS` vs `PARTIALLY_FULFILLED`).
3. Open [Products with Zero/Negative Stock](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/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](https://app.vortexiq.ai/login) or [book a demo](https://www.vortexiq.ai/contact-us) to see this metric running on your own data.
