CRM migration
Field-level mapping, validation, and rollback between Groundhogg and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Groundhogg
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Groundhogg and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Groundhogg to Odoo CRM is a structural migration from a WordPress plugin with flat-rate per-site pricing to an all-in-one ERP platform with per-user licensing. Groundhogg stores contacts, companies, and deal pipelines in a flat relational model; Odoo CRM separates Leads (unqualified prospects) from Contacts attached to Companies, and tracks opportunities through configurable pipeline stages. We resolve the contact-to-Lead split using Groundhogg's contact status or tags, remap WordPress user IDs to Odoo User emails, and migrate the activity timeline (email opens, link clicks, form submissions, tag changes) into Odoo's mail.message and crm.activity model. Groundhogg Flows and Tracks cannot be exported as automation logic; we document each Flow's trigger, step count, and step sequence as a rebuild guide. Broadcast history migrates as CRM leads with activity timestamps rather than as reusable templates. Odoo CRM's pricing starts at $24 per user per month for the CRM-only Starter pack, or CRM is included in the Odoo Online and Odoo.sh subscription tiers that bundle the ERP modules.
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 Groundhogg 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.
Groundhogg
Contact
Odoo CRM
Lead or Contact (split by status)
1:manyGroundhogg Contacts with a status indicating no sales activity (subscriber, lead) map to Odoo CRM Lead. Contacts with a status indicating active sales engagement or customer relationship map to Odoo CRM Contact attached to a Company record. We use Groundhogg's contact status field as the split criterion during migration, and preserve the original status value in a custom field on the Odoo Lead or Contact for audit and reporting continuity.
Groundhogg
Company
Odoo CRM
res.partner (Company type)
1:1Groundhogg Company records map to Odoo's res.partner model with partner_type = 'company'. We use the Groundhogg company name as the partner display name and set contact_type = 'contact' for the associated individual Contact records. Company addresses, phone numbers, and website migrate to the corresponding Odoo partner fields. The Company-to-Partner mapping must resolve before Contact import because Odoo requires a parent_company_id on child Contact records.
Groundhogg
Contact (individual)
Odoo CRM
res.partner (Contact type)
1:1Groundhogg Contact records without an associated Company map to Odoo res.partner with partner_type = 'individual'. We map email, first name, last name, phone, and address fields directly. Custom fields migrate as Odoo res.partner custom fields created via Odoo Studio before migration. Contact records with an associated Company link via parent_id to the corresponding Company partner record.
Groundhogg
Tag
Odoo CRM
crm.tag or res.partner.category
lossyGroundhogg tags are a flat taxonomy. We map tags to Odoo CRM crm.tag records created in the destination database. Tags apply to Leads and Opportunities via crm.lead.tag_REL records. Alternatively, we can map tags to Odoo's res.partner.category (contact tags) for broader CRM-wide use. The customer chooses the tag strategy during scoping based on whether they want tags scoped to opportunities or contacts.
Groundhogg
Deal
Odoo CRM
crm.lead (opportunity)
1:1Groundhogg Deals map to Odoo CRM crm.lead with type = 'opportunity'. The Groundhogg pipeline stage name maps to Odoo's stage_id, and we create the destination stage values before migration so the foreign key is satisfied at import time. Deal value maps to Odoo's expected_revenue field, and the deal close date maps to the date_deadline field. Owner assignment maps via the WordPress-to-Odoo User email remap.
Groundhogg
Pipeline Stage
Odoo CRM
crm.stage
lossyGroundhogg pipeline stages are available on Pro and above. We export the stage names, display order, and win/loss flags and create corresponding crm.stage records in Odoo. Each stage gets a sequence number matching Groundhogg's ordering. Stages are scoped to the Odoo CRM team if the customer uses team-based pipelines.
Groundhogg
Custom Field
Odoo CRM
res.partner custom field (via Odoo Studio)
lossyGroundhogg custom contact properties map to Odoo res.partner custom fields created via Odoo Studio before migration. Choice and dropdown fields map to Odoo selection fields or many2one relations depending on the field cardinality. We pre-create the destination schema in a staging database during discovery, then deploy it to production before data migration begins.
Groundhogg
Activity History
Odoo CRM
mail.message + crm.activity
1:1Groundhogg logs contact activities (email opens, link clicks, form submissions, tag applied, tag removed) as timestamped events. We map these to Odoo mail.message records linked to the res.partner or crm.lead. Each activity type gets a distinct mail.message.subtype to render differently in Odoo's chatter timeline. Email open events map to mail.message with subtype 'email_sent_open', link clicks map to 'email_link_click', form submissions map to 'form_submission'.
Groundhogg
Note
Odoo CRM
mail.message
1:1Groundhogg contact-level notes migrate to Odoo mail.message records with message_type = 'comment' attached to the corresponding res.partner or crm.lead. Author attribution migrates from the Groundhogg WP user email to the Odoo User id via the owner remap. Note body migrates as plain text; attachments migrate as ir.attachment records linked via res_id/res_model.
Groundhogg
User (Owner)
Odoo CRM
res.users
1:1Groundhogg maps owners via WordPress user IDs, which have no Odoo equivalent. We extract the Groundhogg WP user email addresses and match them against Odoo res.users by login email. Users without a matching Odoo account go to a reconciliation queue for the customer's admin to provision before record import. Owner assignments on Deals and Contacts resolve via this lookup at migration time.
Groundhogg
Broadcast (metadata)
Odoo CRM
mail.mass_mailing.record
1:1Groundhogg Broadcast emails are exported with subject, send date, and recipient count as metadata records. We create mail.mass_mailing records in Odoo capturing the broadcast name and send timestamp. The broadcast content and recipient list do not migrate as discrete objects; contacts who received broadcasts are identifiable via the activity history mapping of email_sent_open events. We flag this limitation during scoping so the customer can decide whether to export broadcast content as separate notes.
Groundhogg
Flow (documentation only)
Odoo CRM
None (no migration)
1:1Groundhogg Flows cannot be exported as automation logic via the REST API. We extract the trigger type, step count, and step names for each Flow and produce a written Flow Audit document listing every automation with its trigger, step sequence, and recommended Odoo Automated Action or server action equivalent. This document is handed off to the customer's Odoo admin or implementation partner for rebuild post-migration.
| Groundhogg | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Lead or Contact (split by status)1:many | Fully supported | |
| Company | res.partner (Company type)1:1 | Fully supported | |
| Contact (individual) | res.partner (Contact type)1:1 | Fully supported | |
| Tag | crm.tag or res.partner.categorylossy | Fully supported | |
| Deal | crm.lead (opportunity)1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Custom Field | res.partner custom field (via Odoo Studio)lossy | Fully supported | |
| Activity History | mail.message + crm.activity1:1 | Mapping required | |
| Note | mail.message1:1 | Fully supported | |
| User (Owner) | res.users1:1 | Fully supported | |
| Broadcast (metadata) | mail.mass_mailing.record1:1 | Fully supported | |
| Flow (documentation only) | None (no migration)1: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.
Groundhogg gotchas
Email deliverability is fully self-hosted
Automation flows do not export as logic
API rate limits are host-dependent, not Groundhogg-enforced
Feature availability is tier-dependent and affects what we export
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 Groundhogg database via REST API across plan tier (Basic/Plus/Pro/Agency), active Flows, pipeline stages, Deals, contact count, activity log volume, and custom field schema. We profile the WordPress hosting environment for API rate-limit behavior (noting that Groundhogg enforces no rate limits but the host or security plugin may return HTTP 429). We check sending IP reputation via common blocklist lookups. The discovery output is a written migration scope, a Groundhogg plan-tier verification, and a recommendation on whether SMTP reconfiguration should precede migration.
Schema design and Odoo custom field provisioning
We design the destination schema in Odoo via Odoo Studio or direct model definition. This includes creating custom fields on res.partner for Groundhogg custom properties, configuring crm.tag records to match Groundhogg tags, creating pipeline stage records in crm.stage with matching names and sequence numbers, and provisioning any missing crm.lead custom fields for deal metadata. Schema is deployed to a staging Odoo database first for validation before production migration begins.
Owner reconciliation and Odoo user provisioning
We extract every distinct WordPress user ID referenced as an owner on Groundhogg contacts, companies, and Deals and map them to Odoo res.users by email address. Owners without a matching Odoo User account go to a reconciliation queue. The customer's Odoo admin provisions any missing Users (active or inactive depending on whether the original Groundhogg user is still active). Migration cannot proceed past the Contact and Deal import phases until all Owner lookups are satisfied.
Staging migration and reconciliation
We run a full migration into the staging Odoo database using production-equivalent data volume. The customer reconciles record counts (Contacts in, Leads in, Companies in, Deals in, Activity records in), spot-checks 20-30 random records against the Groundhogg source, and validates that custom field data arrived correctly and that activity timestamps render in Odoo's chatter. The customer signs off the schema and mapping before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: Companies (res.partner with partner_type = 'company'), Contacts with parent_company_id resolved to the Company partner, Leads split from Contacts by status, Deals with stage_id, user_id, and partner_id resolved, Activity history (mail.message records via Odoo XMLRPC or external API with chunking and exponential backoff), and Tags. Each phase emits a row-count reconciliation report before the next phase begins. We throttle API requests based on the customer's Odoo instance capacity and the host's response behavior.
Cutover, Flow audit delivery, and hypercare
We freeze Groundhogg 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 Flow Audit document listing every Groundhogg Flow with trigger, step count, step names, and recommended Odoo Automated Action equivalent. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's sales team. We do not rebuild Groundhogg Flows as Odoo Automated Actions inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Groundhogg
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 Groundhogg 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
Groundhogg: Not enforced by Groundhogg; governed by host, CDN, or security plugin limits.
Data volume sensitivity
Groundhogg 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 Groundhogg to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Groundhogg 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 Groundhogg
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.