How Shopify Fulfillment Works: An Order’s Path From Checkout to Carrier

Most explanations of Shopify fulfillment stop at “your orders sync automatically.” That sentence covers about nine separate handoffs, and when fulfillment breaks, it breaks at one of them specifically. Knowing which one is the difference between a ten-minute fix and a week of support tickets.

This is the full path, in the order it happens, with the Shopify object names attached. You do not need to write code to use this. You do need to know where the seams are, because the seams are where your customer emails come from.

We run Shopify fulfillment from our Southern California floor, so the second half of this gets specific about what a four-warehouse setup does to the routing logic. Start with the first order.

Step 1: Checkout creates an order, then Shopify picks the location

The moment payment clears, Shopify has to answer one question before anyone touches a box: which location ships this?

If your store has one active location, there is no question. Every order goes there and any routing rules you set do nothing at all. Order routing only runs when you have two or more active locations.

With two or more, Shopify applies a sequence of rules. The default sequence, in this order, is:

#RuleWhat it does
1Minimize split fulfillmentsPrioritises locations holding every item in the order, so it ships in the fewest packages. With no other rule, it favours the location with the most available inventory.
2Stay within the destination marketPrioritises locations in the same market as the shipping address.
3Ship from closest locationPicks the nearest location by straight-line distance, not driving distance. Applied last, as a tiebreaker.

Two optional rules can be added: ranked location groups, and location metafields (a boolean like has_capacity, for example).

The straight-line detail matters more than it sounds. Straight-line distance from a Phoenix shipping address does not care that one of our buildings sits on I-10 and another sits forty minutes off it in traffic. If routing picks oddly, that is usually why.

Step 2: Your 3PL does not receive an order. It receives a fulfillment order.

This is the single most useful thing to understand, and almost nobody explains it.

In Shopify’s data model, an Order is what the customer bought. A FulfillmentOrder is a unit of work assigned to one location. One order can become several fulfillment orders: one per location, and separate ones for separate delivery methods. A checkout containing a shipped item and a local pickup item produces two fulfillment orders, not one.

The legacy workflow, built on the Order and Fulfillment objects, has not been supported since API version 2022-07, and Shopify’s guidance was that every app should be on fulfillment orders by version 2023-07.

Use that when you evaluate providers. If a 3PL describes its Shopify connection as “we listen to the order webhook,” ask what happens when an order splits across two of their buildings. A fulfillment-order-based integration handles it as two assignments. An order-based one has to guess.

Step 3: Shopify notifies the warehouse

A fulfillment service registers a callback URL with Shopify. When you request fulfillment in your admin, Shopify sends a POST to <callback_url>/fulfillment_order_notification.

The payload is almost empty. It carries a single field, kind, with one of two values: FULFILLMENT_REQUEST or CANCELLATION_REQUEST. That is the whole message. The warehouse then queries Shopify back for the assigned fulfillment orders, the shipping address, the line items and the SKUs.

So “real-time push” is a doorbell followed by a pull. The practical effect is the same, and it is fast, but it explains why a provider’s system can be briefly out of step with your admin.

No app install from the Shopify App Store is required for this. That is true of how we connect to your store and true of most direct 3PL connections generally.

Step 4: Accept or reject. The step nobody mentions.

Before a single item is picked, the warehouse has to formally accept the request. This step exists, it is visible to you, and it is where you learn whether your provider employs humans.

ActionFulfillment order statusRequest status
Merchant requests fulfillmentIN_PROGRESSSUBMITTED
Warehouse acceptsIN_PROGRESSACCEPTED
Warehouse rejectsback to OPENREJECTED
Warehouse gives up after acceptingINCOMPLETECLOSED

Accept and reject both carry a free-text message that appears on the fulfillment card in your Shopify admin. Shopify’s own example reject message is a warehouse saying it could not find the product. No fulfillment can be created until the request is accepted, so a stuck order sitting at SUBMITTED means nobody on the warehouse side has looked at it.

