CRM migration
Field-level mapping, validation, and rollback between e-shot and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
e-shot
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between e-shot and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from e-shot to Odoo CRM is a cross-category migration: e-shot is an email marketing and automation platform built around Contacts and Campaigns, while Odoo CRM is a pipeline-first CRM that happens to include email integration through its mail module. There is no direct object equivalence between the two. We extract e-shot Contacts and their custom field definitions, replicate the merge-tag personalisation logic using Odoo's mail template fallback syntax, transfer HTML email templates as body content in Odoo mail.mail_template, and map campaign audience segments to Odoo CRM tags and mailing list subscriptions. We do not migrate Automated Series, Website Popups, Landing Pages, or the preference centre as functional objects — these have no equivalent architecture in Odoo CRM. We deliver a written inventory of every active Series, Popup, and Landing Page so the customer's Odoo admin can rebuild them using Odoo's automation rules and website builder. Timeline typically lands between four and eight weeks depending on contact volume, custom field complexity, and whether historical campaign reports are required alongside the contact 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 e-shot 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.
e-shot
Contact
Odoo CRM
res.partner
1:1e-shot Contacts migrate to Odoo res.partner records. Standard fields (name, email, phone, address) map directly. Custom contact fields defined in e-shot Settings > Contacts field manager are extracted by API and replicated as custom fields on res.partner using Odoo Studio before migration. The merge-tag field name becomes the Odoo field technical name (e.g., *company_name* becomes x_eshot_company_name). We preserve the original merge-tag syntax as a field label so Odoo admins can verify personalisation during template testing.
e-shot
Contact Field (custom)
Odoo CRM
res.partner custom field (via Studio or data file)
lossye-shot's contact field schema is fully customisable. Every custom field definition (name, type, merge-tag syntax) is extracted from the e-shot field manager. Each field is created in Odoo before contact import begins. Picklist-type contact fields in e-shot map to Odoo selection fields; checkbox fields map to boolean; date fields map to date; text fields map to char or text depending on length. We flag any e-shot field type without an Odoo equivalent (e.g., complex multi-value arrays) for manual review during scoping.
e-shot
Merge-tag fallback definitions
Odoo CRM
mail.mail_template default_value or body QWeb
lossye-shot personalisation uses *_fieldname=fallback('text')_* syntax for fields where some contacts lack values. We extract every fallback definition from the contact field manager and replicate them in Odoo's mail.mail_template model. Odoo's mail template system uses Jinja2-style {{partner.x_field}} with optional |default('fallback text') filters. We convert each e-shot fallback to an equivalent Odoo default value on the res.partner field, so contacts without a value render the fallback text without showing raw merge-tag syntax.
e-shot
Campaign
Odoo CRM
crm.lead (as lead) + tag
1:manye-shot Campaigns have no direct Odoo equivalent. Each e-shot Campaign maps to a tag on crm.lead records, with the campaign name stored as a tag label (e.g., 'es_campaign_summer-promo'). The campaign audience (the contacts who received the campaign) is identified by tag membership. Campaign subject lines and sender details are not preserved as Odoo records; we document them in the handoff inventory. Campaign content (HTML body) migrates to mail.mail_template if the customer wants to reuse it in Odoo's email composer.
e-shot
Campaign Report
Odoo CRM
Documented in handoff inventory
1:1e-shot campaign analytics (opens, clicks, bounces, unsubscribes, delivery health) are pulled as CSV exports from the analytics dashboard and documented in the migration handoff inventory. Odoo CRM does not have native campaign analytics; the customer can import the CSV to Odoo's document management (ir.attachment) or a linked BI tool. We do not create Odoo analytics records from campaign report data because no equivalent schema exists.
e-shot
Email Template
Odoo CRM
mail.mail.template
1:1e-shot email templates (HTML with embedded styles and merge tags) migrate as mail.mail.template records in Odoo. We extract template body as HTML content, replace e-shot merge-tag syntax with Odoo's Jinja2 {{partner.field}} equivalents, and set the template model to res.partner. Merge-tag personalisation is preserved as source values for re-enabling in the Odoo mail composer. Image assets embedded in templates are extracted as base64-encoded attachments or converted to Odoo-relative URLs depending on the template complexity.
e-shot
Form / Preference Centre
Odoo CRM
Documented in handoff inventory
1:1e-shot Forms and the preference centre store subscription opt-in/out choices and contact field inputs. We export form definitions and per-contact preference data. Opt-in status migrates to the Odoo res.partner x_opted_in field (created during schema setup) and to the mail.mass_mailing.contact mailing list model if Odoo Marketing is installed. The form field structure and layout do not have a direct Odoo equivalent and are documented for the admin to rebuild in Odoo Forms or via Odoo Website builder.
e-shot
Saved Filter
Odoo CRM
ir.filters
1:1e-shot Saved Filters define dynamic contact segments using field conditions. We export each filter definition as a set of domain conditions and replicate them as ir.filters records in Odoo scoped to res.partner. Tier limits from e-shot (basic: 10, pro: 25, omni: unlimited) do not apply in Odoo. Complex saved filters with multi-condition logic (AND/OR grouping) are translated to Odoo domain syntax and validated against the migrated field names.
e-shot
Tag
Odoo CRM
res.partner category
1:1e-shot Tags label contacts for segmentation without a formal taxonomy. Tags are stored as tag-name values on contact records and extracted during export. They map to res.partner.category records in Odoo. We deduplicate tag names (e.g., 'vip' and 'VIP' become one category) and preserve tag assignment on each contact during import. Tags used for campaign audience targeting become the tag-on-lead pattern described in the Campaign mapping.
e-shot
Automated Series
Odoo CRM
Documented in handoff inventory
1:1e-shot Automated Series are workflow-based email sequences with trigger conditions, delays, and branching logic. Odoo CRM does not have a native cadence sequencer equivalent to Automated Series. We export the full Series definition (trigger type, conditions, steps, delays, email content) as a written inventory document. The customer's Odoo admin rebuilds them using Odoo CRM automation rules (server actions and automated actions on crm.lead) or the Odoo Marketing app if installed. We do not migrate Automated Series as functional records.
e-shot
Landing Page
Odoo CRM
Documented in handoff inventory
1:1e-shot Landing Pages are tier-gated (basic: 0, pro: 25, omni: 100) and store published page content and form elements. Odoo does not have a direct landing page management module within CRM. If Odoo Website is installed, landing pages can be rebuilt there; otherwise we document the page URL, content structure, and form field mapping for the admin to rebuild. We export landing page content as HTML files and form field definitions in the handoff inventory.
e-shot
Website Popup
Odoo CRM
Documented in handoff inventory
1:1e-shot Website Popups are campaign-triggered web overlays tied to contact identification. They have no equivalent in Odoo CRM. We export popup configurations (trigger conditions, display rules, content) as a written inventory document. If the customer uses Odoo Website, popups can be rebuilt using Odoo's website popup widget or a third-party integration. Popup data is not loaded into Odoo as records.
| e-shot | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Contact Field (custom) | res.partner custom field (via Studio or data file)lossy | Fully supported | |
| Merge-tag fallback definitions | mail.mail_template default_value or body QWeblossy | Fully supported | |
| Campaign | crm.lead (as lead) + tag1:many | Fully supported | |
| Campaign Report | Documented in handoff inventory1:1 | Fully supported | |
| Email Template | mail.mail.template1:1 | Fully supported | |
| Form / Preference Centre | Documented in handoff inventory1:1 | Fully supported | |
| Saved Filter | ir.filters1:1 | Fully supported | |
| Tag | res.partner category1:1 | Fully supported | |
| Automated Series | Documented in handoff inventory1:1 | Mapping required | |
| Landing Page | Documented in handoff inventory1:1 | Fully supported | |
| Website Popup | Documented in handoff inventory1: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.
e-shot gotchas
File attachments blocked in bulk email sends
Tier limits apply to active (live) objects only
Merge-tag fallback values must be replicated
No dedicated bulk export endpoint 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 e-shot account audit
We audit the source e-shot account across all tiers in scope: plan tier (basic, pro, omni), active contact count, custom contact field definitions (names, types, merge-tag syntax, fallback values), campaign list, active Automated Series, published Landing Pages, active Website Popups, Saved Filters, Tags, and email template library. We pull the analytics dashboard to capture historical campaign report snapshots. The discovery output is a written migration scope that explicitly lists every object, its Odoo destination (or its classification as handoff inventory), and the merge-tag fallback matrix.
Schema pre-creation in Odoo
Before any data extraction, we create the Odoo destination schema. This includes custom fields on res.partner and crm.lead (using Odoo Studio or a data file), field labels matching the original e-shot merge-tag names, field default values matching every extracted fallback definition, res.partner.category records for e-shot Tags, mail.mail.template records for email templates (with Jinja2-converted body content), and ir.filters records for e-shot Saved Filters. Schema is validated in a staging Odoo database before production migration begins. We coordinate with the customer's Odoo admin to ensure the migration user has write access to the target models.
Contact export with throttled pagination
We export e-shot Contacts via paginated API calls, respecting the plan's hourly rate limit (500-5,000 calls/hour). For contacts exceeding 50,000 records, we implement resume logic across multiple export sessions. We extract all standard fields (name, email, phone, address) and all custom contact field values as flat key-value pairs. Merge-tag fallback values are attached to each record's field data so they can be set as Odoo field defaults rather than literal values during import. We generate a contact-level CSV export that includes a source_e_shot_contact_id column for audit traceability.
Contact import into Odoo res.partner
We load contacts into Odoo res.partner using the XML-RPC or JSON-RPC API with batch create/update operations. Each record is written with the resolved res.partner.category assignments (from the tag mapping) and the resolved x_opted_in field (from the preference centre opt-in data). We apply Odoo's deduplication rules on email address before insert. Owner assignment maps from e-shot owner email to Odoo res.users by email match; unresolved owners are flagged in the reconciliation report for the admin to provision.
Email template migration and merge-tag conversion
We migrate e-shot email templates to Odoo mail.mail.template records. The HTML template body is extracted and e-shot merge-tag syntax (*_fieldname_*) is converted to Odoo's Jinja2 equivalent ({{partner.x_field}}). Merge-tag fallback values are replicated using the |default('text') Jinja2 filter on each field reference. We test each converted template against a sample contact record in the staging Odoo database to verify that personalisation renders correctly before committing to production. Template subject lines and sender details are stored in the template record for use in Odoo's mail composer.
Cutover, delta sync, and handoff inventory delivery
We freeze e-shot writes during the final cutover window, run a delta migration of any contacts modified during the migration, then confirm Odoo as the system of record for migrated data. We deliver the complete handoff inventory: Automated Series documentation, Landing Page HTML exports, Website Popup configurations, campaign report CSVs, and the merge-tag fallback matrix. We do not rebuild Automated Series, Landing Pages, or Popups in Odoo as part of the migration scope; those are separate engagements or admin-led tasks. We offer a one-week post-migration reconciliation window to resolve any data discrepancies reported by the customer's team.
Platform deep dives
e-shot
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between e-shot and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across e-shot and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between e-shot 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
e-shot: 500–5,000 requests per hour depending on tier (basic: 500, pro: 2,000, omni: 5,000).
Data volume sensitivity
e-shot 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 e-shot to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your e-shot 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 e-shot
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.