Skip to main content
BulkFlow
Back to all posts
2026-05-23· 2 min read·BulkFlow Team

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:

  1. 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_type on each refund line and skip no_restock.
  2. Cancel + refund double-fires. When a paid order is cancelled with the restock + refund boxes checked, Shopify sends both orders/cancelled and refunds/create for 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.

Start a free 14-day trial →

Tags#shopify#inventory#case-pack#guide#automation
Ship a multi-pack Shopify store without the inventory headache.

14-day trial, no credit card. Install from your Shopify admin in 90 seconds.

Install on Shopify