Affinity to Odoo migration
Shuttio moves persons, organizations and opportunities from Affinity into Odoo, with notes, tasks, meetings, calls and files (with an API key). A full migration is free under 5,000 records in total: contacts, companies, deals, notes, activities and files together; otherwise it is priced by record count, from $249 up to 50,000 records. It starts with a free sample of every object you tick (5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records), so you read the result in Odoo before the full run, and a rollback removes what it created.
- Can I move Affinity to Odoo?
- Yes.
- What moves:
- Persons, organizations and opportunities, with notes, tasks, meetings, calls and files (with an API key).
- What doesn't:
- A deal's own currency; Emails; Source lists.
- Price:
- Free under 5,000 records in total: contacts, companies, deals, notes, activities and files together. Otherwise $249 up to 50,000 records, once per migration. The sample is free.
- How long:
- A free sample first, then the full run as one background job with live progress. The time depends on your record count and on Affinity's API request limits.
- Moves
- 3 kinds of record, plus notes, tasks, meetings, calls and files (with an API key)
- Doesn’t move
- 3 things, each with the reason
- Connect
- Affinity: An API key, pasted once and validated against your tenant before anything runs. Odoo: API key, import package or the Shuttio app
- Price
- Free under 5,000 records in total; otherwise from $249. The sample is free
Where each Affinity object lands
Read from the code that runs the migration. Source column names are shown as the source reports them.
| Affinity object | Lands in | Standard fields |
|---|---|---|
| Persons | Partners (contacts) |
|
| Organizations | Partners (companies) |
|
| Opportunities | CRM opportunities |
|
Every other property goes to an x_ field you pick, or is skipped. A company matches by website domain and a contact by email before anything is created; a match is linked, never written and never removed.
Notes, tasks, meetings, calls, emails, files, owners and lists
| Kind | How it moves | What happens |
|---|---|---|
| Notes | Yes | Internal notes in the chatter of the record they belonged to. |
| Tasks | Yes | An open task becomes a scheduled To-Do activity; a completed one becomes a Done entry in the chatter. |
| Meetings | Yes | A Calendar event when the Calendar app is installed, a chatter note when it is not. |
| Calls | Yes | Each call is a Done entry of Odoo's Call activity type in the chatter of its record, dated when it happened, with the direction, length and outcome at the top. |
| Emails | No | Affinity's API returns an email's subject and recipients but never its body, so Shuttio imports none. |
| Files | With an API key | Attachments on the same record, only when you connect Odoo with an API key. The import package and the Odoo app do not carry files. |
| Owners | No | Affinity's API names a note's or reminder's creator by user id and gives no email to match. Records arrive without a salesperson; a reminder goes to the fallback user you choose and a note is written by the connected user. |
| Lists | No | Odoo has no place for a CRM list or saved filter, so none is written. The members stay in the source. |
Deal pipelines and stages
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. Each Affinity opportunity list is a pipeline: its Status values are the stages, in the order Affinity ranks them, and an opportunity takes the Status of its list entry. A Status named like won or lost is read as that outcome. A lost deal is archived with its lost reason; a won deal goes to a won stage.
Your own fields
A source field with no Odoo counterpart goes to an existing writable x_ field that you pick, or to a new x_ field when your Odoo key may add fields (text, number, true/false, date, date and time, selection, or a link to a contact or company). A value that does not fit the field's type is left out and counted, never guessed.
3 things that don’t move
Each has a reason. You would find them on day two, so they are here on day zero.
A deal's own currency
Doesn't moveShuttio writes the deal amount into Expected revenue and sets no currency per deal.
Emails
Doesn't moveAffinity's API returns an email's subject and recipients but never its body, so Shuttio imports none.
Source lists
Doesn't moveThe Odoo writer has no place for a CRM list or saved filter, so none is written. The members stay in the source.
How the move runs
- 1
Source
Choose Affinity as the source and Odoo as the destination.
- 2
Connect
Affinity: An API key, pasted once and validated against your tenant before anything runs. Odoo: one of three ways: an API key, an import package that you load yourself, or the Shuttio app installed in your Odoo.
- 3
Options
Up to five switches decide which kinds of data the next steps offer, such as custom fields, lists and custom objects. Nothing is written yet.
- 4
Objects
Tick what to move. Each row shows where the object lands in Odoo.
- 5
Fields
Rename a field, skip it, or point it at a field that exists. When a field goes into an existing field, the step warns you that values on matched records are overwritten, and counts the fields concerned.
- 6
Filters
Limit which records move, per object. Filters do not change the price.
- 7
Import
A free sample runs first: 5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records. A deal in the sample still finds its company, because every object takes the records linked to the ones already picked. Lists and files move with the full migration. You open the result in Odoo, then run the full migration. The run page shows your band and price; you pay at Checkout. Pause, resume and cancel work while it runs. The Records tab lists every source record as moved, updated, skipped or failed, with the reason, and downloads as a CSV. Move new records brings over the records created in Affinity after the migration started. It is not offered for an Odoo import package or the Odoo app.
Price
A full migration into Odoo is free under 5,000 records in total: contacts, companies, deals, notes, activities and files together. Otherwise it costs $249 up to 50,000 records and $4,749 up to 5,000,000. You pay once per migration, and the sample is free.
| Records in your source | One-time price |
|---|---|
| Up to 50,000 | $249 |
| Up to 100,000 | $499 |
| Up to 200,000 | $749 |
| Up to 500,000 | $999 |
| Up to 1,000,000 | $1,499 |
| Up to 5,000,000 | $4,749 |
| Over 5,000,000 | Email help@shuttio.com |
- Each record of an object you tick counts once: a contact, company, deal, note, task or meeting. List memberships and attachments do not count toward the price. The count is shown before you pay. The free tier counts files too. Filters do not lower the count: the price counts everything in your source.
- Filters do not lower the price: it counts everything in your source. You see your band before the full run starts and pay at Stripe Checkout; nothing is charged before that.
- Move new records after the full run costs nothing more while the total stays within the band you paid for; past it, Checkout opens for the next band.
- A CSV import into Odoo is free, at any size.
Affinity to Odoo with Shuttio or by hand
Against a manual CSV export: a CSV is one object per file and a record export has no notes, tasks or meetings in it, so a deal's company is a column you match by hand and its notes, tasks and meetings are not in the file. Shuttio reads Affinity through its API, creates records first and links them second, matches records already in Odoo instead of duplicating them, and lists every record's outcome. If you only need one object's fields and no history, a CSV import is enough, and Shuttio runs those free into Odoo too.
Questions
How much does a Affinity to Odoo migration cost?
A full migration into Odoo is free under 5,000 records in total: contacts, companies, deals, notes, activities and files together. Otherwise it costs $249 up to 50,000 records and $4,749 up to 5,000,000. You pay once per migration, and the sample is free. Filters do not lower the price: it counts everything in your source. You see your band before the full run starts and pay at Stripe Checkout; nothing is charged before that.
What does the free sample move?
5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records. Lists and files move with the full migration. It is a real write into Odoo, so it can be rolled back.
What does not move from Affinity to Odoo?
A deal's own currency; Emails; Source lists. Each has a reason on this page.
Can I undo the migration?
Yes. Rollback deletes the records, notes, tasks, meetings, files and list entries that the sample or the full run created, in reverse order, from a ledger. A record that already existed in Odoo and was updated in place stays, and the values it overwrote are not restored; the Fields step warns you before the run. Runs through an API key or the Shuttio app roll back with Shuttio; an import package is loaded by you, so you remove it in Odoo by its tag.
Does it change anything in Affinity, and what about records created while I migrate?
Shuttio only reads from Affinity. It never writes to it. After the full run, Move new records moves the records created in Affinity after the migration started. Edits to records already moved are not copied. It is not offered for an Odoo import package or the Odoo app.
How does Affinity data get into Odoo?
Shuttio writes through an Odoo API key, builds an import package you load yourself, or writes through the Shuttio app installed in your Odoo. An import package is loaded by you, so Shuttio wrote nothing to your Odoo and cannot roll it back: 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. The API key needs an administrator's key on Odoo 17 or later, and on Odoo Online the external API is part of the Custom plan only. The import package is for a plan without API access. Import2 does not support Clarify or Odoo as a destination.
Move Affinity to Odoo in a free sample first.
Nothing is written to your new CRM until you have reviewed the objects and fields, and every CRM migration starts as a free sample: 5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records.