CRM migration
Field-level mapping, validation, and rollback between Act-On and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Act-On
Source
Odoo CRM
Destination
Compatibility
12 of 15
objects map 1:1 between Act-On and Odoo CRM.
Complexity
BStandard
Timeline
2-5 weeks
Overview
Act-On is a marketing automation platform centred on Contacts, Companies, audience Lists, and behavioral engagement scoring; Odoo CRM is a full pipeline management system built around Leads, Opportunities, Partners, and pipeline Stages. The two platforms have fundamentally different data models: Act-On stores prospects as Contacts with a lifecycle property, while Odoo separates them into CRM Lead records and Partner records. We resolve this by routing Act-On Contacts without an associated Deal into Odoo Leads and Contacts with active deal history into Partner records tied to Opportunities. Engagement scores migrate as static numeric fields because Act-On's proprietary weighting rules do not export. Automated Programs (nurture sequences) are not migratable as code; we document each sequence's step structure as a reference artifact for your Odoo admin to rebuild in Odoo Workflow or Studio. The migration uses Odoo's XML-RPC API with batch chunking and exponential backoff on throttled responses, proceeding in dependency order: Partners first, then Leads, then Opportunities, then activity history.
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 Act-On 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.
Act-On
Contact
Odoo CRM
Partner (res.partner)
1:1Act-On Contacts map directly to Odoo Partner records. The is_company flag is set false for individual contacts. The contact's email becomes the Partner's email field and is used as the dedupe key during import. Mobile phone maps to partner.mobile; direct phone maps to partner.phone. The Act-On lifecycle stage is preserved in a custom field act_lifecycle_stage__c on the Partner record.
Act-On
Company
Odoo CRM
Partner (is_company=True)
1:1Act-On Companies map to Odoo Partners with is_company=True. Company name becomes Partner name; domain maps to website. Each Contact in Act-On linked to this Company receives the Odoo Partner record as its partner_id. Parent company hierarchy in Act-On Company records maps to partner.parent_id in Odoo.
Act-On
Contact (without associated Act-On Deal)
Odoo CRM
CRM Lead (crm.lead)
1:manyAct-On Contacts that have no associated Act-On Deal and no customer lifecycle stage become Odoo CRM Lead records. Contacts with a customer lifecycle stage map to Partner records instead. We apply this routing rule during the pre-import transform and flag any Contact with both a company link and no deal history for the customer's admin to confirm during scoping.
Act-On
List
Odoo CRM
Partner Tag or Lead Tag
1:1Act-On audience Lists map to Odoo Tags on Partner (res.partner) or CRM Lead records. We export List membership as a tag name array per Contact and import as multiple res.partner.tag records linked via res.partner._ir_attachments. Static Act-On Lists migrate as literal tags; dynamic Lists are documented as a reference for Odoo's custom filter or Studio-based audience rebuild.
Act-On
Deal
Odoo CRM
Opportunity (crm.lead with type='opportunity')
1:1Act-On Deals map to Odoo CRM Opportunities. The Odoo crm.lead record is created with type='opportunity' and linked to the Company Partner record via partner_id. Deal stage maps to Odoo stage_id; the Odoo stage configuration must be created during schema design to match the customer's Act-On deal stage names and probabilities.
Act-On
Deal Stage
Odoo CRM
CRM Stage (crm.stage)
lossyEach Act-On deal stage maps to an Odoo CRM Stage record scoped to the customer's pipeline. Odoo stage probability percentages migrate from Act-On to crm.stage.probability. Stage sequence order is preserved. The customer approves the stage name and probability matrix during scoping before schema deployment.
Act-On
Engagement: Email
Odoo CRM
CRM Lead / Partner Activity Log
1:1Act-On email send, open, and click events migrate to Odoo as mail.message records linked to the target Partner or CRM Lead via res_model and res_id. The email subject, body (plain text and HTML), and engagement type (sent, opened, clicked) are stored. High-volume engagement history is chunked by date range to avoid Odoo RPC timeout.
Act-On
Engagement: Form Submission
Odoo CRM
CRM Lead / Partner
1:1Form submission records from Act-On migrate as CRM Lead creation events with the form name and submission timestamp preserved in custom fields. The lead source field is set to the Act-On form name for attribution. Submission field values map to custom lead fields defined during schema design.
Act-On
Engagement: Meeting / Call
Odoo CRM
Calendar Event (calendar.event)
1:1Act-On meeting engagements with start time, end time, and attendee list migrate to Odoo calendar.event records. The event is linked to the Partner (attendee) and the related Opportunity if one exists. Call duration and disposition from Act-On call records migrate to custom event fields.
Act-On
Engagement: Note
Odoo CRM
Note (mail.message)
1:1Act-On note engagements migrate to Odoo mail.message records with subtype='comment' attached to the Partner or CRM Lead. Note body migrates as message_body; author information maps to the partner_id of the Act-On owner who created the note. Notes without a date are assigned the Contact's createdate timestamp.
Act-On
Engagement Score
Odoo CRM
Custom Float Field on Partner
1:1Act-On's calculated engagement score migrates as a static numeric value in a custom float field on Partner (act_engagement_score__c). Act-On's proprietary weighting rules (opens, clicks, page visits, form submissions) do not export; we document the customer's current score range and scoring components so their Odoo admin can configure a replacement formula in Studio if needed.
Act-On
Custom Data Schema
Odoo CRM
Custom Fields via Odoo Studio
1:1Act-On Custom Data schemas define user-defined fields per Contact or Company. We read the schema definition via Act-On's Custom Objects API, export the existing field values, and write them to Odoo Partner or Lead custom fields created via Odoo Studio before migration. Field types are mapped to Odoo field types (char, float, integer, date, selection, many2one).
Act-On
Tag
Odoo CRM
Partner Tag
1:1Act-On contact and company tags export as Odoo Partner Tags. Tag names are preserved verbatim and linked via res.partner.tag and res.partner._ir_attachments or the tag_ids many2many relation on res.partner. Tags used for campaign segmentation are preserved separately from audience List tags for reporting flexibility.
Act-On
Owner
Odoo CRM
User (res.users)
1:1Act-On owners map to Odoo Users by email match. Any Act-On owner without a matching Odoo User is held in a reconciliation queue for the customer's admin to provision the User record before record import resumes. Inactive owners map to inactive users with a flag for the admin to activate post-migration.
Act-On
Program (Automated Workflow)
Odoo CRM
Documentation Artifact
lossyAct-On Automated Programs are not migratable as code. We export the Program name, step count, step types (email, delay, condition, action), and the Contact membership list as a written reference artifact. The customer's Odoo admin uses this to rebuild equivalent workflows in Odoo Studio using the contact and activity history migrated from Act-On as the reference data.
| Act-On | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Partner (res.partner)1:1 | Fully supported | |
| Company | Partner (is_company=True)1:1 | Fully supported | |
| Contact (without associated Act-On Deal) | CRM Lead (crm.lead)1:many | Fully supported | |
| List | Partner Tag or Lead Tag1:1 | Fully supported | |
| Deal | Opportunity (crm.lead with type='opportunity')1:1 | Fully supported | |
| Deal Stage | CRM Stage (crm.stage)lossy | Fully supported | |
| Engagement: Email | CRM Lead / Partner Activity Log1:1 | Fully supported | |
| Engagement: Form Submission | CRM Lead / Partner1:1 | Fully supported | |
| Engagement: Meeting / Call | Calendar Event (calendar.event)1:1 | Fully supported | |
| Engagement: Note | Note (mail.message)1:1 | Fully supported | |
| Engagement Score | Custom Float Field on Partner1:1 | Fully supported | |
| Custom Data Schema | Custom Fields via Odoo Studio1:1 | Fully supported | |
| Tag | Partner Tag1:1 | Fully supported | |
| Owner | User (res.users)1:1 | Fully supported | |
| Program (Automated Workflow) | Documentation Artifactlossy | 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.
Act-On gotchas
ACT! desktop CRM and Act-On marketing automation are different products
Automated Program logic does not export
Engagement score formulas are not transferable
Bulk API is not publicly documented
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 scoping
We audit the source Act-On account for contact volume, company records, audience List count, active Program count, custom data schema definitions, engagement history volume (emails, calls, meetings, form submissions), and owner assignments. We confirm the exact Act-On product (not ACT! desktop CRM) via subdomain check during discovery. The discovery output is a written migration scope covering record counts, object mapping decisions, and an Odoo edition recommendation (Community free-tier CRM vs Odoo Online SaaS with per-user pricing). We also identify any records with hard deletes or data gaps that require customer decisions before migration begins.
Schema design in Odoo Studio
We design the destination schema in a staging Odoo database (a test company or Sandbox-style copy) before touching production. This includes creating custom fields via Odoo Studio for Act-On custom data schemas, configuring CRM pipeline stages matching the Act-On deal stage names and probabilities, setting up Partner Tags corresponding to Act-On audience Lists, and creating the lead routing rule (Contact with customer lifecycle stage to Partner, Contact without deal history to CRM Lead). All custom field API names follow Odoo's x_act_<name> convention. Schema is validated in the staging database before deployment to production.
Sandbox migration and reconciliation
We run a full migration into the staging Odoo environment using production-like data volume. The customer's admin reconciles record counts (Contacts in, Partners out, Leads in, Opportunities in, Tags in, Activities in), spot-checks 25-50 random records against the Act-On source, and signs off the schema and field mapping. Any field mapping corrections, stage configuration changes, or custom field additions happen in staging before production migration begins. This step prevents correction loops in the production database.
Owner reconciliation and Odoo User provisioning
We extract every distinct Act-On owner referenced on Contact, Company, Deal, and Engagement records and match by email against the destination Odoo instance's res.users table. Owners without a matching Odoo User go to a reconciliation queue. The customer's Odoo admin provisions any missing User records (active or inactive depending on the owner's current status in Act-On). Migration cannot proceed past this step because partner.user_id and lead.user_id references are required on most Odoo CRM records.
Production migration in dependency order
We run production migration in record-dependency order: Company Partners (from Act-On Companies) first, then Contact Partners (with parent_id resolved to the Company Partner), then CRM Leads (for contacts without deal history), then Opportunities (with partner_id and stage_id resolved), then Tags (for Act-On Lists), then custom field data (for Act-On Custom Data schemas), then activity history (mail.message records, calendar.event records) via chunked API calls with backoff. Each phase emits a row-count reconciliation report before the next phase begins. Act-On writes are frozen during the cutover window.
Cutover, validation, and Program rebuild handoff
We run a final delta migration of any records modified during the cutover window, then enable Odoo as the system of record. We deliver the Program inventory document (step-by-step sequence reference for every Act-On Automated Program) and the workflow rebuild guide to the customer's Odoo admin. We support a one-week hypercare window for reconciliation issues raised by the sales or marketing team. We do not rebuild Act-On Programs as Odoo Studio workflows inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Act-On
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Act-On and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Act-On and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Act-On 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
Act-On: Not publicly documented.
Data volume sensitivity
Act-On 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 Act-On to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Act-On 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 Act-On
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.