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
The manual way today
Every paid order flows into one queue in ShipBob and gets the same treatment: retail packing slip, single-item parcels, the marketing insert. A 200-unit wholesale PO bound for a retailer gets picked the same way a one-tee retail order does. So someone scans the order feed by eye, spots the big B2B ones, and pulls each out by hand to ship it the wholesale way — palletized, PO number on the slip, no inserts, to the retailer's routing guide.
When a wholesale order ships like retail, it ships as forty loose parcels at parcel rates instead of one palletized freight shipment, or it goes out without the PO number so the buyer can't reconcile and sits on the invoice, or it misses the retailer's routing-guide rules and earns a compliance chargeback. Every one is a re-ship, a deduction, or a delayed payment — and the only thing catching them is a person remembering to look.
What running looks like
The moment an order is created, the flow decides wholesale-or-retail by who placed it, tags the wholesale ones, and keeps them out of the retail auto-fulfill. They land in their own ShipBob lane with the wholesale packing slip and PO, and drop into a Slack channel where a person confirms the ship date and whether it's parcel or freight before it goes. Retail keeps flowing untouched, and nobody eyeballs the order feed to catch the wholesale ones anymore.
01The build
How to build it
Catch every order the moment it's created
Runs itselfTrigger on order creation, not payment — you want to route it before it reaches the warehouse. Use Shopify Flow's 'Order created' trigger, or point Shopify's orders/create webhook at n8n/Zapier if your detection needs logic Flow can't express. Everything downstream hangs off this one trigger.
Decide wholesale vs retail by account identity — not order size
Runs itselfRoute on WHO placed the order, not how big it is. In order of reliability: the order belongs to a Shopify B2B Company (check the order's purchasing entity), the customer carries a 'wholesale' tag from your approved-accounts list, or it came through your wholesale sales channel or a B2B price list. Do not route on quantity or order value — a bulk retail buyer isn't wholesale, and a small reorder from a real account still is.
Tag the order so the rest of the stack can act on it
Runs itselfAdd an order tag like 'wholesale' (plus 'fulfillment:wholesale' if you want a routing-specific tag). This is what creates the separate queue: a saved Admin view filtered to that tag is the wholesale fulfillment list, and every later step keys off the tag instead of re-deriving the decision.
Keep wholesale orders out of the retail auto-fulfill flow
Runs itselfIf you already auto-push paid orders to ShipBob for retail fulfillment, add a condition that excludes the 'wholesale' tag so those orders don't get retail packing, single-parcel handling, or the marketing insert. One order, one lane — this is the line that stops a wholesale PO from ever entering the retail pipeline.
Hand the order to ShipBob's wholesale lane
Runs itselfSync the order tag (or route it through a dedicated wholesale channel/store in ShipBob) so the warehouse applies the wholesale workflow: the B2B packing slip with the PO number, case-pack or palletize instead of loose parcels, no retail inserts, and the retailer's routing-guide rules. ShipBob reads the synced order tag, so the tag from step 3 is the whole handoff.
Drop it in Slack for a human to confirm before it ships
Needs a humanWholesale orders carry decisions software shouldn't make alone. Post each one to a #wholesale-fulfillment Slack channel with the company name, PO number, requested ship/cancel date, and parcel-vs-freight, and have a person confirm before release. Use Shopify Flow's Slack action, or your glue tool's Slack node.
Guard the mixed and incomplete orders
Needs a humanDon't let the automation guess on the ambiguous ones. An order with both wholesale and retail line items, a customer not yet on the approved list, a missing PO number, or a ship-to that needs a freight quote — flag it to Slack and hold it rather than routing it either way. These are the cases that turn into chargebacks when a rule pushes them through.
Reconcile routing once a day
Runs itselfOnce a day, compare orders tagged 'wholesale' in Shopify against what ShipBob actually shipped on the wholesale workflow, and flag any mismatch to Slack. That catches the rare order that got tagged but slipped into the retail lane (or vice versa) before it reaches a retailer's dock and earns a deduction.
02The stack
What it’s built on
- Shopify
- System of record and the routing brain. Shopify Flow triggers on order creation, decides wholesale by B2B company / customer tag / channel, applies the order tag, and excludes wholesale from the retail flow. B2B Companies and price lists are what make the wholesale decision clean.Shopify Flow is included free on every Shopify plan, so the routing logic here costs nothing extra. The B2B Company features are Plus-only, but the tag-based path works on any plan.
- ShipBob
- The warehouse that runs the separate wholesale lane — B2B packing slip with the PO, palletization, no retail inserts, retailer routing-guide compliance — keyed off the synced order tag or a dedicated channel.ShipBob runs B2B/retail fulfillment (EDI, routing guides, palletized freight) alongside DTC, so it's an honest pick if you ship both from one 3PL. Any 3PL that reads order tags and has a B2B workflow works the same way — only the field names change.
- Slack
- Where each wholesale order lands for a human to confirm ship date and freight, where mixed/incomplete orders get held, and where the daily reconcile flags a mis-route.
03Questions
Before you build
How does it know an order is wholesale?
By who placed it, not how big it is. The flow checks, in order: whether the order belongs to a Shopify B2B Company, whether the customer carries your 'wholesale' tag from an approved-accounts list, or whether it came through your wholesale channel or price list. Account identity is reliable; order size isn't.
Why not just route by order quantity or value?
Because it misfires both ways. A retail customer buying in bulk for a gift or a group isn't wholesale, and a small reorder from a real wholesale account still is. Routing on quantity would push retail orders into the freight lane and leave real B2B orders shipping as loose parcels. Route on the account.
Do I need Shopify Plus or Shopify B2B for this?
No. The tag-based path — a 'wholesale' customer tag plus Shopify Flow — works on any plan. If you do have Shopify B2B (Plus), Companies and price lists make the wholesale decision cleaner and you can route on the purchasing entity directly instead of maintaining tags by hand.
Won't this conflict with my retail order-to-3PL sync?
No — that's the point of step 4. The retail auto-fulfill flow gets a condition that excludes the 'wholesale' tag, so a wholesale order never enters the retail pipeline. One order goes down exactly one lane, so there's no double-fulfillment and no retail packing on a B2B PO.
What about an order with both wholesale and retail items?
It gets flagged, not guessed. Mixed orders, customers not yet on the approved list, and orders missing a PO are held and posted to Slack for a person to split or resolve. Those are exactly the cases where an automatic rule would create a chargeback, so the recipe stops instead of forcing them through.
Can I build this myself, or should you build it?
Every trigger, tag, and edge case is spelled out above, so if you're comfortable in Shopify Flow and ShipBob's settings you can wire it up in an afternoon. If you'd rather not own the upkeep, we'll build it on the Shopify, ShipBob, and Slack accounts you already pay for, document it, and hand you the keys — you own the workflow outright, no monthly retainer. It starts with a free 20-minute teardown, not a contract.
Related recipes
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
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
Auto-tag high-risk orders for fraud review
Shopify scores every order for fraud, but the score is useless if a risky order is already out the warehouse door before anyone reads it. This watches for Shopify's risk verdict, tags the high-risk ones, puts a fulfillment hold on them so they can't ship, and posts the actual risk evidence to Slack for a human to clear. It never auto-cancels — a false positive kills a real sale. Build it yourself with the steps below, or we build it on your own Shopify and Slack, document it, and hand you the keys with no monthly fee. Free teardown of your current setup first.
- Shopify
- 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