Skip to main content
Card class: Non-HeroCategory: Ecommerce Platform
Backlog of paid orders aged past the 48h fulfilment SLA. Surfaces 3PL/warehouse breakage in real time.

At a glance

A live count of paid orders that have been sitting in displayFulfillmentStatus IN ('OPEN','UNFULFILLED','IN_PROGRESS') for more than 48 hours since createdAt. The brand-promise alarm: at >20 such orders, customers are about to start emailing.
What it countsCOUNT(orders WHERE displayFulfillmentStatus != 'FULFILLED' AND displayFinancialStatus IN ('PAID','PARTIALLY_PAID') AND now() - createdAt > 48h). Each unfulfilled paid order older than 48h is one count.
VAT / tax treatmentNot applicable, count metric.
ShippingNot applicable; this is about ops pace, not shipping cost.
DiscountsNot applicable.
RefundsExcluded; refunded orders typically transition out of OPEN to RESTOCKED.
Cancelled / voided ordersExcluded (VOIDED is not unfulfilled, customer never paid).
CurrencyMulti-currency safe (count metric).
Channels / sourcesAll channels, but POS auto-marks fulfilled at till and almost never appears here. The metric is effectively online-store + B2B.
Time windowRT (real-time, computed from latest indexed snapshot)
Alert trigger>20 paid orders unfulfilled >48h, configurable per workspace. Thresholds vary by ops capacity (a 3PL doing 1000 orders/day shrugs at 50 backlog; a small in-house team panics at 20).
Sentiment keyfulfillment_rate
Rolesowner, operations

Calculation

Calculated automatically from your Shopify data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A UK skincare DTC brand on Shopify Plus, 3PL in Northampton, normal SLA 24-36h. On Tuesday 14 Apr 26 morning, the alert fires: 47 paid orders unfulfilled >48h. Drill-down shows:
SubsetCountNote
Friday 11 Apr orders not picked18Weekend backlog, expected 8-10
Saturday 12 Apr orders143PL doesn’t pick Sat; expected 0
Sunday 13 Apr orders11Same
Monday 14 Apr orders aged >48h4The new fire, only oldest of Mon’s batch
Total alerted (>48h)47
Trigger reasons:
  1. Weekend backlog overflow. Mon mornings always show some carry-over from weekend. 18 Fri orders unpicked is double the normal 8-10. This means picking didn’t catch up Friday afternoon either, the fire started before the weekend.
  2. 3PL staffing shortfall. Tuesday 14 Apr is post-Easter. Many 3PLs run skeleton crew over UK Easter Monday. The Saturday and Sunday counts (which would be zero on a normal weekend) confirm this. Staffing returns Tue.
  3. Email customers proactively. Customer-service queries about “where is my order?” peak at 72-96h. The brand has 24-48h to email shipping-update apologies before the inbox floods.
  4. Stockout overlay. Cross-reference Products with Zero/Negative Stock. If 5+ of the 47 backlog orders contain a stockout SKU, that subset cannot be fulfilled at all and needs partial-ship or refund-and-replace decisions.
  5. The clock matters. Each hour these orders sit unfulfilled, customer-trust degrades. Shopify’s fulfilment status doesn’t fire customer-facing notifications about delay; the brand has to. Pair with email automation to catch >48h orders proactively.
Recovery shape: typical 3PL-staffing backlog clears in 3-5 working days. The alert count usually falls 30-40% per working day once staff are back, returning to baseline by Thu/Fri.

Sibling cards merchants should reference together

The fulfilment-delay alert is the trigger. The diagnostic cards:
CardWhy pair it with this alert
Fulfillment RateThe trailing 30D ratio. The alert is real-time; the rate is the lag indicator that the alert was right.
Unfulfilled OrdersThe full unfulfilled list (not age-filtered). Use this for the live ops queue.
Fulfillment BreakdownStatus-bucket split. Tells you whether the backlog is OPEN (not started) or IN_PROGRESS (warehouse working).
Products with Zero/Negative StockThe single most common cause of fulfilment delay is a stockout on a high-velocity SKU. Cross-reference.
Cancellation RatePersistent delay drives cancellations. A simultaneous spike in this alert and cancellation rate is a backlog-induced churn signal.
Fulfillment Over TimeTrend chart; catches step-changes a 30D average smooths.
Datadog Incident Count (when connected)If 3PL warehouse alerts in Datadog, this card fires within 24-72h.

Reconciling against the vendor’s own dashboard

Where to look in Shopify Admin:
Shopify Admin → Orders → Filter by Fulfillment status: Unfulfilled AND Date: more than 2 days ago
This filter combination matches the alert population. Save it as a custom view for quick access during incidents. Other Shopify Admin views:
  • Home → “Orders to fulfill” widget: real-time backlog count (all-time, not age-filtered). Shows everything, including <48h fresh orders.
  • Settings → Shipping & delivery → Performance (Shopify Plus only): on-time-delivery analytics; uses promised delivery date, stricter than this alert.
  • Apps like ShipStation / ShipBob / Shippo: their dashboards show pick-and-pack queues, slightly downstream of this alert.
