CRM migration

Migrate from Agillic to Odoo CRM

Field-level mapping, validation, and rollback between Agillic and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

Agillic logo

Agillic

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

53%

8 of 15

objects map 1:1 between Agillic and Odoo CRM.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Agillic to Odoo CRM is an architectural migration: Agillic stores contacts as flat Recipients with arbitrary custom properties, while Odoo enforces a Contact-and-Company hierarchy where every person record belongs to a company parent. We resolve this by grouping recipients by email domain to create parent Company records first, then linking Contacts to those parents during import. Custom recipient properties have no fixed Agillic schema — discovery must enumerate every active field before mapping begins, or those attributes are silently lost. Activity logs (sends, opens, clicks, SMS, events) migrate as Odoo Tasks and Events distributed by Flow Execution ID where enabled; we do not migrate Flows themselves because their branching logic, conditions, and delay steps are Agillic-internal and must be rebuilt as Odoo Server Actions and Action Rules. Global Data Tables require a separate schema decision: they map to Odoo custom model records if row volume is high, or flatten into custom fields on Contact if per-record attributes are few. We deliver a written inventory of every active Agillic Flow requiring rebuild and a recommendation for Odoo Email Marketing or a third-party email platform to replace Agillic's native channel activation.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Agillic logo

Agillic

What's pushing teams away

  • Rate limits and API quotas are not publicly documented, creating uncertainty for teams planning large-scale data migrations or integrations.
  • The platform's heavy reliance on developer configuration for data synchronisation, custom flow elements, and content templates means marketing teams without technical support encounter bottlenecks.
  • Complex workflow logic built by developers becomes difficult for non-technical marketers to modify independently, limiting operational agility.
  • Exporting Activity data requires external analysis tools; Agillic itself lacks built-in advanced analytics dashboards for post-campaign insight generation.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Agillic objects map to Odoo CRM

Each row shows how a Agillic 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.

Agillic

Recipient

maps to

Odoo CRM

Contact + Company (hierarchy required)

1:many
Fully supported

Agillic Recipients are flat person records with no mandatory company parent. Odoo requires every Contact to belong to a Company. We group Recipients by email domain to create parent Company records first (example.com becomes a Company named 'example.com Domain Group'), then link each Contact to its parent via the contact_ids relationship. Recipients without an identifiable domain become Contacts without a parent Company. This is the foundational step — all subsequent Contact imports depend on the Company parent existing.

Agillic

Recipient Property (standard)

maps to

Odoo CRM

Contact custom field

lossy
Fully supported

Standard Agillic recipient fields (email, first name, last name, phone, address, birthday) map directly to Odoo Contact fields. All custom recipient properties defined by the client are enumerated during discovery and pre-created as Odoo custom fields on the Contact model via Studio or a data migration module before any Contact records are imported.

Agillic

Activity: Send/Open/Click

maps to

Odoo CRM

Task (logged activity)

1:1
Fully supported

Agillic send, open, and click events migrate as Odoo Task records with a custom activity_type field (email_sent, email_opened, email_clicked). The Flow Execution ID preserved in Activity Exports links each Task to a custom flow_execution_ref field on the Contact for journey reconstruction. We set Task create_date to the original Agillic activity timestamp to preserve timeline order.

Agillic

Activity: SMS Delivery

maps to

Odoo CRM

Task (custom subtype)

1:1
Fully supported

Agillic SMS delivery events migrate as Odoo Task records with a custom sms_delivery field. Delivery status (delivered, failed, undelivered) maps to a custom sms_status__c picklist on the Task. If the SMS content body is needed, it stores in the Task description field.

Agillic

Activity: Event Trigger

maps to

Odoo CRM

Event

1:1
Fully supported

Agillic event triggers (Flow Entry events, custom events) migrate as Odoo Event records. The event name maps to Event Subject; event timestamp maps to Event StartDateTime. Custom event properties from Agillic store in custom fields on the Odoo Event model.

