CRM migration
Field-level mapping, validation, and rollback between AddressTwo and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
AddressTwo
Source
Odoo CRM
Destination
Compatibility
9 of 13
objects map 1:1 between AddressTwo and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from AddressTwo to Odoo CRM is a structural migration that reconciles a contact-centric data model against Odoo's partner-centric architecture. AddressTwo stores company data as fields on Contact records; Odoo maintains a separate res.partner object with a company_id field for organizational hierarchy. We flatten AddressTwo's embedded company data into Odoo res.partner records, reconstructing the organizational structure where needed, and map Deals to crm.lead with stage values and owner assignment preserved. Activity history migrates as mail.message records linked to the correct partner, and we flag the AddressTwo API access constraint (requires email approval, no self-service developer portal) during scoping so that timeline does not surprise. Workflows, automations, and reporting configurations do not migrate as code; we deliver a written inventory for the customer's admin to rebuild in Odoo's Studio.
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 AddressTwo 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.
AddressTwo
Contact
Odoo CRM
res.partner
1:1AddressTwo Contact records map to Odoo res.partner. The AddressTwo contact's embedded company name becomes the res.partner company_name field. The contact's individual-person fields (name, email, phone, title) map to the standard res.partner name, email, phone, and function fields. We run a fuzzy de-duplication pass before import to catch any duplicates created by AddressTwo's email BCC sync behavior.
AddressTwo
Company (flattened field)
Odoo CRM
res.partner (company type)
1:manyAddressTwo stores company information as fields on the Contact rather than a separate object. We identify unique company names in the AddressTwo company field and create a separate res.partner record with is_company=True for each unique organization. The original Contact record becomes a res.partner with is_company=False and company_id pointing to the reconstructed company partner.
AddressTwo
Deal
Odoo CRM
crm.lead
1:1AddressTwo Deals map to Odoo crm.lead records with type='opportunity'. The deal name becomes crm.lead name, deal amount maps to expected_revenue, stage maps to stage_id, owner maps to user_id, and closedate maps to date_deadline. We preserve the AddressTwo deal order status and use it to set the priority field on crm.lead.
AddressTwo
Deal Stage
Odoo CRM
crm.stage
lossyEach AddressTwo deal pipeline becomes an Odoo crm.lead.team with its own crm.stage sequence. We map AddressTwo stage names to Odoo stage values and configure stage probabilities per the customer's pipeline. Stage values are created in the destination Odoo database before any crm.lead records are imported.
AddressTwo
Activity (Call, Meeting, Email, Task)
Odoo CRM
mail.message
1:1AddressTwo Activities are date-stamped events tied to a Contact. We import them as mail.message records linked to the migrated res.partner via model=res.partner and res_id pointing to the partner's database ID. Activity type (call, meeting, email, task) is stored in the mail.message message_type field. The original timestamp is preserved in mail.message date.
AddressTwo
Note
Odoo CRM
mail.message
1:1AddressTwo free-text notes attached to a Contact migrate as mail.message records with message_type=notification. The note body migrates as the mail.message body field in HTML format. Notes are linked to the migrated res.partner via model=res.partner and res_id.
AddressTwo
Email History (BCC thread)
Odoo CRM
mail.message (incoming)
1:1AddressTwo stores email threads collected by BCCing the platform on outbound messages. We import the BCC thread as a chronological mail.message sequence per res.partner, noting that Odoo stores email threads as flattened conversation logs rather than threaded conversation objects. Email content and timestamps migrate verbatim.
AddressTwo
Tag / Label
Odoo CRM
res.partner.category
1:1AddressTwo contact tags migrate to Odoo res.partner.category records. The tag name and any color or description fields map to category.name and category.color. We create the category records before importing partners so that the partner-category relationship is satisfied at import time.
AddressTwo
Mass Email Campaign Membership
Odoo CRM
mailing.mailing.contact
1:1AddressTwo tracks which contacts received mass email campaigns. We create Odoo mailing.contact records linked to the corresponding mailing.mailing and to the res.partner. Campaign-level analytics (open rates, click rates) are not exported from AddressTwo and cannot be migrated; we document the campaign names and member lists only.
AddressTwo
Custom Field (Contact)
Odoo CRM
ir.model.field (res.partner)
lossyAddressTwo custom fields on Contacts are created as ir.model.field definitions on res.partner before migration using Odoo Studio or directly via the ORM. Field type mapping: text to char/text, number to float/integer, date to date, checkbox to boolean, dropdown to selection. Custom field values migrate as partner field values during the res.partner import.
AddressTwo
Custom Field (Deal)
Odoo CRM
ir.model.field (crm.lead)
lossyAddressTwo custom fields on Deals are created as ir.model.field definitions on crm.lead before migration. Stage-dependent fields on Deals map to crm.lead stage custom fields or to note fields depending on their type. Customer reviews custom field mapping during scoping.
AddressTwo
User / Owner
Odoo CRM
res.users
1:1AddressTwo owner assignment maps to Odoo res.users. We resolve owners by email match against the destination Odoo instance's user table. Any AddressTwo owner without a matching Odoo user is held in a reconciliation queue for the customer's admin to provision before record import resumes.
AddressTwo
User / Owner
Odoo CRM
crm.team
1:1AddressTwo owner records also map to crm.team membership in Odoo. Each team is assigned a team_leader and members from the owner-to-user mapping. This ensures Deal ownership maps correctly to crm.lead.user_id.
| AddressTwo | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company (flattened field) | res.partner (company type)1:many | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Deal Stage | crm.stagelossy | Fully supported | |
| Activity (Call, Meeting, Email, Task) | mail.message1:1 | Fully supported | |
| Note | mail.message1:1 | Fully supported | |
| Email History (BCC thread) | mail.message (incoming)1:1 | Fully supported | |
| Tag / Label | res.partner.category1:1 | Fully supported | |
| Mass Email Campaign Membership | mailing.mailing.contact1:1 | Fully supported | |
| Custom Field (Contact) | ir.model.field (res.partner)lossy | Fully supported | |
| Custom Field (Deal) | ir.model.field (crm.lead)lossy | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| User / Owner | crm.team1: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.
AddressTwo gotchas
API requires approved key obtained via email to support
No self-service data export or bulk download
Duplicate contact creation during email sync
QuickBooks integration does not exist
No formally documented API rate limits
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 AddressTwo account across record counts (Contacts, Deals, Activities, Notes, Tags, Campaign memberships), custom field definitions, owner assignments, and pipeline stage names. We pair this with an Odoo edition and deployment decision: CRM-only on Odoo.sh Starter (~$24.90/user/month) for straightforward migrations; Odoo ERP suite if the customer needs accounting or inventory alongside CRM; or self-hosted Community edition if the customer prefers one-time infrastructure cost over recurring SaaS fees. The discovery output is a written migration scope and a source data inventory noting any records requiring AddressTwo support assistance to export.
AddressTwo data extraction
We request a full account export from AddressTwo support (email to [email protected]) and simultaneously apply for the v2.0 API key. If the API key arrives within the scoping window, we extract via API with conservative 30-second batch staggering to account for undocumented rate limits. If API access is not granted, we rely on the support-provided CSV export supplemented by targeted API calls or direct interface export for specific record types. We run a de-duplication pass on all Contact records before processing to merge any duplicates created by AddressTwo's email BCC sync behavior.
Schema design and partner restructure
We design the destination schema in the customer's Odoo instance. This includes creating custom fields on res.partner and crm.lead for each AddressTwo custom field (via Odoo Studio or direct ORM), configuring crm.lead.team records (one per AddressTwo pipeline), creating crm.stage values with probability percentages mapped from AddressTwo stages, and setting up res.partner.category records for the tag taxonomy. The company extraction step runs before the main partner import to create is_company=True res.partner records for each unique company identified in AddressTwo's embedded company field. Schema is validated in the Odoo test environment before any data moves.
Owner reconciliation and user provisioning
We extract every distinct AddressTwo Owner referenced on Contact, Deal, and Activity records and match by email against the destination Odoo instance's res.users table. Owners without a matching user go to a reconciliation queue. The customer's Odoo admin provisions any missing users (active or inactive depending on whether the original AddressTwo user is still contributing data). Migration cannot proceed past the partner import step because user_id and company_id references on crm.lead require valid destination users and partner records.
Sandbox migration and validation
We run a full migration into the customer's Odoo test or staging environment using production-like data volume. The customer's admin reconciles record counts (partners in, leads in, activities in, notes in), spot-checks 20-40 random records against the AddressTwo source, and validates that the partner-company hierarchy and lead ownership are correct. Activity history linking (mail.message to res.partner) is verified by checking that the chatter widget on a sample of partners shows the correct historical timeline. Any mapping corrections are documented and applied before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: res.partner.company records first (is_company=True), then res.partner person records (is_company=False with company_id set), then crm.lead.team and crm.stage configuration, then crm.lead (with user_id and partner_id resolved), then mail.message activity history (with model and res_id resolved to the migrated partner IDs), then res.partner.category and mailing.mailing for tag and campaign data. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC or JSON-RPC API with batch chunking and exponential backoff for activity history volume.
Cutover, validation, and rebuild handoff
We freeze AddressTwo writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the automation and report inventory document to the customer's admin team. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild AddressTwo workflows as Odoo automated actions inside the migration scope; that work is handled by the customer's admin or an Odoo implementation partner.
Platform deep dives
AddressTwo
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 AddressTwo and Odoo CRM.
Object compatibility
2 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
AddressTwo: Not publicly documented.
Data volume sensitivity
AddressTwo 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 AddressTwo to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your AddressTwo 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 AddressTwo
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.