Marketplace Feeder
Thousands of Marketplace Listings, One Action List
About 1,800 listings from 7 feeds checked against 577 products every cycle, turned into one action list.
At the company where I work, we sell the same products on several marketplaces and on our own Shopify stores. Marketplace Feeder is the system I built to keep all of that under control.
It checks every sales channel (Amazon, Noon, Carrefour and our Shopify stores) against the Odoo catalog and gives the team one action list per product. Nobody compares listings and stock by hand anymore.
The problem
Nobody asked me to build this. I noticed it. Stock, prices and listings lived in different systems, and each system had its own product IDs. They could not be compared, so nobody could say with confidence what was listed where.
The scale made it worse. 200 products on 5 marketplaces is easily 1,000+ listings. Checking that by hand is slow, and the mistakes are costly. The biggest risk was overselling: a listing that says we have stock when we don’t. The opposite problem is quieter: stock sitting in the warehouse with no active listing, earning nothing.
Constraints
- No common product ID. Odoo, Shopify and each marketplace describe the same product differently.
- Not every marketplace has an API. Some channels simply don’t let you pull your listings automatically.
- A live ERP. The results had to land inside Odoo, where the team already works, without disturbing it.
- A wrong answer costs more than a missing one. If the system matches the wrong listing to a product, someone acts on bad information.
What I built
Every cycle follows the same path, from raw data to a task the team can act on.
- Collect. Odoo and Shopify are read directly through their APIs. For marketplaces without an API, I use their inventory exports. Power Query cleans and organises those exports, keeps the field names identical every cycle, and the whole refresh is a single Update button in Excel.
- Standardise and store. Every source is turned into the same shape and saved as a feed. A feed is saved all at once or not at all.
- Match and decide. Each listing is matched to an Odoo product by exact IDs. Rules then decide what needs attention.
- Hand over. The result is written into Odoo as an issue list, with one action per product.
The team gets four kinds of action:
- List stock: a stocked product has no active listing.
- Activate a listing: the listing exists but is inactive.
- Stop a listing: it claims stock we don’t have.
- Price issues: a price is out of range, or a higher spec is priced below a lower one.
There is a second benefit I didn’t plan for. From inside Odoo you can now see where each product is listed, how many variants it has, and on which marketplace account.
Key decisions
1. If a channel can export its inventory, it can be fed in. The alternative was to wait for every marketplace to offer an API, or to leave those channels out. Leaving them out would have meant a blind spot on exactly the channels we couldn’t check. Power Query turned each export into clean, predictable data, so the system doesn’t depend on what a platform chooses to offer.
2. Match by exact IDs only, never by title. Matching on product titles would have found more matches, and it would have been right most of the time. But “most of the time” is the problem. A missing match is a to-do. A wrong match oversells. So a listing is only matched when the IDs agree exactly.
3. Fail closed. If a feed is stale, a setting is missing, or a batch is only half finished, the run stops. I would rather have no new list than a list built on half-finished data. Nothing half-done reaches Odoo.
4. AI only cleans titles. It never decides which product is which. Marketplace titles are messy, and an AI model is good at tidying them. I use it for that and nothing else. Identity stays with the exact IDs, so a confident but wrong guess can’t turn into a wrong action.
5. One door per job, with settings in one place. Publishing, reading storage and talking to Odoo each go through a single path, and the settings live in one place. The result is that storage can be swapped, and the same setup can serve another company without being rebuilt.
Outcome
The main result is awareness and time to action. The team can now see what is listed where, decide quickly (list it here, not there) and act. Stock and pricing errors get caught along the way.
Here is the scale it runs at:
- Every cycle checks about 1,800 listings from 7 feeds against 577 products.
- In a full run on 14 October 2026, all 577 of 577 products were accepted, none were rejected, and the system raised 202 actions for the team.
I don’t have a measured figure for hours saved or overselling avoided, so I won’t invent one.
What I’d do next
Today a person starts each run and uploads the marketplace exports. The next steps are to run it on a schedule, twice a day, and to send alerts to the team’s chat so that problems reach people without anyone opening Odoo.
Takeaway
A wrong match is worse than a missing one: a missing match is a to-do, a wrong one oversells.








