Define each bundle as a virtual SKU with a bill of materials (BOM) listing component SKUs and quantities required per bundle unit (e.g., bundle SKU GIFT-SET-A requires 1x SKU-MUG + 2x SKU-COASTER)
Store available bundle quantity as a computed value: min(floor(component_available / component_qty_per_bundle)) across all components, recalculated whenever any component's inventory changes
When a bundle is sold, decrement each component's inventory by the required quantity per bundle, not the bundle SKU's virtual inventory
Push the computed bundle available quantity to each sales channel's inventory API immediately after any component quantity change to keep channel listings accurate
Handle pre-kitted bundles (physically assembled as a distinct SKU in the warehouse) differently: treat the pre-kitted SKU as its own inventory unit and decrement it directly on sale, with a separate WMS assembly workflow to replenish
Alert when a component's inventory drops to a level that would reduce bundle availability below a safety threshold, triggering reorder or reallocation
Known gotchas
Race conditions during simultaneous bundle and component sales can cause overselling; use atomic transactions or pessimistic locking when decrementing component inventory
Marketplace listings for bundles often require a unique GTIN for the bundle itself, separate from the component GTINs; check marketplace bundle listing policies before publishing
Refunds for bundles must restore all component quantities, not just one; ensure your refund webhook handler performs a full component restock
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp