CRM migration
Field-level mapping, validation, and rollback between Contact Beacon and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Contact Beacon
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Contact Beacon and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Contact Beacon and Odoo CRM serve different primary audiences. Beacon is purpose-built for UK charities with native Gift Aid handling and a flat donor-centric object model centered on Contacts and Donations. Odoo CRM is the CRM module within a modular ERP suite that covers sales, accounting, project management, and events; charities migrating to Odoo typically do so to consolidate fundraising, accounting, and operations into a single platform. The migration requires transforming Beacon's Donation object into Odoo Opportunities with custom fields for amount, campaign, Gift Aid status, and gift date, since Odoo has no native donation record type. We preserve the Contact-to-Donation parent relationship by resolving Contact IDs at migration time and linking Opportunities to the corresponding Odoo Contact via a many-to-one relationship. Beacon Pipelines map to Odoo CRM Stages within the default sales pipeline, and Tags migrate as Odoo Tags. Beacon Workflows, which are not accessible via API or UI export, are documented during scoping and handed off for manual rebuild in Odoo. The migration uses Odoo's XML-RPC API with batch operations and rate-limit awareness to load data in dependency order: Contacts first, then Opportunities, then Tags and attachments.
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 Contact Beacon 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.
Contact Beacon
Contact
Odoo CRM
Contact
1:1Beacon Contacts migrate to Odoo Contacts with all standard fields (name, email, phone, address) and any custom per-organization fields mapped to Odoo custom Contact fields. The Beacon contact_id becomes an external identifier in Odoo for reconciliation. Owner assignment maps to the Odoo user field; inactive Beacon users are imported as Odoo inactive users or archived records based on the destination org's user management policy. Address fields are mapped field-by-field to Odoo's street, city, state, zip, country structure.
Contact Beacon
Donation
Odoo CRM
Opportunity
1:1Beacon Donations are the primary structural transformation in this migration. Each Donation maps to an Odoo CRM Opportunity with the following custom field mapping: donation amount to Expected Revenue, gift date to Expected Closing, campaign tag to Tag IDs in Odoo, and the Gift Aid boolean flag to a custom boolean field gift_aid_eligible__c on the Opportunity. The parent Contact relationship is preserved by resolving the Beacon contact_id to the Odoo Contact record ID at migration time and setting the Opportunity's Partner ID to the resolved Contact. Note that Odoo has no native donation record type; the Opportunity with custom fields is the conventional Odoo model for tracking charitable gifts.
Contact Beacon
Campaign
Odoo CRM
Tag or Campaign
1:manyBeacon Campaigns group Donations and Contacts for reporting. Odoo CRM does not have a native Campaign object equivalent to HubSpot or Salesforce Campaign. We map Beacon Campaigns to Odoo Tags on the Opportunity (representing the donation campaign) and optionally create a separate Tag on the Contact for donor attribution. If the customer is activating Odoo Events, the Campaign can alternatively map to an Odoo Event project for event-linked fundraising tracking. The mapping strategy is chosen during scoping based on the customer's reporting requirements.
Contact Beacon
Pipeline
Odoo CRM
Stage
lossyBeacon Pipelines with ordered Stages map to Odoo CRM Stages within the default pipeline. Stage names and order are migrated; probability percentages per stage are set on each Odoo Stage configuration. Any conditional stage-routing rules from Beacon (e.g., automated stage advancement based on donation amount) cannot migrate as automation and are documented as Odoo CRM Server Actions for the customer's admin to configure post-migration. Odoo's default pipeline is single; if the customer needs multiple pipelines, we configure additional CRM Sales Teams as pipeline partitions during the schema design phase.
Contact Beacon
Custom Fields
Odoo CRM
Custom Fields
1:1Beacon per-organization custom fields on Contacts and Donations are discovered during scoping and mapped to Odoo custom fields on the Contact and Opportunity respectively. Field types are translated: text to char, number to float or integer, date to date, checkbox to boolean, multi-select to many2many tags. Unsupported types (e.g., Beacon-specific formatted fields) are flagged for manual review and either mapped to char or excluded with a documented rationale. Custom field naming in Odoo follows the field_ naming convention and must be confirmed with the customer admin before schema deployment.
Contact Beacon
Tag
Odoo CRM
Tag
1:1Beacon Tags on Contacts and Donations migrate as Odoo Tags. Tags are stored as a many2many field on both Contact and Opportunity in Odoo CRM. We flatten Beacon's tag arrays and upsert them into Odoo's tag table, then link them to the corresponding records during import. Any tags that were generated by inactive Beacon workflows are flagged in the tag inventory document so the customer can decide whether to create corresponding Odoo automated actions or remove them.
Contact Beacon
Attachment
Odoo CRM
Attachment
1:1File attachments on Beacon Contact records are downloaded via individual API requests and re-uploaded to Odoo as ir.attachment records linked to the Contact via a many2one res_model = res.partner relationship. Large batches are chunked to respect Beacon's rate limits. We log the original filename and attachment date for reconciliation. Attachments exceeding Odoo's default 100 MB file size limit are flagged for the customer's admin to store externally and link via URL.
Contact Beacon
User
Odoo CRM
User
1:1Beacon user accounts map to Odoo Users. We match by email address. Any Beacon user without a matching Odoo User is held in the reconciliation queue for the customer's Odoo admin to provision before record import proceeds. Inactive Beacon users are set to inactive in Odoo to preserve owner attribution on historical records.
Contact Beacon
Workflow
Odoo CRM
Action (automated action)
lossyBeacon automated workflows (Gift Aid submission triggers, thank-you email sequences, donor follow-up timers) cannot be exported from Beacon's UI or API. We document every active workflow during scoping with its trigger, conditions, actions, and timing logic. This document is delivered to the customer as a rebuild guide for Odoo CRM Server Actions and Odoo's Email Templates for email sequences. We do not rebuild workflows inside the migration scope; this is an admin task post-migration or a separate consulting engagement.
Contact Beacon
Gift Aid Declaration
Odoo CRM
Custom Field (gift_aid_eligible, gift_aid_amount)
lossyBeacon stores Gift Aid eligibility as a boolean toggle on the Contact or Donation. In Odoo, we create two custom Opportunity fields: gift_aid_eligible__c (boolean) and gift_aid_amount__c (float) for the estimated HMRC reclaim amount based on donation amount times the 25% Gift Aid multiplier. For UK charities, this field enables Gift Aid batch reporting directly from the Odoo CRM Opportunity list view. The gift_aid_eligible__c boolean also drives Odoo automated actions for Gift Aid acknowledgment email templates if configured post-migration.
Contact Beacon
Engagement: Note
Odoo CRM
Note
1:1Beacon engagement notes migrate to Odoo CRM Notes attached to the Contact or Opportunity record. Notes with timestamps preserve the original date as the note creation date in Odoo. If a Beacon note references a specific donation, we link it to the corresponding migrated Opportunity using the external identifier cross-reference created during the donation import phase.
Contact Beacon
Engagement: Task
Odoo CRM
Task
1:1Beacon task engagements (follow-up reminders, donor check-ins) map to Odoo CRM Tasks linked to the Contact or Opportunity. Task status, priority, and due date migrate directly. Owner assignment resolves through the User mapping. Tasks are inserted after Contact and Opportunity records are confirmed in Odoo to satisfy the res_model and res_id foreign key constraints.
| Contact Beacon | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Donation | Opportunity1:1 | Fully supported | |
| Campaign | Tag or Campaign1:many | Fully supported | |
| Pipeline | Stagelossy | Fully supported | |
| Custom Fields | Custom Fields1:1 | Mapping required | |
| Tag | Tag1:1 | Fully supported | |
| Attachment | Attachment1:1 | Fully supported | |
| User | User1:1 | Fully supported | |
| Workflow | Action (automated action)lossy | Fully supported | |
| Gift Aid Declaration | Custom Field (gift_aid_eligible, gift_aid_amount)lossy | Fully supported | |
| Engagement: Note | Note1:1 | Fully supported | |
| Engagement: Task | Task1: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.
Contact Beacon gotchas
API keys are shown once and never recoverable
No bulk export endpoint forces paginated extraction
Revoked API keys are permanently invalidated
Workflows have no export path
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 migration scope document
We audit the source Beacon portal across objects in scope (Contacts, Donations, Campaigns, Pipelines, Tags, Attachments), total record counts per object, active workflow count and logic, and custom field inventory. We pair this with an Odoo instance review: CRM app installation status, existing Pipeline and Stage configuration, user count, and whether Odoo Accounting or Project Management apps are active. The discovery output is a written migration scope document with record counts, custom field mappings, the Gift Aid field strategy, and the Odoo stage configuration plan.
Schema design and custom field provisioning in Odoo
We create the destination schema in Odoo before any data moves. This includes creating custom Opportunity fields for donation tracking (gift_aid_eligible__c, gift_aid_amount__c, gift_date__c, campaign_source__c), configuring Odoo CRM Pipeline Stages to match Beacon pipeline names and order, setting stage probability percentages, and creating Tags for Beacon Campaigns. If the customer needs multiple pipelines, we configure additional CRM Sales Teams. Schema changes are deployed to a test Odoo database first for validation before production migration begins.
Beacon data extraction via paginated API
We extract Beacon data using paginated list API requests for Contacts, Donations, Campaigns, Tags, and Attachments. Extraction runs in off-peak hours to minimize rate-limit pressure. For large datasets (10,000+ records), we run parallel extractors for Contacts and Donations and merge on contact_id during normalization. We log every paginated request and its response to a migration audit log for reconciliation. At the end of extraction, we generate row counts per object for comparison against the Odoo import counts.
Data normalization and Gift Aid transformation
We normalize Beacon field names to Odoo field names using the mapping document. For Donations, we compute the Gift Aid reclaim amount (donation amount multiplied by 0.25) and populate the gift_aid_amount__c custom field on the corresponding Opportunity. We resolve Beacon contact_id values to Odoo Contact res.partner IDs through a lookup table built during the Contact import phase. Tags are normalized to Odoo's tag label format. Any malformed or duplicate records are flagged in a pre-import exception report for the customer to resolve before import.
Odoo import in dependency order
We import records into Odoo in strict dependency order: Users (validated against the Odoo user table), Contacts (first because Opportunities reference them), Campaigns/Tags (upserted before Opportunity import), then Opportunities (with Partner ID, stage, and custom Gift Aid fields resolved), then Notes and Tasks. Each phase emits a row-count reconciliation report comparing Beacon export counts to Odoo import counts. Attachments are imported last using individual file upload requests chunked to avoid timeout. Any phase with a mismatch greater than 1% triggers a re-extract and re-import cycle for that object.
Cutover, validation, and workflow handoff
We freeze Beacon writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver the Workflow Inventory Document listing every active Beacon workflow with its trigger, conditions, and actions for manual rebuild in Odoo CRM Server Actions. We conduct a post-migration reconciliation walkthrough with the customer's Odoo admin to validate 25-50 random Contact and Opportunity records against the Beacon source. We support a one-week hypercare window for reconciliation issues. We do not rebuild Beacon workflows as Odoo automated actions inside the migration scope.
Platform deep dives
Contact Beacon
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 Contact Beacon 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
Contact Beacon: Not publicly documented in customer-facing materials; rate-limit headers returned on 429 responses.
Data volume sensitivity
Contact Beacon 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 Contact Beacon to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Contact Beacon 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 Contact Beacon
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.