Inventory Fundamentals

Inventory Management for Ecommerce: How to Stop Overselling Across Channels

•6 min read•By Inventoros Team
Inventory Management for Ecommerce: How to Stop Overselling Across Channels

One box on one shelf can show "1 in stock" on your website, a marketplace and a wholesale portal at the same moment. Whichever order lands first wins. The other two become cancellations and apologies, and on a marketplace a cancellation can cost you ranking.

Preventing that is most of what ecommerce inventory management is.

Publish available stock, not on hand

On hand is what's physically on the shelf. The number to show customers is available to promise:

Available = On hand - Reserved - Safety buffer

On hand is units counted in stock. Reserved is units already promised to an order that hasn't shipped. The safety buffer is units you hold back on purpose to absorb sync delay, damage and miscounts.

Publish on hand and every unpicked order is a unit you've sold twice. Unshipped orders are the commonest cause of overselling, and the easiest to fix.

One SKU, three channels

You hold 12 units. Pending orders on a marketplace have reserved 5 of them. You keep a buffer of 2.

On hand            12
Reserved           -5
Safety buffer      -2
Available           5

Publish 5. If a marketplace punishes cancellations hard, you can give it a bigger share of the buffer:

Own store     publishes 5
Marketplace   publishes 4  (one extra held back)
Wholesale     publishes 5, but a person reviews the orders

This needs one source of truth for on hand and reserved, and a rule per channel. When the marketplace sells one, available drops to 4 everywhere, and the next order is checked against that.

We'd start the buffer at one or two units on fast sellers and review it after a month of sales. The right buffer is the smallest one that stops cancellations.

Three ways to sync

Method How it works Best for Weak spot
CSV import and export Export stock, upload to each channel, import orders back A few orders a day, one or two channels Stock is wrong between uploads
API polling A script or channel asks for current stock every few minutes Moderate volume The delay is the polling interval
Webhooks The inventory system tells you the moment stock changes Fast or high volume You must handle retries and failures

Most stores start with CSV, move to polling, and end up on webhooks. Whichever you use, run a nightly check that compares channel stock with your system and flags differences. Most sync bugs show up there.

Map your SKUs before you connect anything

Sync breaks when two systems call the same product different names.

  1. Give every product and variant one SKU in your inventory system. See how to create a SKU system.
  2. Map each channel's listing to that SKU. Many channels have their own product ID.
  3. Pick one place where stock quantity is edited.
  4. Treat a bundle of three items as three units leaving stock, not one.
  5. Treat variants as separate items. A small and a large have separate stock.

Returns, damage and counts

Overselling also comes from stock you only think you have. Process returns the same day and record damaged units so they stop counting as available. See the RMA and returns process. Run cycle counts, so the number you publish is a number someone checked. A buffer absorbs small errors. It can't cover a stock record that is wrong by 20%.

With several warehouses, track stock per location and publish only what you can ship to that channel. A 3PL's stock is its own location, reconciled against their reports. See multi-location inventory management and what is a 3PL.

Reorder before the buffer is gone

Overselling and stockouts are the same failure at different speeds. Set a reorder point that covers lead time and your buffer, so you reorder while there's still stock to sell. Fast sellers need a higher one than slow ones.

How Inventoros handles it

Inventoros tracks on hand, reserved and available per SKU, warehouse and location. Read them with GET /api/v1/stock-balances or export stock as CSV.

It differs from the example above in one way. When you create an order in Inventoros, stock goes down at once, so you don't subtract that order again as reserved. "Reserved" in Inventoros means a hold placed by a plugin or integration, and holds appear on a Reservations page. There's no safety-buffer or per-channel buffer setting, so apply the buffer in whatever publishes stock to the channel.

Orders carry a channel order number next to the internal one, and you can import orders and products from CSV. The marketplace lists official plugins for Shopify and WooCommerce, which sync products, inventory levels and orders in both directions, and for Amazon, which syncs inventory and imports orders and is aware of FBA stock. It also lists a ShipStation plugin for shipping updates.

For webhooks, each delivery is signed with HMAC-SHA256 of the body using the webhook's secret, sent in the X-Webhook-Signature header with X-Webhook-Event and X-Webhook-Delivery. Failed deliveries retry up to five times with backoff, and there's a deliveries endpoint to see what happened. A stock adjustment fires stock.adjusted with this body:

{
  "adjustment": {
    "id": 1042,
    "type": "decrease",
    "quantity": -3,
    "quantity_before": 12,
    "quantity_after": 9,
    "reason": "order",
    "notes": null,
    "created_at": "2026-11-06T14:02:11+00:00"
  },
  "product": { "...": "the product's fields" },
  "user": { "id": 7, "name": "...", "email": "..." }
}

The values are illustrative and the field names are real. The API is rate-limited to 60 requests per minute, so with polling, fetch balances in bulk and not one SKU at a time.

It's free, open source and self-hosted. The installation guide gets a server running with one command.

FAQ

What causes overselling in ecommerce? The same stock shown in more than one place, with the numbers updating late. Publish available stock from one source of truth and update every channel as fast as you can.

How much safety stock should I hold back per channel? One or two units on fast-moving items is a reasonable start. Raise it for any channel that punishes cancellations, and review it after a month.

Do I need real-time sync? Not always. With a few orders a day, CSV or polling every few minutes is fine. As volume rises or items sell out quickly, move to webhooks, because the gap between a sale and the update is where overselling happens.

What's the difference between on hand and available? On hand is what's physically in stock. Available is what you can still promise: on hand minus reserved units, minus any buffer you hold back.