Ecommerce order management is the process that takes an order from the moment it is placed to the moment it is delivered, and it is the process most Shopify teams past $3M in revenue have never actually designed — they have inherited whatever Shopify’s default order list gives them. This guide sets it up properly: routing, splitting, named exception statuses and the queue that catches a stuck order before a customer does.
What is ecommerce order management?
Ecommerce order management is the set of decisions and systems that move an order from capture to delivery: which location ships it, whether it splits across shipments, what happens when something goes wrong, and how its status is tracked at every stage. It sits above fulfilment — fulfilment is the physical pick, pack and ship; order management is the decision layer that tells fulfilment what to do and tracks whether it happened.
For a brand doing $3M–$30M on Shopify Plus or a paid subscription platform, the process has usually grown by accident. One location became two. A 3PL got added without anyone revisiting the routing logic. Split shipments started happening because of stock gaps, not because anyone designed for them. The result is an order management process that technically works most of the time and fails silently the rest of the time, because nobody built a vocabulary for the ways it fails.
That vocabulary — a named exception taxonomy — is the proprietary element of this guide: most teams run order management on Shopify’s two visible states, unfulfilled and fulfilled, plus the in-between “partially fulfilled.” None of those three tells you why an order is stuck. This guide replaces that with named states you can route, queue and measure.
What does order management actually cover, end to end?
Order management covers five stages: capture, routing, fulfilment handoff, exception handling, and closeout. Each stage is a place an order can either move forward cleanly or stall.
Capture is the order landing in Shopify with payment confirmed — the starting point this guide assumes, since payment failure and fraud review are a separate problem with their own tooling. Routing decides which location or 3PL fills the order. Fulfilment handoff is Shopify (or your order management layer) telling that location what to pick, pack and ship. Exception handling is everything that deviates from the happy path: a stockout, an address that fails validation, a payment flagged for manual review, a split shipment. Closeout is the order reaching delivered status, or its return/cancellation path completing and reconciling inventory.
Most Shopify teams have capture and fulfilment handoff working fine, because Shopify’s core is built for those two stages. Routing and exception handling are where the setup work in this guide lives, because Shopify’s defaults treat both thinly.
How do you set up order routing across multiple locations?
Order routing decides which location ships each order, and the setup starts with an explicit priority list, not Shopify’s default alphabetical or ID-based ordering.
Go to Settings > Shipping and delivery > Shipping origin in Shopify admin and confirm which locations are eligible to fulfil online orders. Then set a deliberate priority: usually the location closest to the customer with sufficient stock, falling back to the next-closest location with stock, and only falling back to a 3PL or overflow warehouse last if your margins depend on keeping fulfilment in-house where possible.
The setting most teams leave at default is the fallback behaviour when the primary location is out of stock. Shopify’s out-of-the-box behaviour is to hold the order at that location rather than automatically checking the next one, unless you have location priority correctly sequenced or a routing app layered on top. Confirm this by checking an order against a deliberately stocked-out SKU at your top-priority location — if it does not automatically show the next location as fulfilable, your fallback chain is not actually wired up, regardless of what the settings page implies.
For brands running Shopify Plus with more than three fulfilment locations, native location priority gets unwieldy fast, because the priority is set per product rather than globally in a single view. At that scale, a dedicated order routing app or a Shopify Flow-based rule set becomes worth the setup time, specifically because it lets you route on criteria native Shopify doesn’t expose in the routing UI — shipping cost by carrier zone, for instance, rather than just proximity.
How do you handle split shipments without confusing the customer?
A split shipment happens when no single location can fill an entire order, and the setup decision is whether that split happens automatically, or waits for a person to confirm it is worth the extra shipping cost.
Define the split threshold explicitly: for most $3M–$30M brands, the rule is “split automatically if the backordered item’s restock date is more than N days out; otherwise hold the whole order.” That N is a business decision, not a system default — a brand selling apparel with fast restock cycles might set N at three days, while a brand carrying imported goods with six-week lead times might set it at seven, because holding an order for six weeks loses the customer regardless of shipping cost.
Build the rule in Shopify Flow using the order-created or inventory-updated trigger, checking each line item’s location availability and tagging the order split-in-progress when a split is initiated. That tag is what turns a silent shipping decision into something support and ops can see and query — without it, a customer asking “where’s the rest of my order” sends a support agent hunting through fulfilment records instead of reading a status.
Tell the customer proactively when a split happens. An order confirmation or shipping-notification email that says the order will arrive in two shipments, with both tracking numbers, removes the single most common support ticket a split shipment generates: “I only got half my order.”
What is the order-status taxonomy most teams never build?
Shopify ships with three fulfilment statuses — unfulfilled, partially fulfilled, fulfilled — and none of them say why an order is in that state. The taxonomy that actually runs order management well replaces “unfulfilled” with named exception branches:
| Status | What it means | Who owns it |
|---|---|---|
payment-review | Payment flagged for manual review before fulfilment can start | Fraud/payments |
backorder-hold | An item is out of stock at every eligible location | Ops/merchandising |
address-fail | Shipping address failed validation | Customer support |
split-in-progress | Order deliberately split across shipments | Ops (automated + logged) |
ready-to-ship | Order cleared every check, waiting on fulfilment | Warehouse/3PL |
exception-escalated | An exception has sat past its resolution window | Ops lead |
Read this table by owner, not by status name: every row has a named person or team responsible, which is the actual point. A status with no owner is a status nobody checks.
Build these as order tags or a custom metafield, whichever your Shopify plan and app stack support more cleanly. Tags are visible in the default order list and filterable without extra tooling, which makes them the lower-effort starting point even though a metafield-driven system scales better past a few thousand orders a month.
What is the step most teams get wrong?
The step most teams get wrong is treating “unfulfilled” as one state instead of building the exception branches above it — so an order stuck on a genuine problem looks identical, in the default order list, to an order that is about to ship normally within the hour.
The two-state model hides the metric that actually predicts customer complaints: how long an order sits in a named exception, not how many orders are unfulfilled at any given moment. A brand with 200 unfulfilled orders and none of them stuck is healthy. A brand with 40 unfulfilled orders, five of which have sat on address-fail for four days with no owner, is about to get support tickets and negative reviews from those five — and the raw unfulfilled count gives no warning of that.
The fix is mechanical once the taxonomy exists: set a resolution-time threshold per exception type (address-fail escalates after 24 hours, backorder-hold escalates after your stated hold window expires), and wire that threshold to a Shopify Flow notification. The setting most teams skip is putting an explicit number on the threshold rather than leaving it to whoever happens to look at the order list that day.
How do you route exceptions to the right person automatically?
Route each named exception status to an owner using Shopify Flow’s notification actions — Slack message, email, or a task in whatever system your ops team already works from — triggered the moment the tag is applied, not on a batch schedule.
The setting that matters here is timing, not the channel. A daily digest email of exceptions is functionally the same as no routing at all for a time-sensitive status like address-fail, because a customer’s shipping window can close before the digest goes out. Route status-changing exceptions in real time and reserve digest-style summaries for lower-urgency review, like a weekly count of how many orders hit exception-escalated and why.
Assign a single named owner per exception type, not a team inbox. A status routed to “ops@” gets checked when someone has time; a status routed to a named person with a service-level expectation gets checked because it is that person’s job. This is the same principle that makes a payment-recovery dunning sequence work — ownership, not visibility, is what closes the loop.
How do you verify the setup actually works?
Verify it with a test order that deliberately triggers two things at once: a split shipment and a backorder hold. Place a test order for one in-stock item and one item you have manually set to zero inventory across every location, and confirm three things happen — the order tags as split-in-progress and backorder-hold, the assigned owner for each status gets notified, and the customer-facing order status page reflects the split accurately rather than showing a single vague “processing” message.
Run this test after any change to routing rules, not only at initial setup. A Shopify Flow rule that silently stops firing after an app update is a common failure mode, and the only way to catch it before a real customer does is to force the exception conditions yourself on a schedule — monthly is reasonable for most $3M–$30M order volumes.
Who should not build this level of order management?
A brand doing meaningfully under $3M in revenue, selling from a single location with no split-shipment scenarios and rare backorders, does not need a named exception taxonomy — Shopify’s default order list, checked daily, is proportionate to that order volume. Building routing rules and Flow automations for a business that fulfils forty orders a day from one warehouse adds maintenance overhead without a matching payoff. The setup in this guide earns its complexity once locations, SKU count or order volume make a human eyeballing every order impractical, which is typically the case once a brand crosses into multi-location fulfilment or a few hundred orders a day.
Getting order management right is an ops automation problem: it is a set of routing rules, named states and ownership assignments that either run themselves correctly or generate a support ticket, and the difference between the two is almost always in the setup rather than in daily vigilance. Pointerflow’s ops automation work builds exactly this — routing, exception taxonomies and the Shopify Flow logic behind them — for brands where the manual version has stopped scaling.
Sources
No external figures are quoted; this article is written from how Shopify order routing, Shopify Flow and multi-location fulfilment are configured and operated.