CRM migration
Field-level mapping, validation, and rollback between HaystackCRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
HaystackCRM
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between HaystackCRM and Odoo CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from HaystackCRM to Odoo CRM is a migration from a mobile-first, spreadsheet-driven small-business CRM into a modular open-source ERP platform where CRM is one of many integrated applications. HaystackCRM has no documented public API, so all source data originates from CSV and Excel exports that must be reassembled with relationship integrity before loading into Odoo. We export Contacts and Companies first to resolve the partner lookup chain, then Opportunities and Tasks, then any Items catalog data. Odoo CRM uses a Partner model that conflates individuals and organizations — Haystack Companies map to Odoo Partner records with company=True, and Haystack Contacts map to Partner records with company=False and a parent_id reference to the Company Partner. Tags flatten into Odoo Tags with no hierarchy preserved. We do not migrate HaystackCRM workflows, automations, or Fourth Shift ERP bridge records; those are documented for the customer's Odoo administrator to rebuild or reconfigure 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 HaystackCRM 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.
HaystackCRM
Contact
Odoo CRM
res.partner (company=False)
1:1HaystackCRM Contact maps to Odoo res.partner with company=False and a parent_id reference to the mapped Company Partner record. We export Contacts with their associated Company ID from the Haystack spreadsheet, then resolve the Company to its Odoo partner ID before inserting the Contact partner record. Standard fields (name, phone, email, street, city, state, zip, country) map directly. Tags map to Odoo Tags (mail.tag) with no hierarchy preserved from Haystack's flat tag model.
HaystackCRM
Company
Odoo CRM
res.partner (company=True)
1:1HaystackCRM Company maps to Odoo res.partner with company=True. This record is inserted before the Contact import so that parent_id references are satisfied at the moment of Contact insert. The Company name becomes the partner display name. Industry classification and any website data map to industry_id (res.partner.industry) and website fields respectively. Company records are processed before Contacts to preserve the lookup chain integrity across the spreadsheet reconstruction.
HaystackCRM
Opportunity
Odoo CRM
crm.lead
1:1HaystackCRM Opportunity maps to Odoo crm.lead. The Opportunity's dollar value maps to planned_revenue, stage maps to stage_id (resolving the Odoo stage name against the target crm.team's stage set), and temperature priority maps to priority (a selection field: 0=Low, 1=Medium, 2=High, 3=Very High). The Contact or Company link in Haystack resolves to the Odoo partner_id and partner_name on crm.lead. We create crm.lead records with type='opportunity' to distinguish from Odoo's separate lead concept.
HaystackCRM
Task
Odoo CRM
project.task
1:1HaystackCRM Tasks linked to an Opportunity map to project.task records within a dedicated Odoo Project (created during migration to host all migrated Tasks). Tasks linked to a Contact or Company map to project.task records with no project_id but with partner_id set to the Odoo res.partner ID. Due dates, task status (open/closed), and title map directly. We export Tasks after Contacts and Opportunities so that parent record IDs are available for lookup resolution.
HaystackCRM
Event
Odoo CRM
calendar.event
1:1HaystackCRM Events map to Odoo calendar.event. The event title, start datetime, end datetime, and location fields migrate directly. Attendee resolution maps Haystack Contact IDs to Odoo partner IDs and creates calendar.attendee records. Calendar sync links (device calendar integration) cannot be reconstructed in Odoo and must be rebuilt manually in the Odoo calendar settings post-migration. We export Events as discrete date-bound records without assuming any recurring pattern unless the customer documents recurrence rules explicitly.
HaystackCRM
Item / Catalog
Odoo CRM
product.product
1:1HaystackCRM Items in the catalog map to Odoo product.product records with type='product' for goods or type='service' for services. Pricing data maps to list_price. The Items catalog is migrated before Line Items if the customer uses Odoo Sale Orders; for CRM-only migrations the Items catalog is migrated as a reference dataset. Product SKU maps to default_code and the item description maps to description_sale.
HaystackCRM
Quote / Proposal
Odoo CRM
sale.order
lossyHaystackCRM Quotes generated from Opportunities map to Odoo sale.order in draft state. We export quote line items as sale.order.line records linked to product.product. The Odoo sale.order is created without submitting or confirming it, so the customer can review and manually finalize pricing and terms before using Odoo's sale order workflow. PDF links from Haystack are preserved in a custom field on the sale.order for manual reference.
HaystackCRM
User
Odoo CRM
res.users
1:1HaystackCRM Users (owners) map to Odoo res.users records. We resolve by email match against the destination Odoo instance's user table. Any HaystackCRM owner without a matching Odoo user goes to a reconciliation queue; the customer's Odoo administrator provisions the missing user before record import resumes. Owner assignments on Opportunities and Tasks map to Odoo user_id on crm.lead and project.task respectively.
HaystackCRM
Team
Odoo CRM
crm.team
lossyHaystackCRM Teams map to Odoo crm.team records. Team membership and role assignments are exported and mapped to Odoo team member records on crm.team. We create one crm.team per Haystack Team and configure stage sets per team so that pipeline stage values remain scoped correctly. Territory and role granularity beyond basic grouping requires Odoo Administrator reconfiguration post-migration.
HaystackCRM
Tag
Odoo CRM
mail.tag
lossyHaystackCRM's flat tag model maps to Odoo mail.tag as top-level tags with no nesting. Tags are linked to crm.lead records via crm.tag.rel. Tags applied to Contacts or Companies migrate as tags on the corresponding res.partner records. The customer should plan a tag consolidation or renaming session during pre-migration scoping because Haystack tag taxonomies tend to accumulate inconsistencies at scale.
HaystackCRM
File Attachment
Odoo CRM
ir.attachment
1:1HaystackCRM file attachments stored in Dropbox, iCloud, or OneDrive are exported as external URL references. We export the attachment URLs and map them to Odoo ir.attachment records with type='url'. Native Odoo attachment storage (stored in the database or filestore) requires the customer to configure their Odoo filestore path during setup. We flag this as a post-migration configuration step and include the full list of attachment URLs in the migration inventory document.
HaystackCRM
Dashboard Metrics
Odoo CRM
(none)
lossyHaystackCRM dashboard metrics are computed dynamically from live data and do not exist as persistent records. We do not migrate dashboard snapshots. The Odoo CRM dashboard and any Odoo Reporting module (account_accountant, l10n reports) should be configured by the customer's Odoo administrator post-migration using the migrated data as the source. We provide record count summaries and pipeline value summaries from Haystack as reference targets for dashboard reconstruction.
| HaystackCRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (company=False)1:1 | Fully supported | |
| Company | res.partner (company=True)1:1 | Fully supported | |
| Opportunity | crm.lead1:1 | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| Event | calendar.event1:1 | Fully supported | |
| Item / Catalog | product.product1:1 | Fully supported | |
| Quote / Proposal | sale.orderlossy | Fully supported | |
| User | res.users1:1 | Fully supported | |
| Team | crm.teamlossy | Fully supported | |
| Tag | mail.taglossy | Fully supported | |
| File Attachment | ir.attachment1:1 | Fully supported | |
| Dashboard Metrics | (none)lossy | Not 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.
HaystackCRM gotchas
Free tier 2,500-record cap blocks imports silently
No public API forces spreadsheet-only migration
Tag-based segmentation has no hierarchy
Email integration stores conversations in-app
Fourth Shift ERP integration is one-directional
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 export audit
We audit the HaystackCRM account across record types (Contacts, Companies, Opportunities, Tasks, Events, Items), Teams, Tags, and file attachment references. We run the CSV and Excel exports for each object type and validate record counts against the free tier's 2,500-record ceiling — if the dataset exceeds that cap, we require the customer to upgrade to Pro or trim records before migration begins. The discovery output is a written migration scope document listing record counts per object, any data quality issues (duplicate emails, missing required fields), and the target Odoo database version and edition.
Odoo configuration and schema preparation
We configure the destination Odoo database before any data loads. This includes creating crm.team records matching Haystack Teams, configuring stage sets per team, provisioning res.users for each HaystackCRM owner with matching email addresses, and creating product.product records from the Haystack Items catalog. We also set up mail.tag records from the Haystack tag taxonomy. Odoo configuration is deployed to a staging database first for validation, with the customer reviewing the empty CRM layout before production data is written.
Staging migration and reconciliation
We run a full migration into a staging Odoo environment using production data volume. The customer reconciles record counts (Partners in, Contacts in, Opportunities in, Tasks in), spot-checks 25-50 records against the HaystackCRM source, and validates that tag assignments, owner assignments, and stage values are correct. Any mapping corrections — wrong field type, missing required field, stage name mismatch — are applied to the transform scripts before the production migration. This step is critical because HaystackCRM field names and picklist values may not match Odoo expectations exactly.
Companies export, import, and partner ID capture
We export HaystackCRM Companies via the spreadsheet export, clean the data (standardize industry names, validate website URLs, normalize address fields), and import into Odoo as res.partner records with company=True. We capture the newly generated Odoo partner IDs mapped to the original Haystack Company IDs for use in the Contact import. This step must complete before Contacts are imported because Contact records require a valid parent_id reference to an existing Partner.
Contacts export, import, and opportunity linkage
We export HaystackCRM Contacts with their associated Company IDs, resolve those Company IDs to the Odoo partner IDs captured in the previous step, and import into Odoo as res.partner records with company=False and parent_id set to the resolved Company Partner. Opportunities are exported with their Contact and Company IDs, resolved to Odoo partner IDs, and imported as crm.lead records with type='opportunity'. Stage names are matched against the target crm.team's stage set, and temperature priority maps to the crm.lead priority field. Tasks and Events follow in dependency order, with owner assignments resolved via the user email mapping.
Cutover, delta sync, and Workflow rebuild handoff
We freeze writes to HaystackCRM during the cutover window, run a final delta export of any records modified during the migration window, and import the delta into Odoo. We then enable Odoo as the system of record. We deliver the migration inventory document covering all object counts, tag mapping, owner reconciliation, attachment URL list, and a written note of every Haystack workflow or automation that cannot migrate (CRM workflows, Fourth Shift bridge records, calendar sync links). The customer's Odoo administrator uses this document to rebuild automations via Odoo Server Actions and Automated Actions. We provide a one-week hypercare window for reconciliation issues but do not rebuild automations as part of the standard migration scope.
Platform deep dives
HaystackCRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between HaystackCRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across HaystackCRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between HaystackCRM 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
HaystackCRM: Not applicable..
Data volume sensitivity
HaystackCRM 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 HaystackCRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your HaystackCRM 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 HaystackCRM
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.