CRM migration
Field-level mapping, validation, and rollback between Cirqll and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Cirqll
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between Cirqll and Odoo CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Cirqll to Odoo CRM is a migration from a lightweight single-dashboard CRM to a modular ERP-adjacent CRM with a fundamentally different data model. Cirqll stores Contacts as Customers, Leads, Tasks, Activities, Notes, and Calendar Events as separate objects; Odoo CRM collapses the Lead and Contact model into crm.lead with an activity_ids activity stream attached. We pre-create the crm.lead schema, configure the stage pipeline values, then load Cirqll Customers as Partners (res.partner) and Leads as crm.lead in the correct dependency order. Activity history migrates to Odoo's crm.activity model attached to crm.lead records. Cirqll's 100 requests-per-minute API rate limit means we chunk all export batches into timed intervals and monitor for HTTP 429 responses. Document blobs, workflow automations, and custom field definitions do not migrate as code; we deliver a written inventory of documents to re-upload and automation rules to rebuild in Odoo Studio.
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 Cirqll 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.
Cirqll
Customer
Odoo CRM
Partner (res.partner)
1:1Cirqll Customer records map directly to Odoo res.partner. The name, email, phone, and address fields transfer with type mapping: Cirqll's single address block maps to Odoo's street, street2, city, state_id, zip, and country_id multi-field address model, which requires address normalization during the transform step. Customer Create API endpoint (the only fully documented Cirqll endpoint) drives the initial field map, and we validate against probe reads for any undocumented fields present in actual data.
Cirqll
Lead
Odoo CRM
Lead (crm.lead)
1:1Cirqll Lead records map to Odoo crm.lead. The lead's qualification status, source attribution, and owner assignment transfer as crm.lead stage_id, source_id, and user_id respectively. Odoo CRM's crm.lead model serves both unqualified leads and qualified opportunities in the same record; we use stage_id values to represent the Cirqll Lead lifecycle. Lead-to-Customer conversion history is preserved as a linked note or activity on the crm.lead record.
Cirqll
Task
Odoo CRM
Task (project.task)
1:1Cirqll Task records map to Odoo project.task. Due date, assignee (resolved via res.users email match), priority flag, and completion status transfer directly. Open and completed task states carry forward; Odoo's project.task.stage_id maps from Cirqll's task status, and date_deadline maps from due date. If the customer's Odoo instance does not activate the Project module, we configure crm.lead activity_ids for lightweight task tracking instead.
Cirqll
Activity
Odoo CRM
Activity (crm.activity)
1:1Cirqll Activity records (calls, emails, meetings) map to Odoo crm.activity records attached to crm.lead. Activity type, timestamp, owner attribution, duration, and related Contact or Lead migrate with the parent crm.lead ID resolved before activity insert. Odoo's crm.activity model uses activity_type_id to categorize as call, meeting, email, or other, which we map from Cirqll's activity type field. ActivityDate ordering preserves the original Cirqll timestamp for timeline fidelity.
Cirqll
Note
Odoo CRM
Note (note.note)
1:1Cirqll Notes attached to Contacts or Leads migrate to Odoo note.note records. Creation timestamp and author attribution transfer. We link note.note to the corresponding crm.lead or res.partner using res_id and res_model so that the note remains contextually attached to the right record in Odoo's activity and note streams. Rich text formatting in Cirqll notes is preserved where present in the API response.
Cirqll
Calendar Event
Odoo CRM
Calendar Event (calendar.event)
1:1Cirqll Calendar Events map to Odoo calendar.event with date, time, title, and attendee list. All-day event flags and recurrence patterns require field-level mapping because Cirqll's single-field date representation differs from Odoo's allday boolean and recurring_event_id split. If Cirqll exports recurrence patterns as text strings, we parse them into Odoo's calendar.recurrence model during the transform phase. Attendee list maps to calendar.attendee records linked to the event.
Cirqll
Document
Odoo CRM
Attachment (ir.attachment)
lossyDocuments stored in Cirqll are binary blobs that do not export via the standard API endpoints. We handle document migration as a secondary pass: we download documents from Cirqll in a staged workflow, preserving original filenames and upload timestamps, then re-upload to Odoo ir.attachment records linked to the corresponding res.partner, crm.lead, or project.task. Version history does not transfer. Teams should verify their Odoo plan's attachment storage limit before assuming full parity.
Cirqll
User
Odoo CRM
User (res.users)
1:1Cirqll User accounts and their assignment to Leads, Tasks, and Activities migrate as owner mappings in Odoo. We resolve Cirqll owner records by email match against the Odoo res.users table. Any Cirqll User without a matching Odoo User goes to a reconciliation queue for the customer to provision before record import resumes. Active versus inactive status carries forward from Cirqll; role-based permissions do not transfer because Odoo's access control groups are destination-specific.
Cirqll
Lead Stage
Odoo CRM
Stage (crm.stage)
lossyCirqll Lead stages map to Odoo crm.stage records within the crm.lead model. Stage names and order transfer, and probability percentages map to Odoo's stage_probability field if present in Cirqll's export. We create the crm.stage records before importing any crm.lead data so that stage_id references resolve at insert time.
Cirqll
Lead Source
Odoo CRM
Source (utm.source)
lossyCirqll Lead source attribution (campaign, referral, web form, etc.) maps to Odoo's utm.source model, which is the standard attribution taxonomy in Odoo CRM. We create the utm.source and utm.campaign records during the schema phase, then reference them by name during crm.lead import. If Cirqll uses a custom source taxonomy, we create matching utm.source records in Odoo before migration.
Cirqll
Sales Team
Odoo CRM
Sales Team (crm.team)
lossyCirqll does not expose a sales team object via its API, but team-based assignment can be inferred from owner groupings on Lead records. We map each distinct Cirqll owner group to an Odoo crm.team during schema design, then assign crm.lead records to the appropriate team based on the original owner's team association. Team members map to crm.team.member_ids from the res.users table.
Cirqll
Tags
Odoo CRM
Tags (crm.tag)
lossyCirqll tags applied to Customers, Leads, or Tasks migrate to Odoo crm.tag records. Tags used for classification map to the crm.tag model and linked via crm.lead.tag_ids (many2many) on the opportunity record. If Cirqll stores tags as free-text labels not exposed in the API, we extract them from record-level text fields during the data audit phase and create matching Odoo tags before migration.
| Cirqll | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | Partner (res.partner)1:1 | Fully supported | |
| Lead | Lead (crm.lead)1:1 | Fully supported | |
| Task | Task (project.task)1:1 | Fully supported | |
| Activity | Activity (crm.activity)1:1 | Fully supported | |
| Note | Note (note.note)1:1 | Fully supported | |
| Calendar Event | Calendar Event (calendar.event)1:1 | Fully supported | |
| Document | Attachment (ir.attachment)lossy | Fully supported | |
| User | User (res.users)1:1 | Fully supported | |
| Lead Stage | Stage (crm.stage)lossy | Fully supported | |
| Lead Source | Source (utm.source)lossy | Fully supported | |
| Sales Team | Sales Team (crm.team)lossy | Fully supported | |
| Tags | Tags (crm.tag)lossy | 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.
Cirqll gotchas
100 requests per minute API rate limit
Sparse API schema documentation
Document blob handling requires separate pass
No public pricing — tier limits unknown
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 scoping
We audit the source Cirqll account for record volumes (Customers, Leads, Tasks, Activities, Notes, Calendar Events, Documents), API access level, and plan tier. We request a Cirqll trial or sandbox to run probe reads against the undocumented endpoints, extracting field names and types from actual API responses. We pair this with an Odoo edition assessment: Community (free, self-hosted) for teams with technical capacity, or Odoo.sh / Enterprise (subscription) for managed hosting with automatic updates. The discovery output is a written migration scope, a source field inventory derived from probe reads, and an Odoo configuration plan.
Schema design and stage configuration
We design the destination Odoo CRM schema before any data moves. This includes creating crm.lead stages that map from Cirqll's Lead status values, configuring crm.team records for Cirqll owner groups, creating crm.tag records for Cirqll tag taxonomy, and creating utm.source and utm.campaign records for attribution mapping. If Cirqll documents require migration, we verify Odoo's ir.attachment storage configuration. Schema is deployed into the Odoo Sandbox first for validation. Any Odoo Studio custom fields (custom on crm.lead, res.partner, or project.task) are created during this phase.
Sandbox migration and reconciliation
We run a full migration into an Odoo Sandbox using production-like data volumes. The customer reconciles record counts across all object types, spot-checks 20-40 random records against the Cirqll source, and validates that stage assignments, owner mappings, and activity timelines look correct. Address normalization (Cirqll single-field to Odoo multi-field), tag mapping, and calendar recurrence parsing are tested here. We do not proceed to production until the customer signs off on the Sandbox pass.
Owner reconciliation and User provisioning
We extract every distinct Cirqll User referenced as an owner on Lead, Task, or Activity records and match by email against the Odoo destination's res.users table. Any Cirqll owner without a matching Odoo User goes to a reconciliation queue for the customer to provision before record import resumes. Migration cannot proceed past this step because user_id references are required on most crm.lead and project.task records.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (from Cirqll Customers) first, then crm.lead (from Cirqll Leads with stage_id and user_id resolved), then crm.stage and utm records (referenced by foreign key), then crm.activity and project.task (with parent record IDs resolved), then calendar.event and note.note, then ir.attachment (document blob pass last, separately scoped). Each phase emits a row-count reconciliation report before the next phase begins. We pace all Cirqll API reads to stay under 100 req/min using timed batch intervals.
Cutover, validation, and automation inventory handoff
We freeze Cirqll 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 validate crm.lead stage distribution, res.partner address completeness, and calendar event recurrence integrity in a post-migration report. We deliver a written inventory of Cirqll automation rules (if any exist), document attachment URLs requiring manual re-upload, and tag taxonomy mapping for Odoo admin review. We support a one-week hypercare window for reconciliation issues. We do not rebuild automations or configure Odoo Studio as part of the standard migration scope.
Platform deep dives
Cirqll
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Cirqll and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Cirqll and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Cirqll 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
Cirqll: 100 requests per minute per client (confirmed via docs.api.cirqll.nl/rate-limiting).
Data volume sensitivity
Cirqll 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 Cirqll to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Cirqll 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 Cirqll
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.