← Back to blog

Inventory Reservation Patterns: How to Stop Overselling

· Stoa Logistics
inventory engineering operations

Inventory Reservation Patterns: How to Stop Overselling

You have 10 units in stock. You sell 12. Now you’re apologizing to customers and issuing refunds.

Overselling is an inventory synchronization problem. Your sales channels think you have stock that’s already committed to other orders. Here’s how it happens and how to prevent it.

Why Overselling Happens

Race Conditions

Two customers add the last item to cart simultaneously. Both see “1 in stock.” Both complete checkout. You’ve sold 2 of 1.

This happens because:

  1. Customer A checks inventory → 1 available
  2. Customer B checks inventory → 1 available
  3. Customer A completes purchase → inventory decremented to 0
  4. Customer B completes purchase → inventory decremented to -1

The check and the decrement aren’t atomic. There’s a window where both customers see availability.

Sync Delays

You sell on multiple channels. A customer buys the last unit on one channel. Your inventory sync to the other channel runs every 15 minutes. In that window, someone buys the same unit on the other channel.

Manual Errors

Someone adjusts inventory in one system but not another. Someone ships an order but doesn’t mark it shipped. Someone receives inventory but doesn’t log it.

Reservation Patterns

Pattern 1: Optimistic (No Reservation)

Don’t reserve inventory until shipment. Accept all orders, deal with oversells when they happen.

Pros: Simple, no reservation logic needed Cons: Oversells guaranteed at scale, customer experience suffers Use when: Low volume, high inventory depth, oversells are rare

Pattern 2: Soft Reservation

Reserve inventory when order is placed, but allow the reservation to be overridden or expired.

Available = On Hand - Reserved

When order is placed:

  1. Check if Available > 0
  2. Create reservation record
  3. Decrement Available (not On Hand)

When order ships:

  1. Decrement On Hand
  2. Delete reservation

When order cancels:

  1. Delete reservation
  2. Available automatically increases

Pros: Prevents most oversells, handles cancellations gracefully Cons: Reservations can accumulate if orders don’t complete Use when: Most e-commerce operations

Pattern 3: Hard Reservation (Atomic)

Use database transactions to make check-and-reserve atomic.

BEGIN TRANSACTION;
SELECT quantity FROM inventory WHERE sku = 'WIDGET' FOR UPDATE;
-- If quantity >= requested, proceed
UPDATE inventory SET quantity = quantity - 1 WHERE sku = 'WIDGET';
INSERT INTO reservations (order_id, sku, quantity) VALUES (...);
COMMIT;

The FOR UPDATE lock prevents other transactions from reading the row until this one completes. No race condition possible.

Pros: Guarantees no oversells Cons: Can create contention on hot SKUs, requires careful transaction management Use when: High-velocity items, flash sales, limited inventory

Pattern 4: Reservation with Expiration

Reserve inventory but auto-release if the order doesn’t complete within a time window.

Reservation expires in: 30 minutes

If customer abandons cart, reservation releases automatically. Prevents inventory from being locked up by incomplete orders.

Pros: Balances reservation benefits with inventory availability Cons: Adds complexity, need to handle expiration edge cases Use when: High cart abandonment, limited inventory

Multi-Channel Considerations

When selling on multiple channels, you need a single source of truth for inventory.

Wrong approach: Each channel has its own inventory count, sync periodically.

Right approach: Central inventory system, channels query in real-time or near-real-time.

The OMS becomes the inventory authority:

  1. Order comes in from any channel
  2. OMS reserves inventory immediately
  3. OMS pushes updated availability to all channels
  4. Channels can’t sell what’s already reserved

This requires:

  • Fast inventory APIs (< 100ms response)
  • Webhook or polling for channel updates
  • Handling channel-specific inventory buffers (some sellers keep 10% buffer on certain marketplaces)

Vectis Implementation

Vectis uses atomic reservations with expiration:

  1. Order received: Transaction reserves inventory, fails if insufficient
  2. Reservation created: Linked to order, includes expiration time
  3. Order allocated: Reservation confirmed, expiration cleared
  4. Order cancelled: Reservation released, inventory available again
  5. Order shipped: On-hand decremented, reservation cleared

Reservations that expire (order never completed) release automatically via background job.

For multi-channel, Vectis is the inventory authority. Channels sync via:

  • Shopify: Inventory Levels API
  • WooCommerce: Stock quantity endpoint
  • Additional channels (Amazon, eBay, etc.): Coming soon

Updates push within seconds of reservation changes.

Measuring Oversell Rate

Track these metrics:

  • Oversell rate: Orders cancelled due to no inventory / Total orders
  • Reservation timeout rate: Reservations expired / Reservations created
  • Sync latency: Time between inventory change and channel update

Target: < 0.1% oversell rate. If you’re higher, your reservation pattern or sync speed needs work.


Vectis uses atomic inventory reservations with automatic release on cancellation. See how it works.

Ready to simplify your operations?

See how Vectis can help your team.

Request a demo