Understanding bulk items
If you sell the same physical product in multiple pack sizes — say, screws in packs of 50, 250, and 500 — Shopify's default inventory model has a problem: it thinks each pack size is a separate product with its own stock. If you have 1,000 screws on your shelf, Shopify might let you sell 20 fifty-packs AND 4 two-fifty-packs AND 2 five-hundreds simultaneously because each variant says "in stock."
That's an oversell waiting to happen.
BulkFlow fixes this with a different model: bulk pools.
The mental model in 30 seconds
- Bulk pool — the actual physical inventory. "1,000 screws."
- Pack variants — the Shopify variants that draw from the pool. "50-pack draws 50 screws per sale. 250-pack draws 250. 500-pack draws 500."
- Webhook deduction — when Shopify reports an order is paid, BulkFlow subtracts the right number from the pool, then optionally pushes the new "available" counts back to Shopify.
So instead of 3 variants each thinking they have stock, you have 1 pool with 1,000 units, and Shopify is told the correct "available count" for each variant based on the pool divided by pack size.
How BulkFlow creates them
During onboarding, BulkFlow scans your Shopify catalog and looks for these patterns:
- SKU patterns —
WIDGET-50,WIDGET-250,WIDGET-500are likely the same family - Title patterns — "Widgets (Pack of 50)", "Widgets (Pack of 250)" are likely the same family
- Pack-size metafields — if you've already tagged variants with pack sizes, BulkFlow uses those directly
It then suggests a base SKU (the merchant's "family" name) and asks you to confirm starting bulk units. You can override anything before committing.
What happens after a sale
- Customer buys a 250-pack
- Shopify fires
orders/paidwebhook → BulkFlow - BulkFlow subtracts 250 units from the bulk pool
- If you have "auto-push" enabled (Starter+), BulkFlow recalculates each variant's "available count":
- - 50-pack: pool ÷ 50 = available
- - 250-pack: pool ÷ 250 = available
- - 500-pack: pool ÷ 500 = available
- Updated counts are pushed back to Shopify
- Shopify's storefront now shows accurate availability across all 3 variants
What about returns and cancellations?
refunds/createwebhook → BulkFlow CREDITS units back to the poolorders/cancelledwebhook (only when not yet shipped) → same credit- Already-shipped + then refunded → the merchant decides via the Refund handling toggle in Settings
What about manual corrections?
Go to Items → click an item → Adjust bulk units. Every adjustment writes a row to Movements with the reason you provided ("damaged stock", "physical count", etc.) so you can audit later.
What's NOT a bulk item
Some products don't need bulk tracking. BulkFlow leaves those alone:
- Single-variant products (no pack sizes)
- Service/digital products (gift cards, subscriptions)
- Products you've explicitly marked "Not managed" in Items
You can toggle the "managed" flag per-item from the Items page.
Common questions
Q: What if I have a 1-pack AND a 50-pack?
A: The 1-pack is just a pack variant with pack_size=1. Bulk pool divides cleanly.
Q: What if Shopify and BulkFlow disagree on counts?
A: Run Reconcile. It diffs both sides and shows you the drift before changing anything.
Q: Can I import existing pools from a CSV?
A: Yes — Import in the sidebar. Sample CSV available there.
Q: Can I reverse a bad import?
A: Pro tier and above can undo any import in 1 click from the Import History panel.