Inventory Reservation Patterns: How to Stop Overselling
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:
- Customer A checks inventory → 1 available
- Customer B checks inventory → 1 available
- Customer A completes purchase → inventory decremented to 0
- 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:
- Check if Available > 0
- Create reservation record
- Decrement Available (not On Hand)
When order ships:
- Decrement On Hand
- Delete reservation
When order cancels:
- Delete reservation
- 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:
- Order comes in from any channel
- OMS reserves inventory immediately
- OMS pushes updated availability to all channels
- 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:
- Order received: Transaction reserves inventory, fails if insufficient
- Reservation created: Linked to order, includes expiration time
- Order allocated: Reservation confirmed, expiration cleared
- Order cancelled: Reservation released, inventory available again
- 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.