Stop Multichannel Overselling in Odoo
Why you sell units you no longer have when you're live on several marketplaces, how to spot the problem, and how to close it for good with real-time stock synchronization.
Overselling (selling a unit that's no longer in the warehouse) is rarely a one-off human error: it's a structural problem in how stock is synced between Odoo and your sales channels. While you sell only on your own website the risk is low, because there's a single source of truth. The moment you add Amazon, a Mirakl marketplace or ManoMano, you get several copies of the same stock that all have to stay in sync — and that's where the problems start.
Symptoms: are you overselling?
If you recognize two or more of these, you have a synchronization problem, not bad luck:
- You get orders from a marketplace for a product that shows 0 or negative stock in Odoo.
- You have to cancel already-confirmed orders and refund customers because you can't fulfill them.
- Amazon penalizes you with a high Order Defect Rate or Cancellation Rate, or suspends an ASIN.
- On Mirakl marketplaces you see incidents for late deliveries caused by stock-outs.
- Your team spends hours reconciling stock by hand between each channel's panel and Odoo.
- The same SKU shows different quantities on each channel at the same time.
Why it happens: the three real causes
Each channel holds its own available quantity. If a sale on channel A doesn't immediately deduct from channel B, both can sell the same unit during those seconds or minutes. This is the root cause in 90% of cases.
Even if you send the update instantly, the marketplace still takes time to process it. Amazon, for instance, queues inventory feeds and can take anywhere from minutes to over half an hour to apply them during load peaks. That window is enough to sell more than you have.
Uploading a CSV every morning, or a cron that syncs "every hour," guarantees that published stock is stale for the whole interval. On 1-2 unit, high-turnover products, an hour is an eternity.
The mechanism, step by step
Picture a product with 1 unit listed on both Amazon and a Mirakl marketplace:
- 10:00:00 — A customer buys the unit on Amazon.
- 10:00:02 — Odoo receives the order (if the connector works by webhook), or doesn't find out until the next cycle (if it works by polling).
- 10:00:05 — Another customer buys the same unit on Mirakl, because it still shows as available there.
- 10:00:30 — Odoo tries to push "0 stock" to Mirakl, but it's too late: you now have two orders and one unit.
The result is an order you'll have to cancel. The longer any of those delays run, the more likely the collision. That's why the goal isn't "sync more often" — it's shrinking the window to its minimum.
What doesn't fully fix it (let's be honest)
- Stock buffers. Listing 8 when you have 10 reduces the risk, but leaves inventory unsold and doesn't work on low-quantity SKUs. Useful as a temporary patch, not as a permanent fix.
- Syncing "faster" in batches. Going from 1 hour to 5 minutes helps a lot, but the window still exists. On high-turnover items you'll still get occasional collisions.
- Reviewing by hand every morning. It doesn't scale, it breaks during holidays or spikes, and it's always too late.
The fix: event-driven, real-time synchronization
To close overselling at the root, you need Odoo to be the single source of truth for stock, with every change propagated to all channels on an event, not on a clock. In practice, a well-built connector does three things:
- Reads sales from each channel as they happen (via webhook where the marketplace supports it, or very frequent polling where it doesn't) and creates the order in Odoo.
- Deducts stock in Odoo and, in the same flow, recalculates the available quantity.
- Pushes the new available quantity to every other channel immediately, not on the next batch.
To be fair and honest: no connector removes the marketplace's internal latency (cause #2). What it does remove is the latency that's on you (causes 1 and 3), which is the majority of it. Combined with a minimum buffer of 1 unit on your most critical SKUs, overselling goes from weekly to anecdotal.
Webhook vs. polling: what to demand from your connector
Not every marketplace offers real-time notifications. Here's what you're actually dealing with:
- Webhook (push): the marketplace notifies you instantly for every order. It's the ideal, but not everyone supports it for everything.
- Polling (pull): your connector asks every X seconds/minutes. It works everywhere, but the frequency sets your risk window. Always ask how often a connector syncs before you buy it.
On Mirakl (Decathlon, Leroy Merlin, El Corte Inglés, etc.) you mostly work through its offers and orders API; on Amazon, through SP-API and its inventory feeds. Each has its own timing, and a serious connector should document it instead of promising you "real time" with no caveats.
Causes and fixes at a glance
| Cause | Typical symptom | Fix |
|---|---|---|
| Stock not synced in real time | Two channels sell the same unit | Event-driven sync, Odoo as the single source of truth |
| Marketplace latency | The feed takes time to apply | Minimum buffer on critical SKUs (can't be fully removed) |
| Manual / batch updates | Stock stale for the whole interval | Automated connector, no CSV or hourly crons |
Alternatives: are there free OCA modules?
Yes, and it's worth knowing about. The OCA community maintains the connector repository and connectors like connector_woocommerce or pieces for prestashop, free and AGPL-licensed. If you sell on those channels and have in-house technical staff to install, configure and maintain a job queue, they're a perfectly valid and honest option.
The practical limit: for Amazon, Mirakl or ManoMano there is no maintained, production-ready OCA connector, and building event-driven sync with error handling, retries and SKU mapping is real engineering work. That's where a proven proprietary connector saves you weeks. It's not magic — it's code someone has already written, tested and maintains.
Sync stock by event and stop cancelling orders
Mirakl connector for Odoo 17, 18 and 19. Reads orders, deducts stock in Odoo and pushes the available quantity to every channel. Built and maintained by engineers in Barcelona.
See the Mirakl connector (€100)Not sure which connector you need for your channels? We'll tell you in 1 minute, free and with no signup:
Take the connector testFAQ
Why does overselling happen with several marketplaces?
Each channel keeps its own copy of stock. If sales aren't deducted instantly on the rest, there's a window where two channels sell the same unit. The root cause is the latency between the real sale and the available-stock update reaching the other channels.
How often do you need to sync to avoid it?
Ideally by event (when the quant changes in Odoo), not on a fixed interval. If interval-based sync is the only option, every 5-15 minutes cuts the risk a lot, but doesn't eliminate it on low-stock, high-turnover SKUs. Only real time closes the window completely.
Are stock buffers enough?
They reduce the odds but don't eliminate them, and they leave inventory unsold. They work as a temporary patch or as a safety net on your 5-10 most critical SKUs, not as a standalone fix. On 1-2 unit products, a buffer stops you from selling them at all.
Is Odoo's standard Inventory enough?
Odoo Inventory manages internal stock, but it doesn't talk to Amazon, Mirakl or ManoMano on its own. You need a connector that reads sales from each channel, records them in Odoo, and pushes the available quantity back out to all of them. Without that layer, neither Odoo nor the marketplaces know what's selling elsewhere.