Why our number may legitimately differ from Shopify Admin:
ReasonDirectionWhy
Hour-window precisionEitherShopify’s filter “more than 2 days ago” snaps to 48h precisely from current time; our alert uses the same. Should match within sync-lag tolerance (5-15 min).
Time zoneBoundaryShopify Admin in store time zone; Vortex IQ in UTC. The 48h cutoff lands at slightly different moments.
Test ordersOurs slightly higherShopify Admin can hide test orders. We don’t yet filter Order.test.
Status mappingTheirs higherShopify’s “Unfulfilled” can include PARTIALLY_FULFILLED. We map to the strict-unfulfilled set.
Sync lagOurs lower for “right now”Most-recent 5 to 15 minutes of fulfillment-state changes may not be in.
Cross-connector reconciliation:
CardExpected relationshipWhat causes legitimate divergence
datadog.dd_incident_countIndirect, leading indicatorA 3PL Datadog incident fires hours-to-days before this alert; pair on a single dashboard during ops outages.
zendesk.zd_ticket_volumeLaggingCustomer-service tickets typically rise 24-48h after this alert fires; the magnitude is roughly 5-10% of the alert count.

Known limitations / merchant FAQs

Why is the threshold 48h? 48h is the implicit Shopify ecommerce SLA: customers expect their order to ship within two business days. Beyond 48h, customer-service queries spike sharply. The 48h cutoff is configurable per workspace; brands with explicit longer SLAs (made-to-order furniture, monogrammed gifts) should raise this to 5-7 days. Why is the count threshold 20? A heuristic floor for “actionable backlog”. Below 20, normal day-to-day ops absorbs the queue; above 20, manual intervention is needed. The threshold should scale with order volume:
  • <200 orders/day: alert at 10-15.
  • 200-1,000 orders/day: alert at 20-50.
  • >1,000 orders/day: alert at 100+.
Configurable in Nerve Centre → Alerts → Thresholds. My category has structurally long lead times (made-to-order). Is this card useful? Less directly. For made-to-order, the SLA is your manufacturing lead time, not 48h. Reconfigure to “orders unfulfilled past your SLA”. The alert population is then your true backlog above promised dates. Why does this alert fire on Mondays even when ops are fine? Weekend carry-over. Most 3PLs and in-house warehouses don’t pick Sat-Sun. Friday afternoon orders sit until Monday morning, naturally crossing 48h on Monday. To avoid Mon false-positives, configure the alert to use business hours rather than calendar hours. Does this include B2B / wholesale orders? Yes by default. B2B orders typically have longer fulfilment SLAs (often weeks). Filter B2B orders out of the alert if their long fulfilment is contractually agreed; otherwise they pollute the headline count. What does the action playbook look like?
  1. Open the order list filtered to >48h unfulfilled. Sort by age desc.
  2. Identify the cause subsets: stockouts, 3PL backlog, manual-hold orders, large-volume B2B, etc.
  3. For stockout subset: decide ship-partial, hold-and-wait, or refund-and-relist. Each affects the customer differently.
  4. For 3PL backlog subset: escalate to 3PL ops manager. Request dedicated picker for top-priority orders (often paid express or VIP customers).
  5. For all >48h orders: trigger proactive customer email apologising for delay with realistic shipping ETA. This single action prevents 30-50% of the customer-service tickets that would otherwise come.
  6. Monitor the count hourly during the incident. The count should fall once corrective action is in place.
Why would this alert NOT fire when fulfilment is broken? Three traps:
  1. All weekend orders aged exactly to 47h when alert was checked: not yet over threshold. Vortex IQ runs the check every 5 min, so this gap is rare.
  2. Threshold misconfigured high (e.g. 100): low-volume brands never trip it.
  3. Status-mapping edge cases: orders stuck in SCHEDULED (B2B) or ON_HOLD may not register as unfulfilled depending on the indexer config.
Does cancelling an order clear it from the count? Yes. Cancellation transitions the order out of unfulfilled to VOIDED or RESTOCKED. The count drops in real-time as you cancel. Action playbook for repeated alerts (chronic backlog):
  1. Audit your SLA promise vs your actual capacity. If you promise 48h but consistently deliver 72h, change the promise.
  2. Investigate fulfilment workflow steps for bottleneck (label-print, pick, pack, manifest, dispatch). One stage is usually the bottleneck.
  3. Consider 3PL alternative or expand to multi-3PL routing.
  4. Negotiate weekend coverage if weekend orders are >20% of total.
  5. Build an ops dashboard combining this card, Fulfillment Rate, and warehouse capacity metrics for proactive management.

Tracked live in Vortex IQ Nerve Centre

Fulfilment Delay Alert 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.