Sync Stock Across Marketplaces and Odoo
How to keep one single source of truth for inventory across Amazon, Mirakl, ManoMano, Shopify and Odoo: why CSV files and manual updates always lag behind, and how to fix it with a connector.
When you sell the same product on several channels, the core problem isn't having stock, it's having one figure for stock that every channel respects. The moment Amazon, a Mirakl marketplace (Decathlon, Leroy Merlin, El Corte Inglés…), ManoMano, your Shopify store and your Odoo each keep their own copy of inventory, those copies start to drift apart. This guide explains how to build a source of truth in Odoo, why manual methods can't keep up, and what you should demand from a connector for the sync to be reliable. No empty promises: we also tell you where a connector can't help you.
The key concept: a single source of truth
"Source of truth" means there is one single place that decides how many units there are, and everything else follows suit. In an e-commerce setup running on Odoo, that place has to be Odoo, for a simple reason: it's the only point where every event that changes stock converges.
- Purchases from suppliers come in as receipts in Odoo.
- Inventory adjustments (shrinkage, breakage, counts) are recorded in Odoo.
- Returns from any channel add stock back in Odoo.
- Sales from every marketplace are brought into Odoo and deducted there.
The golden rule: stock is calculated in Odoo and pushed outward; a marketplace is never allowed to dictate the quantity. The direction of stock information is always Odoo → channel. (The opposite direction, channel → Odoo, is only for orders and returns.)
Why CSV files and manual updates fail
Almost everyone starts the same way: exporting a stock CSV from Odoo and uploading it to each marketplace's dashboard, or adjusting quantities by hand. It works with 30 SKUs and one channel. It breaks the moment you grow. Here are the concrete failures you'll run into:
It's a snapshot of stock at the second you export it. Between generating it, uploading it and the marketplace processing it, minutes or hours go by. By the time it's applied, the figure is no longer real because you've kept selling.
A SKU that doesn't match, a shifted column, a decimal comma instead of a point, or an odd encoding, and you publish wrong quantities across hundreds of listings at once, without anyone noticing until the complaint arrives.
With 4 channels and 500 SKUs, reconciling by hand takes hours every day. It falls apart during holidays, staff absences or Black Friday spikes, exactly when a mistake is most expensive.
And the mistakes aren't cosmetic. If you overstate quantities, you sell what you don't have (overselling, cancellations, penalties). If you understate them out of caution, you leave dead inventory unsold. CSV forces you to choose between the two bad options.
The classic collision, step by step
A product with 3 units, listed on Amazon and on a Mirakl marketplace, synced by CSV every hour:
- 9:00 AM — You upload the CSV. Amazon and Mirakl show 3 units.
- 9:20 AM — You sell 2 on Amazon. Odoo (if the connector reads Amazon) is down to 1. Mirakl still shows 3.
- 9:40 AM — You sell 2 on Mirakl, because it still lists 3. You've just sold 4 units while holding 3.
- 10:00 AM — You upload the next CSV showing "1 unit". Too late: you already have an order to cancel.
The CSV interval is exactly your risk window. The longer it is, the more likely the collision. That's why the goal isn't "upload the CSV more often", it's eliminating the CSV and syncing event by event.
The right approach: event-driven sync
The reliable alternative is that every stock change propagates by event, not by clock. With Odoo as the source of truth, a well-built connector does three things in a single flow:
- Reads sales from each channel as soon as they happen (via webhook where the marketplace allows it, or very frequent polling where it doesn't) and creates the order in Odoo.
- Deducts stock in Odoo and recalculates the available quantity (net of reservations) on the spot.
- Pushes the new available quantity to every other channel immediately, not on the next batch.
That way the CSV disappears, SKU mapping is configured once, and the figure every channel sees always comes from the same calculation. The risk window shrinks from "one hour" to "however many seconds the marketplace takes to apply the change".
What to demand from a connector (an honest checklist)
Not all connectors are equal. Before buying one, ask:
- How often does it sync? By event/webhook or by interval? If by interval, what interval? That figure is your risk window.
- What exactly does it push? It should send the available quantity (free stock, net of reservations), not raw physical stock, or you'll keep selling units already committed.
- How does it map SKUs between Odoo and each channel? By internal reference, by barcode, by a manual map?
- What happens if a call fails? A serious connector retries, logs the error, and never leaves stock half-updated (idempotency and a job queue).
- Does it support multi-warehouse setups and per-channel stock rules (for example, reserving part of the inventory for your own website)?
- Which Odoo versions is it maintained for? (17, 18, 19.)
Be wary of anyone who promises "real time" without qualifying the marketplace's own latency. An honest vendor tells you where they can, and can't, fully close the window.
What a connector does NOT fix (let's be honest)
- The marketplace's own internal latency. Amazon queues inventory feeds and can take from minutes to over half an hour to apply them during peaks. No connector removes that; what it does remove is the delay that depends on you (the CSV, the hourly cron, the manual adjustment).
- Bad starting data. If your stock in Odoo doesn't match the real warehouse, the connector will faithfully propagate a wrong figure. Fix the inventory first, then sync.
- Real stockouts. If you don't have the product, no sync can invent it. For very critical, low-unit SKUs, a small safety buffer still makes sense as a backstop.
Sync methods compared
| Method | Latency / risk window | Maintenance effort | Who's it for? |
|---|---|---|---|
| CSV / manual | Hours. Stale on upload. | High and daily. Doesn't scale. | Few SKUs, a single channel. |
| Batch cron (every X min) | The cron interval. | Medium. Needs monitoring. | Medium volume, low turnover. |
| Event-driven connector | Seconds (+ channel latency). | Low once configured. | Several channels, high turnover. |
Are there free OCA alternatives?
Yes, and it's worth knowing about them. The OCA community maintains the connector repository (the queue/job framework) and connectors such as connector_woocommerce or pieces for prestashop, free and AGPL-licensed. If you sell on those channels and have a technical team to install it, configure the job-queue and maintain it, they're a perfectly valid and honest option. Event-driven sync can be built on top of them.
The practical limit: for Amazon, Mirakl or ManoMano there is no production-ready, maintained OCA connector. Building order import, pushing available stock, error handling, retries and SKU mapping takes weeks of real work. That's where a proven proprietary connector saves time. It's not magic: it's code someone has already written, tested and maintains for every Odoo version.
One single stock figure, across all your channels
Mirakl connector for Odoo 17, 18 and 19: reads orders from each marketplace, deducts stock in Odoo as the single source, and pushes the recalculated available quantity to every channel. Built and maintained by engineers in Barcelona.
See the Mirakl connector (100 EUR)Selling on Amazon, Shopify or ManoMano and not sure which connector you need? We'll tell you in 1 minute, free and with no sign-up:
Take the connector testFAQ
What should be the source of truth for stock?
Odoo. It's the only place where purchases, adjustments, returns and sales from every channel converge, so it's the only one that knows the real quantity. The rule: stock is calculated in Odoo and pushed to each marketplace, never the other way round.
Why does CSV or manual adjustment fail?
A CSV is a stale snapshot: between exporting it, uploading it and the channel processing it, minutes or hours pass during which the figure is no longer valid. It's also prone to mapping errors (SKU, columns, decimals) that publish wrong quantities all at once. It doesn't scale past a few dozen products.
What if it sells at the same time on Amazon and Mirakl?
Without event-driven sync, both can sell the same unit before Odoo deducts it and notifies the other channel: overselling, cancellation and a penalty. The fix is that every sale deducts stock in Odoo instantly and the new available quantity is pushed to the rest immediately.
Is Odoo's standard Inventory enough?
Odoo Inventory manages internal stock, but it doesn't talk on its own to Amazon, Mirakl, ManoMano or Shopify. You need a connector that reads sales from each channel, records them in Odoo, and pushes the available quantity back out. Without that layer, neither Odoo nor the marketplaces know what's selling elsewhere.