Fulfillment models and how they map to Shopify
In Shopify, a “fulfillment model” is the operational choice of who stores inventory, who packs orders, and who buys/prints shipping labels. Shopify represents these choices through locations, inventory assignment, shipping and delivery methods, and (when applicable) fulfillment services/apps that can request and confirm fulfillment.
| Model | Where inventory lives | Who fulfills | How Shopify is configured |
|---|---|---|---|
| Merchant-managed (in-house) | Your warehouse/store | Your team | Locations + inventory at locations + shipping profiles/rates; optional label app |
| 3PL (third-party logistics) | 3PL warehouse(s) | 3PL | Add 3PL location(s); connect via fulfillment service/app or integration; inventory synced to 3PL location |
| Dropshipping | Supplier(s) | Supplier | Supplier locations (often via app); products mapped to supplier; inventory may be “infinite” or synced |
| Local delivery / pickup | Your local store | Your team or courier | Local delivery + pickup settings tied to a location; delivery areas; pickup instructions |
Decision criteria: choosing the right model
Order volume
- Low to moderate volume: in-house is often simplest and cheapest if you already have space and staff.
- Growing volume: 3PL reduces labor and can improve shipping speed via distributed warehouses.
- Highly variable volume (seasonal spikes): 3PL can absorb peaks; dropshipping can avoid capacity constraints but may reduce control.
SKU complexity
- Simple catalog (few SKUs, low pick complexity): in-house or dropshipping can work well.
- Complex catalog (variants, bundles, kitting, lot/expiry): 3PL is often better if they support kitting and inventory rules; in-house works if you have strong processes.
- Multi-location inventory: 3PL or hybrid (store + 3PL) requires careful location priority and split-fulfillment planning.
Margins and cost structure
- High margins: you can afford 3PL pick/pack fees for speed and scalability.
- Thin margins: in-house may be cheaper if labor is efficient; dropshipping can be expensive per unit due to supplier pricing and shipping costs.
- Shipping cost strategy: if you offer free shipping, ensure fulfillment costs (postage + pick/pack) fit your margin model.
Speed requirements and customer promise
- Same-day/next-day: local delivery/pickup or a nearby 3PL location is usually required.
- 2–5 day standard: in-house or 3PL can both meet this depending on carrier pickup and warehouse cutoffs.
- International: 3PL networks or region-specific fulfillment can reduce delivery times and customs friction.
Hands-on setup in Shopify: locations, inventory, and default behavior
Step 1: Configure fulfillment locations
Locations represent physical places where inventory is stocked and from which orders can be fulfilled (warehouse, retail store, 3PL warehouse). Set these up first so inventory and delivery methods can be tied to the correct place.
Create locations: In Shopify admin, go to Settings > Locations and add each place you will fulfill from (e.g., “Main Warehouse”, “Downtown Store”, “3PL East”).
Set address and contact details: Use accurate addresses; carriers and local delivery zones depend on them.
Activate fulfillment capability: Ensure each location is enabled to fulfill online orders (some setups allow a location to be “inventory only”).
Continue in our app.
You can listen to the audiobook with the screen off, receive a free certificate for this course, and also have access to 5,000 other free online courses.
Or continue reading below...Download the app
Step 2: Assign inventory to locations
Inventory assignment determines what Shopify believes is available at each location, which affects order routing and whether Shopify can prevent oversells.
Enable inventory tracking per product: For each product/variant, confirm inventory is tracked (unless you intentionally allow selling without tracking).
Set quantities by location: In the product variant inventory section, allocate stock to the correct location(s). Example: 50 units at “Main Warehouse”, 10 units at “Downtown Store”.
Decide if you will allow backorders: If you enable “continue selling when out of stock,” you are allowing backorders/oversells by design. If you disable it, Shopify will block purchases when inventory reaches zero (per location availability rules).
Step 3: Set default fulfillment behavior (routing and splits)
Default behavior is how Shopify chooses a location when multiple locations have inventory, and whether it splits items across locations.
- Location priority: Set a preferred order of locations so Shopify attempts to fulfill from the best location first (often the one with lowest cost or fastest shipping).
- Split fulfillment policy: Decide whether you will allow orders to split across locations. Splits can improve ship speed but increase shipping cost and customer complexity (multiple packages, multiple tracking numbers).
- Shipping rates and profiles: Ensure shipping profiles/rates align with where inventory ships from. If you use different carriers or packaging rules per location, document them and test with multiple destination addresses.
Practical example (hybrid): You stock bestsellers at the store for local pickup and keep full catalog at the warehouse. Set location priority to fulfill shipped orders from the warehouse, but keep pickup tied to the store location so pickup orders reserve store inventory.
Process maps: who does what in each model
Merchant-managed (in-house) fulfillment process map
| Step | Owner | Action | Shopify touchpoint |
|---|---|---|---|
| Pick | Your team | Pick items from your shelves | Order shows assigned location |
| Pack | Your team | Pack items, add inserts, verify SKU/qty | Optional packing slip print |
| Label | Your team | Buy/print label (Shopify Shipping or carrier tool) | Label purchase/print workflow |
| Handover | Your team/carrier | Carrier pickup or drop-off | Carrier manifest (if used) |
| Tracking update | Your team/system | Add tracking to order | Mark as fulfilled + tracking |
| Customer notification | Shopify | Send shipping confirmation | Notification templates |
3PL fulfillment process map
| Step | Owner | Action | Shopify touchpoint |
|---|---|---|---|
| Order transmission | Shopify/integration | Send order to 3PL system | Fulfillment service/app request |
| Pick & pack | 3PL | Warehouse picks and packs | Status updates via integration |
| Label | 3PL | 3PL buys/prints label per your rules | Carrier + service level mapped in 3PL |
| Ship | 3PL/carrier | Carrier collects from 3PL | Shipment event in 3PL |
| Tracking update | 3PL/integration | Push tracking back to Shopify | Fulfillment confirmation + tracking |
| Customer notification | Shopify | Send shipping confirmation | Triggered when fulfillment is confirmed |
Operational note: Define who is responsible for exceptions (address issues, carrier claims, reships). Even if the 3PL executes, you typically own customer communication.
Dropshipping process map
| Step | Owner | Action | Shopify touchpoint |
|---|---|---|---|
| Order routing | App/merchant | Send order to supplier (manual or automated) | Supplier app or email workflow |
| Pick & pack | Supplier | Supplier packs item(s) | Limited visibility unless integrated |
| Label | Supplier | Supplier prints label | Carrier choice may be constrained |
| Tracking update | Supplier/app/merchant | Tracking returned to Shopify (or added manually) | Fulfillment confirmation + tracking |
| Customer notification | Shopify | Send shipping confirmation | Triggered when tracking is added |
Control point: Ensure supplier SLAs (handling time, packaging, branding, returns address) match your storefront promises.
Local delivery and pickup process map
| Step | Owner | Action | Shopify touchpoint |
|---|---|---|---|
| Order placed | Customer | Select local delivery or pickup | Delivery method at checkout |
| Prepare order | Your team | Pick and pack for delivery/pickup | Assigned to store location |
| Handoff | Your team/courier/customer | Deliver locally or stage for pickup | Local delivery workflow / pickup status |
| Status update | Your team | Mark delivered or ready for pickup | Fulfillment status + pickup notifications |
| Customer notification | Shopify | Send “ready for pickup” or delivery updates | Notification templates |
Hands-on setup: local delivery and pickup
Configure local pickup
Go to Settings > Shipping and delivery.
Under Local pickup, select the store location and enable pickup.
Add pickup instructions (where to go, what ID to bring, pickup hours).
Test checkout to confirm pickup appears only for customers eligible for that location (based on your setup).
Configure local delivery
In Settings > Shipping and delivery, enable Local delivery for the chosen location.
Define delivery area (postal codes or radius) and delivery fee (free, flat, or conditional).
Set delivery expectations (same-day cutoff time, delivery windows).
Decide how you will capture delivery notes (e.g., “gate code”, “leave at door”) and ensure your checkout supports it via order notes or custom fields.
Go-live readiness checklist (all models)
- Locations: All fulfillment locations created with correct addresses and fulfillment enabled.
- Inventory accuracy: Inventory quantities assigned to the correct location(s); spot-check top SKUs.
- Routing rules: Location priority set; split-fulfillment decision documented and tested.
- Shipping methods: Shipping rates reflect real costs and service levels; local delivery/pickup visible only when intended.
- Label workflow: Confirm who prints labels (you vs 3PL vs supplier) and that label format/service levels match your promises.
- Notifications: Shipping confirmation, pickup ready, and delivery updates enabled; templates reviewed for accuracy (sender address, support contact, expected timelines).
- Returns address: Ensure the correct return address is communicated (warehouse vs 3PL vs supplier) and aligns with your policy.
Test order procedure (recommended)
Place a real end-to-end test order (use a low-cost product or a test payment method if available).
Verify location assignment: Confirm the order is assigned to the intended location based on inventory and routing.
Run the fulfillment action: In-house: create label and mark fulfilled. 3PL/dropship: ensure the order is transmitted to the partner system.
Tracking update verification: Confirm tracking appears on the order and in the customer-facing tracking link.
Customer notification checks: Confirm the correct email/SMS is sent, with correct carrier/tracking and support info.
Edge test: Place a cart with items stocked at different locations to confirm split behavior matches your policy.
Exception handling: backorders, oversells, and substitutions
Backorders (selling items not currently in stock)
Backorders can be intentional (preorders/backorder policy) or accidental (inventory mismatch). The key is to control the promise and communicate early.
- Recommended setup: If you accept backorders, explicitly enable “continue selling when out of stock” only for the SKUs you intend to backorder, and add clear lead times on product pages and in order confirmation messaging.
- Operational workflow: Tag orders as “Backorder” and separate them from ready-to-ship orders so they don’t get mixed into daily pick lists.
- Customer communication timing: Notify within 4 business hours (or same day) after the order is placed if the expected ship date differs from what the customer likely assumed at checkout.
Oversells (inventory says available but isn’t)
Oversells usually come from delayed inventory sync (3PL/dropship), multi-channel sales, or miscounts. Treat oversells as a service recovery event.
- Immediate actions: Freeze the SKU (temporarily stop selling), reconcile inventory at the source location, and identify how many orders are impacted.
- Resolution options: Offer (a) wait for restock with a firm date, (b) substitute with an equal-or-better item, or (c) partial shipment + refund for missing items.
- Customer communication timing: Notify as soon as confirmed, ideally within 2–6 hours of discovery, and before any shipping confirmation is sent for that line item.
Out-of-stock substitutions
Substitutions can protect revenue and reduce cancellations, but only if handled transparently and with consent.
- Policy decision: Decide whether substitutions require explicit customer approval. For most brands, approval is recommended unless you sell standardized commodities where substitutions are expected.
- Shopify handling: If substituting a different SKU, ensure the order reflects what is actually shipped (for accurate support, returns, and analytics). Avoid “shipping the substitute but leaving the original SKU on the order.”
- Customer communication timing: Request approval before fulfillment. If time-sensitive (e.g., local delivery), contact immediately and set a response deadline (e.g., “Reply within 60 minutes for same-day delivery”).
Practical communication templates (timing-focused)
| Scenario | When to message | What to include |
|---|---|---|
| Backorder identified | Same day / within 4 business hours | New ship date, option to cancel, support contact |
| Oversell confirmed | Within 2–6 hours of discovery | Apology, options (wait/substitute/refund), expected resolution time |
| Substitution needed | Before label purchase / before marking fulfilled | Photo/description of substitute, price/value assurance, approval request |
Exception prevention controls to implement
- Inventory sync cadence: Ensure 3PL/supplier inventory updates are frequent enough for your sales velocity.
- Safety stock: Keep a buffer (e.g., 2–10 units) for fast-moving SKUs to reduce oversells during sync delays.
- Location discipline: Avoid stocking the same SKU at multiple locations unless you have clear routing rules and cycle counts.
- Cycle counting: Count top sellers weekly (or more) and long-tail SKUs monthly/quarterly.
- Split shipment policy: Decide upfront whether you ship partials or hold until complete; align this with customer messaging and support scripts.