Into Odoo
The three ways to write into Odoo, where each object lands, what each way needs and which of them can roll back.
Last updated: 28 October 2026
Sources that can move into Odoo: Spreadsheet / CSV, HubSpot, Pipedrive, Twenty, Attio. A CSV import is free. A CRM migration is priced by record count; the sample is free. See pricing.
Object by object: What objects are supported for Odoo migrations.
What Shuttio writes
- Companies and contacts: Companies and contacts go to Odoo's partners (res.partner), a contact linked to its company in a second pass. A partner is matched by domain or email and updated, not duplicated.
- Deals and leads: Deals go to CRM opportunities and leads to CRM leads (when Odoo has leads switched on). Each source pipeline is recreated as a sales team with its stages in the source's order, and won and lost stages are kept.
- Products: Into Odoo products (product.template), with the SKU, price and cost where the source has them.
- Projects and their tasks: From Pipedrive, into Odoo's Project app (it must be installed). A project keeps its name, customer, manager (matched by email), dates, description and tags, with its stage when your Odoo has project stages and a tag when it does not. A task goes to its project with its stage in that project, deadline and assignee. Time sheets, files and subtasks do not move, and the Odoo app does not carry them yet.
- Custom fields: A source column goes to an existing writable x_ field you pick, or to a new x_ field Shuttio creates when your key has the rights. A field Odoo refuses is named in the run summary and never fails the run.
- Owners, matched by email: A record's owner becomes the Odoo salesperson with the same email. An owner with no match goes to the fallback user you choose before the run.
- Notes, tasks and meetings: Notes become internal notes in the record's chatter. An open task becomes a scheduled To-Do activity; a completed one becomes a Done entry in the chatter. A meeting becomes a Calendar event when the Calendar app is installed, and a chatter note when it is not.
- Emails, in the chatter: From HubSpot and Pipedrive, written as email messages in the chatter of the contact, company or opportunity they belonged to, with the sender, subject, date and body. Recipients are named in the body and are never notified. Affinity emails do not move: its API returns no email bodies.
- Files, as attachments: Each file becomes an attachment on the same record, when you connect with an API key. The import package and the Odoo app do not carry files.
- Three ways to write: Shuttio writes through an Odoo API key, builds an import package you load yourself, or writes through the Shuttio app installed in your Odoo.
Where each thing lands
| From | Object | Lands in Odoo as |
|---|---|---|
| HubSpot | Contacts | Partners (contacts) |
| HubSpot | Companies | Partners (companies) |
| HubSpot | Deals | CRM opportunities |
| HubSpot | Products | Products |
| HubSpot | Leads | CRM leads |
| Pipedrive | Persons | Partners (contacts) |
| Pipedrive | Organizations | Partners (companies) |
| Pipedrive | Deals | CRM opportunities |
| Pipedrive | Products | Products |
| Pipedrive | Projects | Projects (Odoo Project app) |
| Pipedrive | Project tasks | Project tasks (Odoo Project app) |
| Pipedrive | Leads | CRM leads |
| Twenty | Companies | Partners (companies) |
| Twenty | People | Partners (contacts) |
| Twenty | Opportunities | CRM opportunities |
| Attio | Companies | Partners (companies) |
| Attio | People | Partners (contacts) |
| Attio | Deals | CRM opportunities |
The three ways, side by side
| API key | Import package | Odoo app | |
|---|---|---|---|
| For | Odoo Online (Custom plan), Odoo.sh or an Odoo server Shuttio can reach. | An Odoo plan without API access. Shuttio builds files; you load them in Odoo. | Odoo.sh or your own server. You install a free app. |
| Matched records | Updated, not duplicated. | Odoo cannot check for contacts you already have. Load into an Odoo without them, or expect duplicates. | Linked, not changed. |
| Files | Yes. | No. | No. |
| Tasks and meetings | An open task is a scheduled To-Do activity, a meeting a Calendar event (a chatter note without the Calendar app). | Lines in each record's internal note. | An open task is a scheduled To-Do activity, a meeting a Calendar event with its contacts as attendees. A done task is a note in the chatter. |
| Your own fields | Into an existing writable x_ field, or a new one if the key may add fields. | Odoo Standard cannot add fields, so they go into each record's internal note. | Into x_ fields; a field Odoo refuses is named in the summary. |
| Retry | Yes. | Retry is not available for an import package. The Errors tab lists the records left out and why. | Retry is not available for the Odoo app yet. Resume carries on from where the migration stopped. |
| Rollback by Shuttio | Yes. | No. In Odoo, filter by the tag "Migrated <date>", select all and delete. | Yes. |
| New records since the import | Yes. | New records since the import cannot be added to an import package. | Updates since the last run are not available for the Odoo app yet. |
What each way needs
- API key: Odoo 17 or later. On Odoo Online the external API is part of the Custom plan only. Create the key in your profile under Account Security, then New API Key, use an administrator's key, and set it to last until the migration ends.
- Adding fields needs an administrator (Settings, Users, Access Rights: Administration). With a key that cannot, fields set to "Create a new field" are skipped and the records import without them. The run names them.
- Odoo app: Download the Shuttio Migration app, unzip it into your Odoo addons folder, then install it from Apps. In Odoo, open Settings, then Shuttio, and press Connect migration. Sign in here and pick this migration.
- Import package: In Odoo, open the list named below. Open the gear menu and choose Import records. Upload the file, press Test, then Import. Turn on Leads in CRM settings before you load the leads file.
Known limits
- Source lists: The Odoo writer has no place for a CRM list or saved filter, so none is written. The members stay in the source.
- Custom objects: Shuttio writes companies, contacts, deals, leads and products into Odoo, and projects with their tasks into its Project app. Any other object is not written, and its columns can go to x_ fields on those five.
- Rollback of an import package: A package is loaded by you, so Shuttio wrote nothing to your Odoo and cannot remove it. In Odoo, filter by the tag "Migrated <date>" the package puts on its records, select all and delete. Runs through an API key and through the Odoo app roll back with Shuttio.
- A rollback leaves a stage, team, tag or partner that your own records now use, and names each one.
- An import package is deleted 7 days after it is built, or when you finish the load guide. Its download links work for 24 hours.
How rollback differs by way: Roll back.
Not answered here? Email help@shuttio.com.