Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on invoice forty. I moved mine from Odoo 19 to Odoo 20 with an n8n workflow and the ODOO MCP from much ( available at the APP store for free) pointed at the new system, and the setup is simpler than it sounds: the old invoice goes in as context, the tool writes it into the new Odoo, and the agent handles the mapping in between.

What decides whether this works or turns into a mess is not the automation itself. It is the order of operations and the rules you give the agent.

Create contacts and products first

Before a single invoice moves, the contacts and the products need to exist in Odoo 20. I did that the classical Export / Import way

Three rules for every invoice

  1. Invoice date and number must stay identical. The imported invoice is not a new document. If the number or the date shifts, your books stop lining up with the old system.
  2. Search for the existing contact and map it. The agent looks the customer up in Odoo 20 and links it to the invoice with the new ID.
  3. Search for the existing product and map it. The same logic applies to the product lines.

And one hard constraint on top: do not create a contact or a product. If something is missing, the import should fail loudly instead of quietly filling your database with near-duplicates.

The prompt that does the work

The instructions I hand the agent are short and blunt:

  • Import the invoice from Odoo 19 into Odoo 20.
  • The old invoice is in this prompt, so use the much MCP tool to write it to the new Odoo.
  • Invoice date and number must be the same.
  • The contact already exists, so search for it in the new Odoo and map accordingly.
  • The product already exists, so search for it in the new Odoo and map accordingly.
  • Do not create a contact or a product.

Nothing about formatting, nothing about rewriting descriptions. The fewer decisions the agent has to make, the more predictable the result.

Check the result, then go again

  • Does the invoice number match the source exactly?
  • Is the invoice date unchanged?
  • Is it attached to the right contact?
  • Are the product lines pointing at products that already exist in Odoo 20?

Run one invoice, verify it, then let the workflow loose on the rest.

Why this approach holds up

Moving invoices between two Odoo systems is really a matching problem. The old system holds the documents, the new one holds the records those documents need to point at. n8n provides the workflow, the MCP tool gives the agent hands inside Odoo 20, and the rules stop it from guessing. Contacts and products first, dates and numbers untouched, lookups instead of creations: that combination is what made the migration boring, which is exactly what you want from an accounting import.

If you are planning the same move, start with the contacts and the products in Odoo 20. Get those right, and the rest of the migration is mostly bookkeeping.