CRM migration
Field-level mapping, validation, and rollback between OptiPub and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
OptiPub
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between OptiPub and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from OptiPub to Odoo CRM is a platform-class migration from an email-focused publisher tool to a full business suite. OptiPub organizes data around Subscribers, Segments, Campaigns, and Partners with publishing-specific engagement metrics. Odoo CRM uses Leads, Contacts, Accounts, and Opportunities as its core objects, with no native equivalent for publisher lifecycle stages, paid publication triggers, or partner funnel attribution. We map Subscriber profiles to Contacts with custom fields preserving engagement history, Segment definitions to Odoo Tags or custom many2many fields, and Partner records to Account records with partner-type categorization. Campaign records migrate as static historical data without the ability to re-send; automation rules and video embedding references do not migrate and require reimplementation. We deliver a written inventory of every OptiPub Automation Rule and its recommended Odoo Action Rule equivalent so your admin can rebuild post-migration.
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 OptiPub 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.
OptiPub
Subscriber
Odoo CRM
Contact (res.partner)
1:1OptiPub Subscriber records map to Odoo Contact (res.partner) records. Email address becomes the partner's email field, name maps to partner_name, and engagement history (open rates, click rates, last activity date) migrates to custom fields on the Contact record. Subscriber lifecycle status from OptiPub (active, churned, re-engaged) maps to a custom field optipub_lifecycle_stage on the Contact. We preserve custom subscriber properties as custom fields on res.partner.
OptiPub
Subscriber
Odoo CRM
Lead (crm.lead)
1:manySubscribers who have not yet converted to a known contact relationship map to Odoo Lead records. We use OptiPub's subscriber engagement score and subscription type to determine the split: low-engagement new subscribers map to crm.lead; high-engagement or paying subscribers map to Contact. The customer defines the threshold during scoping, and we apply it as a transform during migration.
OptiPub
Segment
Odoo CRM
Tag (ir.model.data) + Custom Many2many Field
lossyOptiPub Segments are dynamic or static subscriber groupings. We map segment membership to Odoo Tags on the Contact or Lead record via the many2many_tags field. For Segments with complex membership criteria that cannot be expressed as tags, we create a custom many2many field optipub_segments on res.partner that stores the original segment name. Dynamic segment membership requires re-evaluation in Odoo through Server Actions or filters rather than real-time recalculation.
OptiPub
Campaign
Odoo CRM
Project (project.project) + Task (project.task)
1:manyOptiPub Campaigns (email campaigns with subject lines, content, and scheduling) map to Odoo Project records for historical tracking, with each campaign creating a Project record and each A/B test variant becoming a Task within that project. Campaign send history, open rates, and click rates migrate to custom fields on the Task record. We do not recreate campaigns for re-sending; this is historical data migration only.
OptiPub
Automation Rule
Odoo CRM
Action Rule (base.action.rule) + Server Action (ir.actions.server)
lossyOptiPub Automation Rules with publisher-specific triggers (paid publication triggers, partner funnel steps) map to Odoo Action Rules and Server Actions, but the trigger logic requires manual redesign. We map the rule structure (trigger condition, delays, actions) and document the recommended Odoo equivalent during migration. The customer's admin rebuilds automation logic post-migration because Odoo's event-driven model differs from OptiPub's publisher-specific conditional branching.
OptiPub
Template
Odoo CRM
Document (ir.attachment) + Custom Field on Template Model
1:1OptiPub email templates migrate as attachments to a dedicated document directory in Odoo. Template metadata (name, usage history, last modified date) migrates to a custom model or custom fields on the attachment record. HTML templates retain their full markup; the customer repurposes them in Odoo's email composer or external email tools post-migration.
OptiPub
Partner
Odoo CRM
Account (res.partner with partner_type = affiliate)
1:1OptiPub Partner records (affiliate and partner management with domain monitoring and partner-level stats) map to Odoo Account records tagged with a custom partner_type field set to 'affiliate' or 'partner'. Partner-level revenue attribution maps to custom fields on the Account record. Domain monitoring and partner-specific metrics that have no Odoo equivalent are preserved as custom fields for the customer's admin to map to Odoo's reporting tools.
OptiPub
Video
Odoo CRM
URL Field + Attachment
1:1OptiPub embedded videos (Wistia, YouTube) store as URL references on the source Campaign or Template record. We preserve the video URL and any play statistics as custom fields on the migrated record. Video hosting connections require re-authentication at the destination; video playback within emails is not natively supported in Odoo CRM and requires a third-party app or re-linking the video host account.
OptiPub
Campaign Send History
Odoo CRM
Custom Model (optipub_campaign_history)
1:1OptiPub campaign send history (send timestamps, recipient counts, bounce rates) maps to a custom model we create in Odoo during migration. This preserves the sending performance data as structured records linked to the Campaign Project record rather than scattered across multiple field updates.
OptiPub
Custom Field (subscriber properties)
Odoo CRM
Custom Field on res.partner
lossyOptiPub's custom subscriber properties (beyond the standard fields) map to custom fields on the Odoo res.partner model. We create each custom field with the appropriate field type (char, selection, boolean, integer, float, date) based on the source data type. Field labels and help text are preserved from the OptiPub metadata. Custom fields with selection-type values require a manual migration of the picklist values to Odoo selection options.
OptiPub
Engagement: Email opens and clicks
Odoo CRM
Mail Message (mail.message)
1:1OptiPub engagement data (open events, click events) migrates to Odoo Mail Message records linked to the Contact or Lead record. Each engagement event becomes a mail.message with a custom optipub_event_type field indicating 'open' or 'click', and a custom optipub_timestamp field preserving the original engagement timestamp. This preserves the engagement timeline but does not replicate OptiPub's real-time engagement tracking.
OptiPub
Subscriber opt-out
Odoo CRM
Contact opt-out field
1:1OptiPub's subscriber opt-out status maps to the standard Odoo Contact opt-out field (property_mail_unsubscribed on res.partner). We also preserve the opt-out timestamp and source (manual, list-unsubscribe, bounce) in custom fields optipub_unsubscribed_date and optipub_unsubscribed_source for compliance and re-engagement analysis.
| OptiPub | Odoo CRM | Compatibility | |
|---|---|---|---|
| Subscriber | Contact (res.partner)1:1 | Fully supported | |
| Subscriber | Lead (crm.lead)1:many | Fully supported | |
| Segment | Tag (ir.model.data) + Custom Many2many Fieldlossy | Fully supported | |
| Campaign | Project (project.project) + Task (project.task)1:many | Fully supported | |
| Automation Rule | Action Rule (base.action.rule) + Server Action (ir.actions.server)lossy | Fully supported | |
| Template | Document (ir.attachment) + Custom Field on Template Model1:1 | Fully supported | |
| Partner | Account (res.partner with partner_type = affiliate)1:1 | Fully supported | |
| Video | URL Field + Attachment1:1 | Fully supported | |
| Campaign Send History | Custom Model (optipub_campaign_history)1:1 | Fully supported | |
| Custom Field (subscriber properties) | Custom Field on res.partnerlossy | Fully supported | |
| Engagement: Email opens and clicks | Mail Message (mail.message)1:1 | Fully supported | |
| Subscriber opt-out | Contact opt-out field1: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.
OptiPub gotchas
Dedicated IP reputation transfer requires warmup
Automation workflow branching logic may not map 1:1
Video integration references need re-authentication
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 data audit
We audit the source OptiPub account across Subscribers, Segments, Campaigns, Automation Rules, Partners, Templates, and Videos. We extract record counts, custom field definitions, segment membership criteria, and automation rule structures. We identify any publisher-specific data (paid publication triggers, partner funnel steps, video embedding references) that has no direct Odoo equivalent and document the mapping options for the customer's admin to decide during scoping. The discovery output is a written migration scope with object-level mapping decisions and a data quality assessment.
Schema design and custom field creation
We design the destination Odoo CRM schema including custom fields on res.partner for OptiPub lifecycle stages and subscriber engagement metrics, custom fields on crm.lead for subscriber-derived leads, Tags or many2many fields for Segment membership, custom fields on res.partner for partner-type classification and attribution, and a custom model for campaign send history. Schema is deployed into a staging Odoo database first for validation before any production migration begins.
Staging migration and reconciliation
We run a full migration into a staging Odoo environment using production-like data volume. The customer's admin reconciles record counts (Subscribers in, Contacts in, Leads in, Partners in, Segments mapped), spot-checks 25-50 random Contact records against the OptiPub source, and validates the segment-to-tag mapping. Any mapping corrections happen in staging before production migration begins.
Owner and contact-type reconciliation
We extract every distinct OptiPub owner referenced on Subscriber, Campaign, and Partner records and match by email against the Odoo destination's User table. Any OptiPub owner without a matching Odoo User goes to a reconciliation queue for the customer's admin to provision before record import resumes. We also apply the Subscriber-to-Lead/Contact split rule during this phase based on the engagement threshold defined during scoping.
Production migration in dependency order
We run production migration in record-dependency order: Account records for Partners (tagged with partner_type='affiliate'), Contacts (with custom lifecycle and engagement fields), Leads (for split subscribers), Tags (for segment membership), Project and Task records (for campaign history), custom campaign history records, engagement event records via SQL or API, and Automation Rule documentation inventory last. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation rebuild handoff
We freeze OptiPub 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 Automation Rule inventory document listing every OptiPub Automation Rule with its trigger, conditions, actions, and recommended Odoo Action Rule or Server Action equivalent. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. We do not rebuild OptiPub Automation Rules as Odoo Action Rules inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
OptiPub
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between OptiPub and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across OptiPub and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between OptiPub 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
OptiPub: Not publicly documented — typical SaaS limits assumed and confirmed during scoping.
Data volume sensitivity
OptiPub exposes a bulk API — large-volume migrations stream efficiently.
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 OptiPub to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your OptiPub 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 OptiPub
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.