Inventory in Sales Channel has one source of truth — the master inventory in Storefront — and many copies, one per connected channel. The sync is bidirectional: pushes from master to channel keep listings accurate, pulls from channel to master detect off-platform changes, and reservations protect against overselling during a sale.
Master inventory
The master is keyed by SKU. Read and update it through the inventory sub-controller.
/sales-channel/inventory/:skuJWTcurl https://appengine.appmint.io/sales-channel/inventory/SKU-100 \
-H "Authorization: Bearer $JWT" -H "orgid: $ORG"
/sales-channel/inventory/:skuJWTcurl -X PUT https://appengine.appmint.io/sales-channel/inventory/SKU-100 \
-H "Authorization: Bearer $JWT" -H "orgid: $ORG" \
-d '{"quantity": 42, "syncToChannels": true, "reason": "warehouse count"}'
| Field | Type | Description |
|---|---|---|
| quantity* | number | The new on-hand quantity. |
| syncToChannels | boolean | If true, fan out to every connected channel after updating the master. |
| reason | string | Audit string recorded in inventory history. |
/sales-channel/inventory/bulk/updateJWTPush to channels
/sales-channel/inventory/sync/:channelIdJWTPush specific SKUs (or all of them) to one channel.
curl -X POST https://appengine.appmint.io/sales-channel/inventory/sync/shopify \
-H "Authorization: Bearer $JWT" -H "orgid: $ORG" \
-d '{"items": [{"sku": "SKU-100", "quantity": 42}]}'
/sales-channel/inventory/syncJWTThe provider for each channel translates SKU → channel listing identifier (Amazon ASIN, Shopify variant ID, eBay item number) using the channel mapping table. If a SKU isn't mapped on a channel, the sync skips it and records a mapping_missing warning.
Pull from channels
/sales-channel/inventory/pull/:channelIdJWTRead inventory back from the channel and reconcile against master. Useful when the channel is the operational source of truth for a sub-catalog (e.g. an Amazon FBA SKU you don't ship yourself).
Reservations
When a customer adds items to a cart and starts checkout, reserve the stock so concurrent buyers don't oversell. Reservations have three terminal states: released (cart abandoned), committed (order placed), or expired (TTL hit).
/sales-channel/inventory/reserveJWTcurl -X POST https://appengine.appmint.io/sales-channel/inventory/reserve \
-H "Authorization: Bearer $JWT" -H "orgid: $ORG" \
-d '{
"items": [{"sku": "SKU-100", "quantity": 2}],
"orderId": "ord-abc"
}'
/sales-channel/inventory/reservation/:reservationId/releaseJWT/sales-channel/inventory/reservation/:reservationId/commitJWTView across channels
/sales-channel/inventory/:sku/channelsJWTReturns the SKU's quantity on every channel plus master, in one payload. Use this to spot drift.
{
"sku": "SKU-100",
"master": 42,
"channels": {
"amazon": { "quantity": 41, "lastSync": "2026-04-25T...", "status": "ok" },
"shopify": { "quantity": 42, "lastSync": "2026-04-25T...", "status": "ok" },
"ebay": { "quantity": 38, "lastSync": "2026-04-23T...", "status": "stale" }
}
}
Low-stock alerts
/sales-channel/inventory/alerts/low-stockJWTReturns SKUs whose master quantity has fallen below the per-product low-stock threshold. Pair with an automation trigger to send purchasing alerts.
Conflict resolution
When master and channel disagree (e.g. a channel reports a sale you don't have a corresponding order for), the sync uses configurable strategies:
| Strategy | Behavior | When to use |
|---|---|---|
master_wins (default) | Push master to channel. | Storefront is the only sales surface that decrements. |
channel_wins | Adopt channel value into master. | Channel-fulfilled SKUs (Amazon FBA). |
lower_wins | Take the smaller of the two. | Conservative — protects against overselling. |
manual | Flag the conflict, do not sync. | Investigation needed. |
Set the strategy per SKU in the channel mapping or per channel in enableChannel config.
{
"syncInventory": true,
"conflictStrategy": "lower_wins"
}
Conflicts that land in manual are surfaced via GET /sales-channel/sync/history?operation=inventory_conflict.
Channel webhooks (especially Shopify and Amazon SP-API notifications) can lag the actual inventory state by seconds-to-minutes. Don't rely solely on webhook-driven decrements to prevent overselling on high-velocity SKUs — combine with reservations during checkout.