How to Manage Multi-Channel Inventory Across Stores
Centralize inventory management across Shopify, WooCommerce, BigCommerce, and more.
What This Integration Does
Selling on multiple channels without a single source of truth leads to oversells, refund queues, and unhappy customers. Each platform has its own inventory representation and its own quirks around variants, locations, and reserved stock. This workflow treats your warehouse / ERP / database as the canonical inventory and pushes adjusted levels out to every channel on a schedule.
The workflow runs on a regular schedule (every 10-30 minutes for high-velocity stores). It reads current stock from the source, fans out to every channel in parallel, applies the delta to each platform's inventory tool, and reports counts plus failures to Slack. Re-running is safe: each pass sets absolute levels rather than applying deltas.
Prerequisites
- A canonical inventory source: MongoDB, NetSuite, MySQL, or another ERP / WMS connection.
- Connections to every sales channel: Shopify, WooCommerce, BigCommerce. Each connection needs write access to inventory.
- A SKU mapping table that links the canonical SKU to each channel's variant ID / location ID (especially required for Shopify multi-location).
- Optional: Slack for reporting and alerting.
Step 1: Schedule Trigger
Drop a Trigger node and set it to Schedule. Every 15 minutes is a reasonable starting point. The trigger exposes lastRunAt so you can scope the source query to recently-changed items only.
Step 2: Fetch Canonical Inventory
Add a Connector node to pull current stock. Options:
- NetSuite:
run-suiteqlagainst theitemtable, filtering onlastmodifieddate > {{ lastRunAt }} - MongoDB:
find-documentson theinventorycollection with anupdatedAtfilter
You should return a list of { sku, available, locationId } records ready to push out.
Step 3: Load the SKU -> Channel Mapping
Pull the SKU map from mongodb find-documents on a sku_mapping collection. Each document has the canonical SKU plus per-channel identifiers (Shopify inventoryItemId and locationId, WooCommerce productId, BigCommerce variantId). Hold this in a variable for the rest of the run so you're not re-querying inside the loop.
Step 4: Parallel Channel Updates
Add a Parallel node with one branch per channel. Inside each branch, a Loop iterates over the inventory records and calls the channel's adjust tool:
- shopify
adjust-inventorywithinventoryItemId,locationId, andavailable(absolute level) - woocommerce
update-productwithstock_quantityandmanage_stock = true - bigcommerce
update-productwithinventory_level
Skip any SKU missing from the mapping rather than failing the run.
Step 5: Capture Results and Failures
For each update, capture success / failure into an in-memory array. After the parallel branches finish, write the run summary to mongodb insert-documents (collection: inventory_sync_runs) with counts per channel, total duration, and any per-SKU errors. This is your audit log.
Step 6: Report and Alert
Add a Condition on the failure count. On success, send a brief slack send-message summary. On any failure above a threshold (e.g. >1% of SKUs), send a louder alert to your inventory channel so someone can investigate before oversells start.
Tips
- Push absolute levels, not deltas. Deltas drift the moment one channel times out, levels self-correct.
- Throttle each channel's loop. Shopify's GraphQL admin API has a leaky bucket that you'll exhaust if you update 1000 SKUs in 30 seconds.
- For high-velocity SKUs, hold back a safety buffer (e.g. push
available - 2) to absorb the time between source change and channel update. - Cache the SKU map in a Spojit variable and refresh it once an hour rather than every run.
Common Pitfalls
- Variants vs. products. Shopify adjusts inventory at the variant level via
inventoryItemIdandlocationId. Sending a product-level SKU will fail or hit the wrong variant. - Multi-location stores. Each Shopify location has its own inventory item. Decide whether the canonical source maps to one location or sums across all of them.
- WooCommerce manage_stock flag. If
manage_stockis false on the product, settingstock_quantityis a no-op. Make sure it's enabled. - Rate limits during backfills. A full sync of 50k SKUs across three channels will hit every limiter you have. Throttle and chunk explicitly.
Testing
Pick three test SKUs, change their canonical level to a known value (e.g. 7), run the workflow once manually, and verify each channel admin shows 7 for those SKUs. Re-run to confirm idempotency (level should remain 7, not double). Then enable the schedule.