Agillic

Activity: Meeting

maps to

Odoo CRM

Event

1:1
Fully supported

Agillic meeting activities with confirmed attendee lists migrate as Odoo Event records. StartDateTime, EndDateTime, Location, and attendee Contact references map directly. Meeting title maps to Event Subject.

Agillic

Activity: Note

maps to

Odoo CRM

Note

1:1
Fully supported

Agillic notes attached to Recipients migrate as Odoo Note records linked via mail.message or ir.attachment to the parent Contact. Note body and create date migrate verbatim; author is resolved via owner email to the Odoo User.

Agillic

Global Data Table

maps to

Odoo CRM

Custom Model (ir.model) or Contact custom field

lossy
Fully supported

Global Data Tables in Agillic are custom relational structures referenced in Flows. If a table has few columns and fewer than 1,000 rows per Recipient, we flatten it into custom fields on the Contact model. If a table has complex columns, foreign keys, or high row volume, we create a custom Odoo model via Python module with a many2one relationship to Contact, then import all rows. This decision is made during discovery based on table count and row volume.

Agillic

Flow Execution History

maps to

Odoo CRM

Contact tags + custom field

lossy
Fully supported

Agillic Flow names and associated Flow Execution IDs are preserved as Contact tags (one tag per unique Flow name) and stored in a custom field flow_execution_ids__c as a semicolon-separated list. This provides a referenceable audit trail of which Flows touched each Contact without requiring Odoo to understand Agillic Flow logic.

Agillic

Flow (automation logic)

maps to

Odoo CRM

Server Action / Action Rule

lossy
Fully supported

Agillic Flows cannot be exported as portable definitions. We deliver a written inventory of every active Agillic Flow with its trigger event, conditions, actions, and wait steps. The customer or an Odoo implementation partner rebuilds each Flow as Odoo Server Actions and Action Rules. This is explicitly not a data migration — it is a documented handoff for manual rebuild.

Agillic

Template

maps to

Odoo CRM

Email Template (mail.template)

lossy
Fully supported

Agillic email, SMS, and push templates export as content files with dynamic field markers. We map template content to Odoo Email Template records, replacing Agillic's Liquid-style dynamic markers with Odoo's qweb-templating syntax. HTML templates require content refactoring; we document all unmapped dynamic fields for the customer's admin to configure in Odoo Studio.

Agillic

Recipient Export snapshot

maps to

Odoo CRM

Contact CSV import

1:1
Fully supported

Agillic's Recipients Export feature produces a snapshot file of all recipient records and current field values. We use this as a baseline reconciliation source against the API export, identifying records that differ between the two data sources and flagging discrepancies before import begins.

Agillic

Owner

maps to

Odoo CRM

User

1:1
Fully supported

Agillic Owners map to Odoo User records. We resolve by email match against the destination Odoo User table. Any Owner without a matching User is held in a reconciliation queue for the customer's admin to provision before Contact and Deal import resumes.

Agillic

Audience Segment

maps to

Odoo CRM

Contact tag or Odoo Marketing list

lossy
Fully supported

Agillic audience segments (Google and Meta activation lists) are captured as membership records. We recreate equivalent segments as Odoo Contact tags (one tag per segment name) and document the membership criteria so the customer can rebuild segment logic in Odoo Email Marketing or a third-party activation tool.

Agillic

Content Block

maps to

Odoo CRM

External storage reference

1:1
Fully supported

Agillic Content Blocks are modular HTML and text fragments used across templates. We export block content and metadata, then document the replacement strategy: content blocks map to Odoo Email Template snippets (ir.ui.view fragments) or an external content management reference. HTML content blocks require refactoring for Odoo's qweb templating engine.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

Agillic logo

Agillic gotchas

High

Undocumented API rate limits complicate bulk migration planning

High

Fully custom schema requires mandatory field enumeration during discovery

