The Problem
James runs a direct-to-consumer skincare brand that sells through Shopify. For the first two years, volume was low enough that manually forwarding orders to their third-party logistics (3PL) provider wasn't a big deal. A few minutes in the morning, a few minutes after lunch. Manageable.
Then the brand had a good quarter. Then a better one. By the time they came to us, they were processing roughly 500 orders per month — about 17 per day on average, with spikes to 40+ after promotions. The ops team was spending 3–4 hours a day logging into Shopify, extracting order details, and re-entering them into the 3PL's web portal.
"We do the same copy-paste maybe fifteen times a day," their ops lead told us. "Name, address, SKUs, quantities. Every. Single. Order. One wrong digit and the wrong product ships to the wrong person. We've had that happen twice."
The 3PL had an API. Shopify had webhooks. There was absolutely no reason a human should have been in the middle of this — but nobody had time to fix it.
What They Actually Needed
The brief was simple once we mapped it out:
- New paid Shopify order → automatically push to the 3PL API within minutes
- Handle SKU mapping (Shopify product IDs ≠ 3PL warehouse codes)
- Flag anything unusual — out-of-stock, unknown SKU, address anomalies — to Slack without stopping the flow
- Update the Shopify order with the 3PL's tracking number once it ships
- Zero manual steps for routine orders
Importantly: they didn't want a new dashboard to watch. They wanted to not think about it.
What We Built
The full automation runs on n8n and covers the complete order lifecycle — from Shopify webhook to tracking number written back on the order:
The SKU mapping step was the most important piece. The brand's Shopify variants use internal naming conventions; the 3PL's warehouse system uses entirely different codes. We built a simple Google Sheet that maps one to the other — the ops team can update it themselves when new products launch, no code required.
The validation step checks three things: does the mapped SKU exist in the 3PL's catalog, does the delivery address pass a basic format check, and is the product currently marked as in-stock at the warehouse. If anything fails, the order gets flagged to a Slack channel with a direct link — someone handles the exception manually. Everything else flows through untouched.
The tracking sync runs as a separate scheduled workflow. Every two hours it polls the 3PL for new shipment tracking numbers and writes them back to the corresponding Shopify order, which triggers Shopify's built-in customer shipping notification email. The brand doesn't send tracking emails themselves — Shopify handles it once the tracking number is there.
The whole build took 4 days: one day mapping the 3PL's API (the documentation was rough), one day building the core order push, one day on the tracking sync and error handling, one day testing with live orders in staging and then production.
Edge Cases We Had to Handle
A few things came up during testing that weren't in the original brief:
- Bundle products — one Shopify line item that maps to multiple 3PL SKUs. We added a "bundle expansion" step that splits these before the API call.
- International orders — the 3PL needs HS codes and declared values for customs. We added a lookup against a second Sheet tab that maps product categories to HS codes.
- Duplicate webhook delivery — Shopify can occasionally send the same webhook twice. We added idempotency checking using the order ID so the 3PL never receives the same order twice.
None of these were hard to solve, but they're the kind of thing you only discover when you run real orders through the system. That's why we always do a staged testing day before flipping to production.
The Result
- Fulfilment lag dropped from avg. 6 hours to under 10 minutes
- 3–4 hours/day of manual ops work eliminated entirely
- Error rate on orders (wrong SKU, missing address) dropped to zero for automated orders
- Exception rate: ~3% of orders flagged to Slack, handled in under 5 minutes each
- Tracking numbers written back to Shopify same day, vs. next morning before
The ops lead's summary was short: "I don't think about orders anymore. I only see a Slack message if something actually needs me." That's the goal — automation should make your exceptions visible and your routine invisible.
There's a downstream benefit they mentioned after a few weeks: customer support tickets about "where's my order" dropped noticeably because tracking emails now go out the same day instead of the following morning. Faster fulfilment loop, fewer anxious customers.
What This Cost
This project came in under our Growth plan — a few integrations, some custom logic for the SKU mapping and edge cases, delivered in under a week. The brand paid a fixed fee and got the full n8n workflow exported, the Google Sheet SKU mapper, and a short handover doc covering how to add new products and what to do if the 3PL API changes.
Running cost: the same $12/month VPS they were already using for another workflow we'd built them previously. The automation itself has no per-order fees.
If you're running a Shopify store and still manually touching fulfilment, get in touch. This kind of integration usually takes us less than a week and pays for itself in the first month.