Stop overselling case packs — automate Shopify inventory reductions
Selling the same beverage as a single, a 6-pack, a 12-pack, and a case of 24? You have a math problem masquerading as an inventory problem. This is the playbook we use to fix it for warehouses that move five-figure unit volume every week.
Why "Continue selling when sold out" isn't an answer
Some merchants turn on Shopify's continue selling when out of stock flag for every pack-size variant. It hides the symptom (the variant shows in-stock) but the disease — overselling against shared stock — gets worse, not better. Returns surge, the brand takes a hit, and Shopify's risk score on your store quietly creeps up.
The fix is to make Shopify's reported inventory match reality on the shelf, not paper over the mismatch.
The three-step automation
Step 1: Treat your warehouse as a single pool
Define the atomic unit you actually count. For a beverage shop that's "one bottle". For a stationery shop it might be "one envelope". For a coffee roaster, "one ounce".
Every variant is then expressed as a multiple of that atomic unit:
- Single can: 1
- 6-pack: 6
- 12-pack: 12
- Case of 24: 24
Step 2: Subscribe to Shopify's orders/paid webhook
When a customer buys 3 cases of 24, you don't deduct "3 from variant Case-24". You deduct 72 from the bulk pool, then recompute every variant's availability.
on order webhook:
units_used = sum(line.pack_size × line.quantity for line in order.lines)
bulk_pool -= units_used
for each variant in product:
variant.inventory = floor(bulk_pool / variant.pack_size)
push variant.inventory to Shopify
Step 3: Handle the reversals
Refunds and cancellations are where most home-grown solutions break. Two gotchas:
- The "Don't restock" checkbox. If the merchant unticks Restock items on a refund, Shopify still fires the refund webhook. Crediting your bulk pool here would inflate on-hand by hundreds of units. Read
restock_typeon each refund line and skipno_restock. - Cancel + refund double-fires. When a paid order is cancelled with the restock + refund boxes checked, Shopify sends both
orders/cancelledandrefunds/createfor the same line items. Only credit the pool once — track which event fired first per order.
What this looks like in BulkFlow
You install the app, point each pack-size variant at the bulk pool, and the cascade just runs. Webhooks, restock-type handling, cancel/refund dedup — all covered. Audit log captures every deduction with the order number, so when something looks off you can trace it in two clicks instead of grep-ing CSVs.
Common variations we handle
- Multi-location warehouses. Allowlist which Shopify locations BulkFlow can push to, so a Stocky / Trunk / Bundles app doesn't clobber inventory at a location it doesn't manage.
- Pack-size launches. Add a new 36-pack variant tomorrow and the cascade picks it up — no spreadsheet to update.
- Custom units. "Sheets", "lbs", "bottles", "pcs" — pick whatever your team actually counts. We never convert behind your back.
14-day trial, no credit card. Install from your Shopify admin in 90 seconds.