That message field is the smallest, most honest test of a 3PL. A good one writes you a sentence. A volume shop sends a status code.

Step 5: Picking, packing, and what a partial shipment actually is

Once accepted, our pick-and-pack operation works the fulfillment order, and each physical box becomes one fulfillmentCreate call with one tracking number. Several boxes means several fulfillments against the same fulfillment order.

Partial fulfillment works by naming specific line items and quantities. Omit the line items and everything remaining on that fulfillment order ships at once.

One constraint is worth memorising, because it shapes your customer’s experience: every fulfillment order included in a single fulfillment must belong to the same order and be assigned to the same location.

Read that plainly. If one order is split across two of our buildings, your customer gets two tracking numbers. There is no configuration, no app and no 3PL on earth that can present that as one shipment. If split shipments are unacceptable for your brand, the fix is inventory placement, not software.

Our cutoff is 2pm Pacific. Orders accepted before then pick, pack and ship the same business day.

Step 6: Tracking goes back, and one flag decides who emails your customer

When the warehouse creates the fulfillment, it attaches trackingInfo: carrier name, tracking number, tracking URL. That pushes straight into the order in your admin.

Sitting next to it is a field called notifyCustomer. It is a true or false flag, and it decides whether Shopify sends your store’s shipping confirmation email. In Shopify’s own documentation example, it is set to false.

This is the most common silent failure in a 3PL integration. Tracking lands correctly, inventory decrements correctly, the order shows as fulfilled, and not one customer gets an email. You find out on day three when support volume doubles.

Ask any provider you are evaluating what they set notifyCustomer to, and whether you can change it per order type. If they do not know the field name, they did not build the integration.

There is a second, slower path. If a fulfillment service enables tracking_support, Shopify polls a /fetch_tracking_numbers.json endpoint once each hour to collect tracking for completed fulfillments. Workable, but an hour behind the direct push.

Step 7: Inventory sync, and why “real time” is a stretch

Here is a thing our industry oversells, including on our own pages.

Inventory moves in two directions and they are not equally fast. When an order ships, the decrement is immediate. Shopify already knows the quantity left the location.

The other direction is slower. When a fulfillment service shares stock levels back to Shopify, Shopify pulls the full inventory picture from a /fetch_stock.json endpoint once every hour. Individual SKUs get fetched when a product is first set up or its SKU changes, but the full refresh is hourly.

So your Shopify stock number is exact at the moment of a sale, and up to an hour stale after a receiving event, a cycle count correction or a restocked return. For most brands that is invisible. If you run flash drops against thin stock, it is not, and you should plan buffer quantities rather than trust the number.

Anyone who tells you inventory is real-time in both directions is describing the sales decrement and calling it the whole system.

One more inventory detail that causes more failed onboardings than anything else on this page: SKU strings are case-sensitive at Shopify. SKU-100 and sku-100 are two different items. If your catalogue has drifted on casing over three years of manual product entry, find out before your inventory arrives, not after.

Returns ride the same clock. Ours get inspected and restocked within 48 hours, and the unit reappears in your Shopify count on the next sync.

Multi-location: four warehouses, how many Shopify locations?

Every fulfillment service you register in Shopify creates exactly one inventory location, and Shopify’s guidance is that each physical warehouse should have its own fulfillment service.

We run four Southern California buildings and 100,000+ square feet. That gives you a real decision to make at setup, and it is not a technical one.

One pooled locationOne location per building
What you see in ShopifyA single stock number per SKUStock per building
Who routesWe do, internallyShopify’s routing rules
Split shipmentsRare, we consolidate before shippingMore common, routing may split
Your admin workloadOne number to watchFour numbers to watch
Best forMost brands under roughly 2,000 orders a monthDeliberate staging, such as bulk in Perris and fast movers in Lake Forest