Medium

Flows are not exportable as portable workflow definitions

Medium

Activity Export requires explicit Flow Execution ID enablement

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Recipient flat model requires parent Company hierarchy creation

    Agillic Recipients do not have a mandatory company parent — they are flat person records with any custom property. Odoo CRM enforces that every Contact belongs to a Company (Address Book entry). We group Recipients by email domain to create parent Company records (example.com becomes a Company named 'example.com Group') before any Contact import. If a client's Agillic data includes named companies in custom properties rather than domain grouping, we map those custom fields to existing or new Company records. Skipping this step results in orphaned Contacts with no company linkage, breaking Odoo's CRM reporting by company and contact duplication across domains.

  • Undocumented Agillic API rate limits require adaptive extraction

    Agillic's REST API is rate limited per production instance per day, but specific thresholds are not publicly documented. During migration, if we exceed these limits the API returns 429 errors and stops accepting requests. We handle this by implementing exponential backoff on API calls, monitoring for 429 responses, and switching to WebDAV or SFTP Activity Export endpoints when API calls are throttled. We request Agillic support to confirm current rate limit values before scoping a large-volume migration. Missing this step results in incomplete data extraction or migration timeouts.

  • Global Data Tables have no native Odoo equivalent

    Agillic Global Data Tables are custom relational data structures referenced within Flows — essentially client-defined database tables with arbitrary columns. Odoo CRM has no native equivalent without custom module development. We assess each table's column count, row volume, and foreign key relationships during discovery. Tables with fewer than 500 rows per Recipient flatten into Contact custom fields. Tables with complex schemas or high row counts require a custom Odoo model (ir.model) created via Python module before migration. This pre-provisioning adds a schema development phase that is not present in same-platform migrations.

  • Custom recipient properties require mandatory enumeration before mapping

    Agillic allows clients to define arbitrary custom properties on Recipients with no fixed data model. There is no single documented list of all possible fields — each client's schema is unique. We cannot begin mapping until we have enumerated every active recipient property via the Recipient API and cross-referenced against a Recipients Export snapshot. Missing fields during migration results in silent data loss for those attributes. We check both staging and production environments during discovery and request the client to confirm which custom properties are actively used versus legacy.

  • Flow Execution ID must be enabled before Activity Export

    The Flow Execution ID is not included in Agillic Activity Exports by default — it must be explicitly enabled under Settings > System Settings > Export > Activity Exports. Without this setting enabled, activity records migrate without the reference needed to tie them back to specific campaign runs, making customer journey reconstruction in Odoo significantly harder. We check this setting on both staging and production during discovery and request the client enables it before exporting historical data. If it was not enabled historically, the Flow Execution ID is absent from historical records by design.

Migration approach

