Automatic Order Cancellation
The order the channel cancelled stops existing in Odoo too
Checks on its own for orders the marketplace has cancelled and cancels them in Odoo along with their pending transfers, releasing the stock they had reserved. Without sending the buyer a second email.
How you get it
Every development works in all three Odoo environments. The only thing that changes is how we deliver it.
Odoo Online (SaaS)
You do not need the ability to install modules. A Millora consultant comes in with temporary access that you authorize and implements it with Odoo Studio. When they are done, you revoke the access.
Odoo.sh or your own server
You receive the module and the installation guide by email as soon as payment clears. Install it yourself, or we install it with you.
Installation · shell
# 1 · copia el módulo a tu addons_path
cp -r millora_cancelacion_automatica_de_pedidos /mnt/extra-addons/
# 2 · reinicia y actualiza la lista de apps
odoo-bin -u all -d tu_base --stop-after-init
# 3 · instala desde Apps
# busca "Automatic Order Cancellation"What it solves
The problem
An order cancelled on the marketplace does not cancel itself in Odoo. It stays alive: holding stock that will never be sold, counting in the sales report, and waiting for a delivery nobody is going to make.
And they don't get cancelled one by one because nobody is watching them. They surface at the close, when someone notices availability doesn't add up or that there are transfers pending from three weeks ago.
On a marketplace, cancellation isn't an edge case: it's a rate. A percentage of volume always cancels, and past a certain volume that percentage stops being a loose end and becomes somebody's daily job.
How it works
A scheduled process reviews the orders whose channel status came back as cancelled — recognising the different ways each marketplace spells that word — and cancels them in Odoo along with their pending transfers. The stock they were holding returns to availability right then.
Without emailing the buyer. The marketplace already told them; a second notice coming out of your Odoo only confuses someone who already knows their order was cancelled.
And before cancelling it checks the one thing that actually matters: that no goods have shipped. An order with a validated transfer is left alone. That isn't a cancellation problem, it's a return problem — and they are different things, with different consequences for stock.
When the goods already shipped
That case is covered by an additional scope, and it is where Full and Drop stop resembling each other.
On fulfilment, the goods sit in the marketplace's distribution centre and your team never touches them. The channel handles the return, so the return is generated and applied on its own: Odoo only has to reflect something that already happened on the other side.
On dropshipping, the parcel left your warehouse and the return comes back into your warehouse. There the return is created on hold, and stays pending until somebody physically receives the product and validates it.
The difference is not a configuration detail. On fulfilment, automating the return is correct because there is nothing to verify on your side. On dropshipping, automating it would mean accepting stock that hasn't arrived yet — and that throws the warehouse off with the best of intentions.
What it does not do
It does not decide what gets cancelled. It obeys the status the channel carries. If the marketplace flagged an order wrongly, the module cancels it anyway: it is an executor, not a judgement.
The base scope does not return goods. It leaves out orders with a validated delivery rather than touching them. Automatic returns — and the different behaviour for Full and Drop — is a scope quoted separately.
It does not replenish or reorder. It releases the stock; what to do with it is another decision.
It does not say why it was cancelled. An order the buyer changed their mind about looks the same as one the channel pulled for overselling. If that distinction matters for analysis, it lives in another report.
It depends on the channel status reaching Odoo. That is what triggers everything: without that field the process has nothing to review.
What changes
Stock stops being held for orders that no longer exist. Which is a silent discrepancy: it never shows up as an error anywhere, it just makes a product look out of stock when it isn't — and on a marketplace, looking out of stock means not selling.
And nobody has to review a list every day for that not to happen.
What's included
- Periodically reviews orders whose channel status came back as cancelled, and cancels them in Odoo
- Cancels their pending transfers too, returning the reserved stock to availability
- Recognises the different ways each marketplace spells the cancelled status
- Sends the buyer no cancellation email: the channel already told them
- Leaves out orders with a validated delivery, which are a return case and not a cancellation
- Runs on its own, on the schedule you set, with nobody reviewing a list
- Processes in batches, so it doesn't load the whole database on every run
Requirements
- Sales module active
- Odoo Marketplugin, or another integration bringing the channel's order status into Odoo: that is what triggers the cancellation
- Deciding which channel status values count as cancelled
- Deciding how often the review runs
- For automatic returns: knowing which orders are fulfilment and which are dropshipping, because they behave differently
You might also need
Marketplace Sales Comparator
Which channel sale never reached Odoo, and for how much money
Sales
Denied Products in Sales
What they asked for and you didn't have, recorded instead of deleted
Sales
Profitability by Channel
What each channel actually leaves you, commission already deducted
Sales