Our honest default: start pooled. The four-location setup earns its complexity when you are intentionally placing inventory by velocity or by customer geography. Taking it on because it sounds more sophisticated just gives you four stock numbers to reconcile and more split shipments to explain.

You can also keep fulfilling some orders yourself while we handle the rest. Shopify supports stocking the same product at your own location and at a fulfillment service location simultaneously, with routing deciding which one gets the order. If you change an order’s location to your own before requesting fulfillment, the fulfillment service never receives the request at all. Useful during a migration week.

Note for timing: Shopify stated that as of February 2026 all fulfillment services are being migrated to support multi-location inventory management. If you are reading this well after the date at the bottom, confirm the current behaviour before you design around it.

What “1 to 3 business days” actually covers

Our store integration window is 1 to 3 business days. The technical connection is not the long part.

Work
Day 1API credentials exchanged, fulfillment service registered, location created and addressed. Roughly 30 minutes of actual configuration.
Day 1 to 2Your catalogue loads into our warehouse management system. SKU casing audit, bundle and kit definitions, anything that is one listing but several physical items.
Day 2 to 3Carrier and service-level rules per order type, packaging rules, notifyCustomer setting, hold-or-split-ship preference for stockouts. Test order placed and fulfilled end to end.

That is the store connection only. Live orders at volume come at 5 to 7 business days once inventory has arrived and been received. The full onboarding timeline covers the inventory side.

When you should not do this

Four cases where moving Shopify fulfillment to us is the wrong call, including two where a competitor wins outright.

You ship under 100 orders a month. Buy labels in your Shopify admin and pack them yourself. Our invoice minimum is $500 a month, and if your fulfillment charges fall short we bill the difference. At 80 orders a month you are paying a premium for a problem you do not have yet. Come back when packing is eating a full day of your week.

Most of your customers are east of the Rockies. We ship 1 to 2 day ground to California, Arizona and Nevada, covering more than 50 million consumers, and we reach all 48 contiguous states through our carrier network. But a single West Coast node cannot beat a distributed multi-node network on East Coast transit days. ShipBob and ShipMonk run those networks. If your revenue concentrates in New York and Florida, they are the better fit and we will tell you so on the first call.

You run Shopify Plus with an ERP or OMS that already owns routing. In that architecture your 3PL plugs into the middleware, not into Shopify directly, and a provider with a published app and a long Plus track record will cost you less integration time than we will.

You need cold chain or hazmat. We do not handle either. That is a facility and licensing question, not a willingness question.

Frequently asked questions

Do I need to install an app from the Shopify App Store?
No. A fulfillment service connects through the Admin API with a registered callback URL. Your storefront and checkout are untouched.

Will my customers still get my store’s shipping confirmation email?
Yes, provided notifyCustomer is set to true on the fulfillment. That is a configuration choice, so confirm it during setup rather than assuming it.

What happens if one line on an order is out of stock at the warehouse?
Two options, and you choose once rather than per order. The fulfillment order can be placed on hold with the reason inventory_out_of_stock, which is visible in your admin, or available items can ship and the rest follow.

How many tracking numbers will a split order produce?
One per fulfillment. An order split across two locations produces at least two.

Can I cancel an order after you have accepted it?
You can request cancellation and we accept or reject it with a message. Shopify also lets you force-cancel a fulfillment order before the warehouse responds, with a warning that this does not guarantee the items will not ship. If a tote is already at the pack bench, call us. The phone is faster than the API.

Do you support multiple sales channels on the same inventory?
Yes. Shopify, Amazon FBA and FBM, WooCommerce, TikTok Shop, eBay, Walmart, Etsy and BigCommerce, all picking from one pool in our buildings.

Next step

Tell us your monthly order volume, SKU count and where your customers are. We will come back within 24 hours with a quote, and if your order profile says a national network serves you better, that is what the call will say.

Book a 15-minute call to size your fulfillment needs.

Last updated October 2026. Shopify changes API behaviour and admin settings regularly. Verify current specifics in Shopify’s own documentation before building around them.