CRM migration
Field-level mapping, validation, and rollback between AllClients and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
AllClients
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between AllClients and Odoo CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
AllClients exports all data as flat CSV files with no bulk write API, making every migration a file-transformation project rather than a direct API-to-API sync. We extract Contacts from the main Data Migration CSV, rejoin the separate Notes.csv using contact email as the join key, and push the combined record set into Odoo CRM via the XML-RPC or JSON-RPC API. AllClients Groups, which have no independent export, are captured as tag strings embedded in contact rows and materialized as Odoo contact tags post-import. Custom Field definitions discovered via the UpdateCustomFields endpoint map to Odoo's custom field model on the res.partner object. Owner records with Name and Email map to Odoo Users provisioned before contact import so that owner_id references resolve cleanly. Workflow definitions are captured as inactive templates; execution state, enrolled contacts, and historical run data do not move. Landing Pages and Popup Forms are skipped because AllClients does not expose them via export or API. Odoo CRM's Kanban pipeline stages are configured during schema design to reflect the stages present in the source AllClients account.
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 AllClients 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.
AllClients
Contact
Odoo CRM
res.partner
1:1AllClients Contacts map directly to Odoo res.partner records of type 'contact'. The Contact's email becomes the partner's email field and serves as the dedupe key during import. First name, last name, phone, address fields, and owner assignment migrate to the equivalent Odoo partner fields. AllClients Tags embedded in the contact row are parsed and applied as Odoo partner tags after the base record insert so that the contact is available for tag assignment on the same migration pass.
AllClients
Contact Notes
Odoo CRM
mail.message (Chatter)
1:1AllClients Notes export as a separate Notes.csv that must be rejoined to the main Contact CSV before Odoo import. We use contact email as the primary join key and AllClients record ID as a fallback where email is missing or changed. Each Note becomes a mail.message record posted to the res.partner's Chatter thread with message_type = 'comment', preserving the original note body and timestamp. Note records without a matching contact after the join are held in a review queue for manual resolution.
AllClients
Custom Fields
Odoo CRM
ir.model.fields (custom)
1:1AllClients Custom Field definitions discovered via the UpdateCustomFields API during scoping map to custom ir.model.fields entries on the res.partner model in Odoo. Field types are mapped: text fields become char or text, numeric fields become float or integer, date fields become date. Custom field values from the AllClients contact export are written to the corresponding Odoo custom field after the res.partner record is created. Multi-value custom fields (e.g., checkbox groups) map to Odoo many2many tags or selection fields depending on value cardinality.
AllClients
Tags
Odoo CRM
res.partner.category
1:1AllClients Tags applied to contacts are embedded in the contact CSV export as comma-separated values. We parse the tag list for each contact and create corresponding res.partner.category records in Odoo if they do not already exist, then create res.partner.category.rel records linking the contact to each tag. Tags used for group membership are distinguished from content-classification tags and preserved with a category prefix so the customer can filter by source after migration.
AllClients
Groups / Workgroups
Odoo CRM
res.partner.category (tag-based)
1:1AllClients Groups have no independent export — group membership is established by filtering the contact export by group name. We capture group membership for each contact as a named tag (group name prefixed with 'Group:') applied to the Odoo res.partner record. If the customer requires formal Odoo Sales Teams, we materialize the group-to-owner relationship: each AllClients Group maps to an Odoo crm.team, and contacts in that group are assigned to the corresponding team lead (mapped from the AllClients Group's owner).
AllClients
Users / Owners
Odoo CRM
res.users
1:1AllClients Users are captured from the admin export with Name, Email, and role/permissions. We match each AllClients Owner referenced on a Contact record by email to an existing Odoo User record. If the Odoo destination does not yet have a matching User for an AllClients owner, the contact is temporarily assigned to the migration admin and flagged for the customer's Odoo admin to provision the User record before final owner_id resolution. Active vs inactive status maps directly.
AllClients
Email Templates
Odoo CRM
mail.template
1:1AllClients Email Templates stored under the Email Marketing section export as HTML blobs. We import them into Odoo's mail.template model with the original HTML preserved as body_html. Inline image references that point to AllClients-hosted URLs are flagged for the customer to re-host or upload to Odoo's ir.attachment storage; we document each external URL for manual follow-up. Template subject lines map to subject field, and name maps to name.
AllClients
Campaigns
Odoo CRM
crm.tag or crm.team
1:1AllClients Campaigns represent scheduled email sends linked to contact segments. Campaign names and linked segment definitions migrate as named Odoo crm.tag records. Campaign history (send dates, open rates, click rates) is metadata attached to the campaign record rather than a discrete relational object in AllClients and cannot be programmatically extracted, so we document the known campaign names and segment sizes for the customer's admin to recreate in Odoo's email marketing or CRM campaign model.
AllClients
Tasks / Follow-up Reminders
Odoo CRM
crm.activity
1:1AllClients Tasks and Follow-up Reminders export from the Tasks section with title, due date, completion status, and owner assignment. We map them to Odoo crm.activity records with activity_type derived from the task category (call, email, meeting, generic). Completed vs pending status maps to Odoo's activity_date_done field. Tasks created as part of AllClients Workflow sequences are migrated as standalone crm.activity records; the workflow automation itself does not carry over.
AllClients
File Attachments
Odoo CRM
ir.attachment
1:1AllClients file attachments associated with Contact records are downloaded from AllClients storage and re-uploaded to Odoo's ir.attachment model with res_model = 'res.partner' and res_id pointing to the migrated contact record. Binary files over 10 MB are chunked for download and upload to stay within typical HTTP timeout thresholds. Attachments with no parent contact after the migration (orphaned files) are flagged for manual review.
AllClients
Landing Pages and Popup Forms
Odoo CRM
Skipped
1:1AllClients Landing Pages and Popup Forms are available on Premium and Elite tiers but are not exposed via the AllClients API or export tools. HTML content, form field definitions, and submission data cannot be programmatically extracted. We skip these objects and flag them during scoping so the customer is aware they must rebuild landing pages and forms in Odoo's Website builder or Forms module post-migration.
AllClients
Workflows
Odoo CRM
crm.lead.scoring (as inactive template)
lossyAllClients Workflow definitions (triggers, conditions, actions, delays) are captured during scoping as a JSON-serialized template. Execution state — which contacts are enrolled, which steps have completed, historical run data — is not available via AllClients export or API and cannot be migrated. We deliver the workflow definitions as a written configuration inventory with a description of each trigger, condition branch, and action for the customer's Odoo admin to rebuild as Odoo Automated Actions or Studio Workflows. Contacts enrolled in active workflows at migration time are not automatically re-enrolled; we recommend a manual high-priority re-enrollment process post-migration.
| AllClients | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Contact Notes | mail.message (Chatter)1:1 | Mapping required | |
| Custom Fields | ir.model.fields (custom)1:1 | Mapping required | |
| Tags | res.partner.category1:1 | Fully supported | |
| Groups / Workgroups | res.partner.category (tag-based)1:1 | Mapping required | |
| Users / Owners | res.users1:1 | Mapping required | |
| Email Templates | mail.template1:1 | Fully supported | |
| Campaigns | crm.tag or crm.team1:1 | Mapping required | |
| Tasks / Follow-up Reminders | crm.activity1:1 | Mapping required | |
| File Attachments | ir.attachment1:1 | Mapping required | |
| Landing Pages and Popup Forms | Skipped1:1 | Not supported | |
| Workflows | crm.lead.scoring (as inactive template)lossy | Mapping required |
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.
AllClients gotchas
Contact count limits enforced as hard caps per tier
Notes export separately from main contact CSV
Workflows migrate as inactive templates only
API rate limits are undefined and enforced at vendor discretion
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
Discovery and AllClients export audit
We audit the source AllClients account for tier (Select, Premium, Elite), contact count, user count, active custom field definitions, Notes.csv structure, Group list, active workflows, and any attachment volume. We download the primary Contact CSV and the separate Notes.csv and verify row counts match expected relationships. If the account is at or near a tier contact limit, we confirm the full dataset has been exported before the customer cancels, since accounts over the free-tier limit may have suppressed records in exports while the account was active. The discovery output is a written migration scope confirming object inventory, row counts, and any AllClients objects that will be skipped.
Note rejoining and data normalization
We run the Notes-to-Contact join using contact email as the primary key and AllClients record ID as the secondary key. Contacts with changed email addresses produce unmatched note rows, which we flag for the customer's review. We also normalize AllClients field values during this step: phone number formatting, date formats, and tag delimiters are harmonized to Odoo's expected input formats. The output is a unified contact dataset with notes embedded per record, ready for Odoo field mapping.
Odoo schema provisioning and pipeline design
We provision the Odoo CRM app, configure the CRM pipeline stages to reflect the AllClients workflow stages present in the source data, and create any custom ir.model.fields entries on res.partner that correspond to AllClients Custom Fields. If AllClients Groups are present, we create the corresponding crm.team records and plan the group-to-tag materialization. Odoo Users are provisioned or matched by email before contact import begins so that owner_id references resolve at insert time. Schema provisioning runs in an Odoo staging environment first for validation.
Contact, Note, and tag migration
We import contacts into Odoo res.partner records via the XML-RPC or JSON-RPC API, using the contact email as the external identifier for deduplication. Notes are posted as mail.message Chatter entries immediately after each contact record is created. Tags parsed from the contact CSV are applied as res.partner.category records. Group membership is materialized as tags prefixed with 'Group:' so the customer can distinguish group-based segmentation from other tag types. Owner assignments are resolved against Odoo Users; unresolved owners are flagged in the reconciliation report for the customer's admin to provision.
Attachment download and Odoo re-upload
We download file attachments from AllClients storage linked to each contact record and re-upload them to Odoo ir.attachment with res_model = 'res.partner' and res_id pointing to the migrated contact. Attachments over 10 MB are chunked for transfer. Attachments with no resolvable parent contact are reported separately for manual follow-up.
Workflow and automation inventory delivery
We capture every AllClients Workflow definition as a written configuration document describing the trigger, conditions, condition branches, actions, and delays for each active workflow. We do not migrate workflow execution state or enrolled-contact lists. The inventory document is handed off to the customer's Odoo admin with a mapping to Odoo Automated Actions and Studio Workflows equivalents. The customer or a certified Odoo partner rebuilds the automations post-migration as a separate engagement.
Cutover, validation, and post-migration handoff
We freeze writes to AllClients at cutover, run a final delta migration of any records modified during the migration window, then confirm Odoo CRM as the system of record. We validate record counts across all migrated object types, spot-check 25-50 records against the source AllClients export, and deliver a migration summary report. We support a one-week hypercare window for reconciliation issues raised by the customer's team. We do not provide post-migration admin support, training, or workflow rebuild as standard scope.
Platform deep dives
AllClients
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across AllClients and Odoo CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
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
AllClients: Not publicly documented — platform reserves the right to limit usage at discretion.
Data volume sensitivity
AllClients 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 AllClients to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your AllClients 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 AllClients
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.