Client Integrations — Virtual Bundle Stock Sync
Use this guide when an ecommerce integration should receive a derived stock quantity for a virtual bundle parent SKU.
Overview
Virtual bundle stock sync allows ParcelPilot to push a derived stock quantity for a bundle parent SKU in supported ecommerce integrations.
This is intended for channels where:
- the channel has a normal stock-managed parent SKU
- ParcelPilot knows the bundle structure from
items.attributes.bundle - ParcelPilot should calculate the parent quantity from component availability
- orders for the parent SKU are still fulfilled from ParcelPilot component items
This feature is default-off and must be enabled per integration.
This guide is about outbound stock quantities only. Bundle shipping-weight calculation is configured on the item record separately and does not widen the stock-sync support rules in this article.
What It Does
When enabled, ParcelPilot can include virtual bundle parent SKUs in stock sync payloads.
The pushed parent quantity is calculated from the lowest currently buildable quantity across the bundle components.
ParcelPilot does not create a separate physical stock bucket for the bundle parent.
When a component stock mutation propagates after commit, ParcelPilot keeps the direct component SKUs in scope and can fan out that same push to dependent bundle parent SKUs for integrations where the bundle sync policy is enabled.
When To Enable It
Enable virtual bundle stock sync only when all of the following are true:
- the ecommerce channel expects a normal stock-managed parent SKU
- the parent SKU should reflect ParcelPilot-derived component availability
stock_sync_enabledis already on for the integrationstock_masteris set to ParcelPilot- the bundle structure is a fixed virtual bundle, not a dynamic or physical bundle
- fulfilment should continue to reserve and deduct component items only
When To Leave It Disabled
Leave the setting disabled when any of the following apply:
- the channel should not receive derived parent quantities
- the channel or plugin manages bundle inventory in its own way
- the parent SKU is not a normal stock-managed SKU in the channel
- the bundle structure is nested, hybrid, dynamic, or otherwise unsupported
- you are not yet ready to validate end-to-end bundle stock behaviour with a controlled test integration
How Derived Quantities Are Calculated
ParcelPilot calculates bundle availability from the component sellable quantities.
Component sellable quantity:
$$ \text{component sellable} = \max(0, \sum qty - \sum reserved) $$
Bundle buildable quantity per component:
$$ \text{buildable from component} = \left\lfloor \frac{\text{component sellable}}{\text{qty per bundle}} \right\rfloor $$
Final bundle quantity:
$$ \text{bundle quantity} = \min(\text{buildable from each component}) $$
ParcelPilot excludes:
DISCONTINUEDinventory units- inventory in
QUARANTINElocations - inventory in
RETURNSlocations
Worked Examples
Example 1: Simple 1:1 Kit
Bundle parent:
KIT-001
Components:
COMP-A x1COMP-B x1
Stock:
COMP-A = 9COMP-B = 10
Derived bundle quantity:
KIT-001 = 9
Reason:
COMP-Acan build 9 kitsCOMP-Bcan build 10 kits- the lowest buildable quantity is 9
Example 2: Uneven Component Ratio
Bundle parent:
KIT-002
Components:
COMP-A x3COMP-C x1
Stock:
COMP-A = 9COMP-C = 7
Derived bundle quantity:
KIT-002 = 3
Reason:
COMP-Acan buildfloor(9 / 3) = 3COMP-Ccan buildfloor(7 / 1) = 7- the lowest buildable quantity is 3
Example 3: Policy Disabled
If the integration keeps virtual bundle stock sync disabled:
- ParcelPilot still pushes direct component SKUs
- ParcelPilot does not include bundle parent SKUs in full or targeted stock payloads
Supported Bundle Structures
Supported in Phase 2A:
- fixed virtual bundles
- deterministic component lists on the item record
- positive numeric
item_idandqtyvalues - multiple valid parent bundles sharing one component
- parent SKUs fulfilled from component items only
Unsupported Bundle Structures
Not supported in Phase 2A:
- nested bundles
- self-referential bundles
- bundle cycles
- missing component items
- missing component ids
- non-positive component quantities
- physical bundle stock
- hybrid bundle stock
- platform-native dynamic bundle modelling
Unsupported bundle parents are skipped safely during stock sync.
Shipping Weight Note
ParcelPilot can now auto-calculate a bundle parent's shipping weight from component item weights in item and shipment flows.
That is independent of virtual bundle stock sync:
- shipping-weight auto-calculation is configured per item
- stock-sync enablement is configured per integration
- nested bundles may be resolved for shipping weight even though nested bundles remain unsupported for Phase 2A stock-sync payloads
Integration Setting Location
Location in the admin UI:
- open Client Integrations
- open the target ecommerce integration
- go to the ecommerce settings section
- enable
Enable stock syncif required - set
Stock mastertoParcelPilot - enable
Enable virtual bundle parent stock sync
Stored setting:
settings.bundle_stock_sync.enabled
Default-Off Behaviour
This feature is intentionally default-off.
That means:
- new integrations start with the setting disabled
- older integrations that do not yet have the setting also behave as disabled
- bundle sync is never activated implicitly by parser, payload, or propagation logic
Rollout And Rollback Guidance
Recommended rollout:
- enable the setting for one test integration only
- validate one targeted component stock change and one full stock sync
- confirm the parent SKU quantity matches the derived expectation in the channel
- confirm order fulfilment still reserves and deducts component items only
Recommended rollback:
- turn off
Enable virtual bundle parent stock sync - rerun a full stock sync for the affected integration so the outbound payload returns to direct-SKU-only behaviour
- keep the local bundle definition unchanged unless the bundle itself is no longer operationally valid
Rollback does not require changing order fulfilment, reservation, or deduction logic because Phase 2A is additive and default-off at the integration layer.
Platform Notes
Shopify
- use only when the parent SKU is a normal stock-managed Shopify SKU
- ParcelPilot does not implement Shopify-native bundle-app logic in Phase 2A
- fulfilment still happens from ParcelPilot component items
WooCommerce
- use only when the parent SKU is a normal stock-managed WooCommerce SKU
- Woo bundle plugins and custom bundle inventory logic are outside Phase 2A scope
- keep the setting disabled if Woo is expected to own bundle inventory logic
Magento
- Magento supports full sync, targeted multi-SKU sync, and the current single-SKU push path
- use only for simple stock-managed parent SKUs
- Magento native dynamic bundle semantics are out of scope
- the existing Magento quantity-only stock option remains separate from this feature
BigCommerce
- use only when the parent SKU is a normal stock-managed BigCommerce SKU
- BigCommerce-specific bundle apps or custom bundle logic are outside Phase 2A scope
- keep the setting disabled if BigCommerce should remain the source of truth for bundle handling
Troubleshooting
Bundle Parent Not Appearing In Stock Push
Check:
Enable stock syncis onStock masterisParcelPilotEnable virtual bundle parent stock syncis on- the bundle definition is enabled on the item
- all component rows have valid
item_idand positiveqty - component items belong to the same tenant and client
- the bundle is not nested or cyclic
Bundle Parent Quantity Looks Too Low
Check:
- component reserved stock levels
- whether the limiting component has a higher quantity-per-bundle ratio
- whether some inventory is in
QUARANTINEorRETURNS - whether some inventory units are
DISCONTINUED - whether a warehouse scope is restricting sellable stock
Direct Components Push But Parent Does Not
This usually means one of the following:
- bundle sync policy is disabled for the integration
- the parent bundle definition is invalid or unsupported
- the parent SKU is not part of a valid fixed virtual bundle structure
Single Bundle SKU Push Returns Zero
Current Phase 2A behaviour:
- Magento single-SKU pushes return the derived quantity only when bundle sync is enabled
- when bundle sync is disabled, the direct parent path remains safe and currently resolves to zero because there is no separate parent stock bucket
Validation Checklist
Before enabling this for a live integration:
- confirm the bundle parent SKU exists in the channel as a standard stock-managed SKU
- confirm the ParcelPilot item bundle definition is enabled and valid
- confirm component stock values are easy to predict for the test
- enable stock sync and set stock master to ParcelPilot
- enable virtual bundle parent stock sync for one test integration only
- run a targeted component stock change and confirm the parent SKU is included
- run a full stock sync and confirm the parent SKU quantity matches the derived expectation
- if Magento is used, run a direct single-SKU push for the bundle parent and confirm the derived value
- confirm fulfilment logic still reserves and deducts components, not the parent
Support Checklist
When assisting a client or operator:
- capture the integration platform and integration id
- capture whether stock sync is enabled and whether ParcelPilot is stock master
- capture the bundle sync setting state
- capture the parent SKU and component SKUs
- capture the expected derived quantity and the actual pushed quantity
- capture whether the issue is full sync, targeted sync, or single-SKU push
- review whether any component is missing, reserved, discontinued, quarantined, or in returns
- review whether the bundle structure is nested, cyclic, or otherwise unsupported
- check recent sync logs or integration events for skipped or reduced payloads