Order & fulfillment ops
Auto-sync Shopify orders to your 3PL
Push every paid Shopify order to ShipBob the second it's placed, so nothing waits on a manual upload. We cover order mapping, SKU matching, and what to do when an item isn't in the 3PL catalog yet.
- Shopify
- ShipBob
The manual way today
Someone exports a CSV of the day's paid orders from Shopify, reshapes the columns to match the 3PL's import template, uploads it to the 3PL portal, and then fixes whatever rows the importer kicks back — addresses, SKUs, shipping methods — by hand.
Orders only reach the warehouse in batches, so anything placed after the last upload waits hours to even start shipping. A mistyped SKU or a mangled address column ships the wrong item or nothing at all, and you don't find out until it surfaces as a 'where's my order?' ticket days later.
What running looks like
Every paid, shippable Shopify order lands in ShipBob within about a minute of checkout — mapped, SKU-matched, and with the 3PL's order ID written back onto the Shopify order. The orders that shouldn't auto-ship (a missing SKU, an odd line item) stop and wait for a person instead of shipping wrong.
01The build
How to build it
Subscribe to Shopify's orders/paid webhook
Runs itselfRegister a webhook on the orders/paid topic (Settings → Notifications → Webhooks, or via the Admin API) pointing at an n8n webhook node. Use orders/paid, not orders/create — you only want to fulfill orders money has actually cleared on.
Filter down to genuinely shippable orders
Runs itselfIn n8n, drop anything that shouldn't go to the warehouse: orders tagged hold or pre-order, wholesale/B2B that ships from a different queue, digital-only items, and orders with zero physical line items. Only paid, shippable orders move past this node.
Map the Shopify order to ShipBob's order shape
Runs itselfTransform the payload into what ShipBob's Orders API expects: Shopify order name → your reference ID, the shipping address, the requested shipping method mapped to a ShipBob service level, and the line items. Hold onto the Shopify order ID — you'll write ShipBob's ID back to it later.
Match every SKU to a ShipBob product
Runs itselfFor each line item, look the SKU up against ShipBob's product catalog (Products API) and join on SKU — never on product title, which drifts and isn't unique. A clean SKU match is what lets the warehouse pick the right physical unit.
Hold orders with a SKU the 3PL hasn't seen yet
Needs a humanIf any line item's SKU has no match in ShipBob — a new product, a renamed SKU, a bundle component not set up yet — stop. Post the order number and the unmatched SKU to a Slack channel and do not create a partial order. A human adds the product to the 3PL, then re-runs that one order.
Expand bundles and kits into component SKUs
Runs itselfIf you sell bundles, the 3PL needs the physical components, not the marketing SKU. Keep a bundle → components mapping in a spreadsheet or Airtable and expand each bundle line into its real SKUs before sending, so the warehouse picks every piece.
Create the order in ShipBob and write the ID back
Runs itselfPOST the mapped order to ShipBob's Orders API. Take the ShipBob order ID it returns and write it back onto the Shopify order as a metafield or order note, so you have a two-way link for tracking sync and support lookups later.
Make it idempotent, then reconcile once a day
Runs itselfDedupe on the Shopify order ID so a webhook retry can't create a duplicate 3PL order, and retry transient API errors with backoff before alerting. Once a day, compare paid Shopify orders against orders created in ShipBob and flag any gaps to Slack — that catches the rare miss the webhook drops.
02The stack
What it’s built on
- Shopify
- System of record for orders. Emits the orders/paid webhook and stores the ShipBob order ID written back to each order.
- ShipBob
- The 3PL that physically picks, packs, and ships. Receives the mapped order via its Orders API and exposes a product catalog to match SKUs against.ShipBob's Orders and Products APIs make this wiring clean, so it's an honest pick if you're still choosing a 3PL. The same recipe works with any 3PL that exposes an orders API — only the field mapping changes.
- n8n
- The glue: receives the webhook, filters, maps fields, matches SKUs, calls ShipBob, and runs the daily reconcile.n8n is open-source and self-hostable for free; their cloud tier just saves you running it yourself.
- Slack
- Where unmatched SKUs, hard API failures, and reconcile gaps get flagged for a human.
03Questions
Before you build
Should I trigger on orders/create or orders/paid?
Use orders/paid. orders/create fires before payment clears, so you'd push unpaid, fraudulent, or instantly-cancelled orders to the warehouse. orders/paid only fires once money has actually cleared, which is the right moment to start fulfillment.
What happens when a SKU isn't in my 3PL catalog yet?
The order pauses instead of shipping wrong. The automation posts the order number and the missing SKU to Slack, a person adds the product in ShipBob, and that single order gets re-run. Nothing ships with a guessed or partial match.
How do I match Shopify SKUs to ShipBob products?
Join on the SKU field, not the product title. Titles get edited and aren't unique; SKUs are your stable key. Keep SKUs identical on both sides — if they've drifted, fix that first or maintain an explicit mapping table.
Will a webhook retry create a duplicate order in my 3PL?
Not if you make the flow idempotent. Dedupe on the Shopify order ID before creating anything in ShipBob, so a retried or double-fired webhook recognizes the order already exists and skips it instead of shipping it twice.
Do I still need the manual CSV export?
No — the webhook replaces it for day-to-day flow. Keep the once-a-day reconcile, though: it compares paid Shopify orders to orders created in ShipBob and flags any gaps, so a dropped webhook never quietly leaves an order unshipped.
What about pre-orders, wholesale, or split shipments?
Pre-orders and wholesale get filtered out at the start and handled in their own flows. Split shipments are a 3PL-side concern — ShipBob decides how to box and ships back the tracking, which a separate recipe syncs to Shopify and the customer.
Do I have to use n8n, or will Zapier work?
Zapier or Make will run this too — the logic is the same: catch orders/paid, filter, map, match SKUs, POST to ShipBob. The reason to reach for n8n is cost at volume. Zapier bills per task, and one order can burn several tasks (filter, lookup, create, write-back); at a few hundred orders a day that adds up fast. Self-hosted n8n is flat-cost no matter how many orders run through it.
Can I build this myself, or should you build it?
If you've got API comfort and a few spare hours, build it — every trigger, field mapping, and edge case is spelled out above on purpose. If you'd rather not own the debugging, we'll build it on the Shopify, ShipBob, and n8n accounts you already pay for, document it, and hand it over. You own the workflow outright — no monthly retainer, no platform you can't leave. It starts with a free 20-minute teardown, not a contract.
Related recipes
Order & fulfillment ops
Sync 3PL tracking numbers back to Shopify
When your 3PL ships an order, the carrier and tracking number should land on the Shopify order on their own — and trigger Shopify's shipping-confirmation email. Here's how to wire ShipBob's shipment event back to the order, split shipments and all.
- ShipBob
- Shopify
- n8n
Order & fulfillment ops
Auto-hold orders that fail address verification
Run every paid order's shipping address through a verification API, and if it comes back undeliverable, hold it from fulfillment in Shopify and flag it in Slack — before the warehouse picks it. Clean addresses flow straight through untouched.
- Shopify
- Slack
- n8n
Order & fulfillment ops
Route wholesale orders to a separate fulfillment queue
Wholesale and retail orders land in the same fulfillment queue, so the warehouse picks and packs them the same way — retail packing slip, loose parcels, marketing inserts. Here's how to detect a wholesale order at checkout, tag it, pull it out of the retail flow, and hand it to ShipBob's wholesale lane on its own.
- Shopify
- ShipBob
- Slack
Order & fulfillment ops
Notify customers automatically about fulfillment delays
An order that's paid but hasn't shipped past your promised window is a complaint waiting to happen. Here's how to catch those orders on a schedule, confirm they really are stuck, and fire a proactive Klaviyo heads-up with a real new ETA — before the customer has to ask.
- Shopify
- Klaviyo
- ShipBob