Six steps for a successful Agillic to Odoo CRM data migration

  1. Discovery and schema enumeration

    We audit the Agillic production instance to enumerate the complete custom recipient property schema via the Recipient API and a full Recipients Export snapshot. We inventory every Global Data Table, capturing column names, data types, row counts, and foreign key relationships. We check the Activity Export settings to confirm Flow Execution ID is enabled, and request the client to enable it if not. Simultaneously, we assess the destination Odoo instance: on-premise, Odoo.sh, or Odoo Online; which Odoo apps are installed (CRM only or CRM plus other apps); and the Odoo edition (Community or Enterprise). The discovery output is a written migration scope document that enumerates every recipient property to be mapped and a schema decision for each Global Data Table.

  2. Schema pre-provisioning in Odoo

    We create the destination schema in Odoo before any data is imported. This includes: creating parent Company records from email domain grouping (and any named companies from Agillic custom fields); creating all custom fields on the Contact model via Odoo Studio for every Agillic custom recipient property; creating custom models for any Global Data Tables that require a relational structure rather than flattened fields; configuring Odoo Lead stages if the client wants to use Odoo's Lead pipeline alongside Contacts; and setting up Contact tags for Flow names and audience segments. Schema is deployed to a staging Odoo database first for validation. This phase is unique to Agillic migrations because of the arbitrary custom schema — it does not appear in migrations from platforms with fixed data models.

  3. Staging migration and reconciliation

    We run a full migration into a staging Odoo database using production-like data volume. The customer's RevOps or CRM lead reviews record counts (Contacts in, Companies in, Leads in, Opportunities in, Activities in), spot-checks 25-50 random Contacts against the Agillic source for field-level accuracy, validates the Company-Contact hierarchy structure, and confirms Global Data Table rows are in the correct custom model or custom fields. Sign-off on the staging migration is required before production migration begins. Any mapping corrections identified during staging happen here.

  4. Owner reconciliation and Odoo User provisioning

    We extract every distinct Agillic Owner referenced on Recipient, Activity, and any linked records, and match by email against the destination Odoo User table. Owners without a matching Odoo User are listed in a reconciliation queue. The customer's Odoo admin provisions any missing Users (active for current team members, inactive for departed users whose records must preserve ownership). Migration cannot proceed past the Contact import phase because Owner references (user_id on Contact) are required and unresolved references cause import failures.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Companies (parent records created first from domain groups), Contacts (with parent Company link resolved), Leads (if Odoo's Lead pipeline is in scope), Opportunities (with Contact and Company lookups resolved), Activity history (Tasks for emails and calls, Events for meetings, Notes for freeform entries — distributed across the correct parent Contact), and Global Data Table rows (into custom models with Contact many2one lookup). Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's CSV import via settings or the xmlrpc API with batch chunking for large record sets.

  6. Cutover, validation, and Flow rebuild handoff

    We freeze writes to Agillic during cutover, run a final delta migration of any records modified during the migration window, then set Odoo CRM as the system of record. We deliver the Flow inventory document — listing every active Agillic Flow with its trigger, conditions, and actions, with recommended Odoo Server Action and Action Rule equivalents — to the customer's admin team. We do not rebuild Flows as Odoo automations inside the migration scope; that is a separate engagement. We support a one-week hypercare window to resolve reconciliation issues raised by the customer's team. We do not provide post-migration admin training, workflow rebuild, or ongoing support as standard scope.

Platform deep dives

Context on both ends of the pair

Agillic logo

Agillic

Source

Strengths

  • Fully customisable recipient schema with no fixed field constraints.
  • Native omnichannel support: email, SMS, push, print, paid media, and point-of-sale.
  • GDPR compliance built-in with annual independent security audits.
  • Staging and production separation for safe campaign testing.
  • Real-time audience activation to Google and Meta.

Weaknesses

  • API rate limits are not publicly documented, complicating migration planning.
  • Heavy developer dependency for data sync, custom flows, and content templates.
  • No built-in advanced analytics — requires external BI tools for activity analysis.
  • Workflows (Flows) are tightly coupled to Agillic's execution engine, making cross-platform migration requires reimplementation.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. All 8 core objects map 1:1 between Agillic and Odoo CRM.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Agillic and Odoo CRM.

  • Object compatibility

    A

    All 8 core objects map 1:1 between Agillic and Odoo CRM.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Agillic: Not publicly documented — limited per production instance per day.

  • Data volume sensitivity

    B

    Agillic doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Agillic to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Agillic to Odoo CRM data migrations

Answers to the questions buyers ask most during Agillic to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Agillic to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most Agillic to Odoo CRM migrations land between four and eight weeks. Migrations under 15,000 Recipients with fewer than 50 custom properties and no Global Data Tables complete in four to six weeks. Migrations with high-volume activity histories (over 200,000 engagement records), multiple Global Data Tables requiring custom model creation, or complex domain-based company grouping move to eight to fourteen weeks because of the mandatory schema pre-provisioning phase that is unique to Agillic's arbitrary custom schema.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Agillic.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day