CRM migration
Field-level mapping, validation, and rollback between Link app and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Link app
Source
Odoo CRM
Destination
Compatibility
9 of 10
objects map 1:1 between Link app and Odoo CRM.
Complexity
BStandard
Timeline
24–48 hours
Overview
The Link App stores contacts, companies, deals, and activities in a flat relational structure accessed via its REST API. Odoo CRM uses a PostgreSQL-backed object model with res.partner for contacts and companies, crm.lead for leads and opportunities, and mail.message for activity history. We map Link App contacts directly to Odoo res.partner records, Link App companies to res.partner records with type='company', and Link App deals to Odoo crm.lead (type=opportunity). Activity records (calls, meetings, notes) become mail.message entries attached to the corresponding res.partner or crm.lead record. Custom fields in Link App are inspected during audit — those with no native Odoo equivalent are created as custom fields on the target model before data lands. We do not migrate workflows or automation logic, as Odoo's action-server and server-action model requires manual rebuild in Odoo Studio or via custom module. The migration runs against the Link App REST API, produces a sample diff, then commits the full load with a 24–48 hour delta window for records modified during cutover.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Link app object lands in Odoo CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Link app
Contact
Odoo CRM
res.partner
1:1Link App contact records map directly to Odoo res.partner. The partner's type field is set to 'contact' and its name field receives the concatenated first and last name from Link App. The email field links to Odoo's mail.thread for inbound message routing.
Link app
Company
Odoo CRM
res.partner
1:1Link App company records map to res.partner with type='company'. The address block (street, city, state, zip, country) migrates into Odoo's address fields (street, city, state_id, zip, country_id). The company name populates the partner's name field directly. Child contacts are linked via parent_id after the parent company record exists.
Link app
Contact
Odoo CRM
res.partner (with parent link)
1:1Link App contacts associated with a primary company receive parent_id pointing to the corresponding res.partner company record. If a Link App contact has multiple associated companies, the most-recently modified company is set as primary; the rest are added as secondary Contact Bindings via the account.move.line model if accounting is enabled, or stored as a custom many2many field.
Link app
Deal
Odoo CRM
crm.lead (type=opportunity)
1:1Link App deal records migrate as Odoo crm.lead with type='opportunity'. The crm.lead.name field receives the Link App deal name. Stage migration uses a value map — each Link App deal stage string is matched to an Odoo crm.stage record ID, creating the stage if it does not exist in the target Odoo database.
Link app
Pipeline Stage
Odoo CRM
crm.stage
1:1Link App pipeline stage names are mapped one-by-one to Odoo crm.stage records. The Odoo stage must exist in the target database before the migration runs — FlitStack generates a stage-creation checklist as part of the pre-migration schema plan. Probability values are set on the Odoo stage record and auto-populate crm.lead.probability.
Link app
Activity (Call / Meeting / Note)
Odoo CRM
mail.message / crm.phonecall / calendar.event
1:manyLink App activity entries are split by type: call activities become Odoo crm.phonecall records linked to the corresponding partner or lead; meeting activities become calendar.event records with start and stop datetime preserved; note entries become mail.message records with subtype='comment' attached to the target res.partner or crm.lead. All records retain the original author and creation datetime from Link App.
Link app
Owner / User
Odoo CRM
res.users
1:1Link App owner IDs are resolved by matching the owner email address to res.users.login in Odoo. Unmatched owners are flagged in the pre-migration report — teams either invite the user to Odoo first or assign their records to a fallback Odoo user designated during planning. No record lands without a valid Odoo user assignment.
Link app
Attachment / File
Odoo CRM
ir.attachment
1:1Link App file attachments are downloaded from the Link App CDN URL, re-uploaded to Odoo's ir.attachment model, and linked to the corresponding res.partner or crm.lead via res_model and res_id. Files are stored in Odoo's filestore under the original filename. File size limits follow Odoo's attachment configuration — large files may require Odoo filestore tuning.
Link app
Custom Field (contact/company/deal)
Odoo CRM
Custom field on res.partner or crm.lead
1:1Link App custom fields are audited during the discovery phase. Each custom field is classified by type — text, number, date, pick-list, or multi-select — and an equivalent Odoo field definition is generated. For Odoo Community, custom fields are defined in a thin custom module installed before migration; for Odoo Enterprise, fields are added via Studio or the technical menu. Fields with no Odoo equivalent are created as custom fields and populated from the Link App source value.
Link app
Link App URL / Web Link field
Odoo CRM
Custom char field on res.partner
1:1Link App custom fields that store URLs or external web links have no native Odoo equivalent — Odoo does not have a dedicated URL field type on res.partner or crm.lead. These are migrated as custom char fields (or custom m2o to a web.link model if your team wants to track link metadata). The original Link App URL value is preserved verbatim in the field.
| Link app | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Contact | res.partner (with parent link)1:1 | Fully supported | |
| Deal | crm.lead (type=opportunity)1:1 | Fully supported | |
| Pipeline Stage | crm.stage1:1 | Fully supported | |
| Activity (Call / Meeting / Note) | mail.message / crm.phonecall / calendar.event1:many | Fully supported | |
| Owner / User | res.users1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| Custom Field (contact/company/deal) | Custom field on res.partner or crm.lead1:1 | Fully supported | |
| Link App URL / Web Link field | Custom char field on res.partner1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Link app gotchas
No public API for automated bulk export
Document binaries may require separate file-level extraction
Case feed chronology does not map directly to standard CRM activity models
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Audit Link App data and Odoo schema
FlitStack AI pulls the full export from Link App via its REST API — contacts, companies, deals, activity records, attachments, and all custom field definitions with their data types and pick-list values. In parallel, we inspect the target Odoo database's existing schema: res.partner fields, crm.lead fields, crm.stage records, and res.users list. The audit produces a data dictionary that lists every Link App field, its Odoo target, the mapping type, and any Odoo configuration that must be created before data can land — including custom field definitions, stage records, and user mappings.
Create Odoo custom fields and stage records
Based on the audit, FlitStack AI generates the Odoo custom field definitions and stage records that the migration requires. Custom fields are defined in a thin custom module for Odoo Community or via Studio for Odoo Enterprise. Stage records are created in the CRM configuration so stage_id lookups resolve during the import. This step runs against the target Odoo instance before any data load begins — FlitStack delivers a checklist of what to confirm created so the migration can proceed without field-missing errors.
Resolve owners and validate user mappings
Link App owner IDs are matched by email address against the res.users table in Odoo. FlitStack AI generates a pre-migration owner report listing every Link App owner, the matched Odoo user (or 'unmatched' status), and the fallback assignment for each unmatched owner. The team reviews and approves the fallback owner before the migration run. No record is loaded without a confirmed user_id — this prevents orphaned records that have no responsible sales rep in Odoo.
Run sample migration with field-level diff
A representative slice — typically 100–500 records spanning contacts, companies, deals, and activities — migrates first. FlitStack AI produces a field-level diff comparing the Link App source values against the Odoo destination values for every mapped field. The team reviews the diff to confirm that pick-list value mappings are correct, stage assignments map as expected, parent/child relationships resolved properly, and activity records landed on the correct model. Any mapping corrections are made before the full run commits.
Full migration run with delta-pickup cutover
The full dataset loads in load-order sequence: companies, then contacts with parent_id, then deals with partner_id, then activity records split by type, then attachments. After the load completes, a delta-pickup window of 24–48 hours captures any Link App records modified or created during the cutover period. An audit log records every insert, update, and skip operation. If reconciliation finds missing records or unexpected values, FlitStack AI provides a rollback manifest and one-click rollback to the pre-migration snapshot.
Platform deep dives
Link app
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Link app and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Link app and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Link app and Odoo CRM.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Link app: Not publicly documented..
Data volume sensitivity
Link app doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Link app to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Link app to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Link app
Other ways to arrive at Odoo CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.