CRM migration

Migrate from Dubsado to Odoo CRM

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

Dubsado logo

Dubsado

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

64%

9 of 14

objects map 1:1 between Dubsado and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Dubsado to Odoo CRM is a structural redesign, not a record copy. Dubsado organizes data around Clients and Projects with no native pipeline, lead, or opportunity concept. Odoo CRM uses Leads, Opportunities, and a Kanban pipeline alongside its accounting and project modules. We resolve the Dubsado Project structure into Odoo Opportunities or Project tasks based on the customer's business model, map Dubsado's flat client-project hierarchy into Odoo's res.partner (Contact/Company) parent-child model, and preserve invoice and contract history through the account.invoice API. Dubsado Workflows and automations do not migrate; we deliver a written inventory of every trigger, condition, and action for manual rebuild in Odoo Studio or via custom Python modules. Email history stored in Dubsado's IMAP-connected inbox must be exported from the email provider separately.

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

Dubsado logo

Dubsado

What's pushing teams away

  • Steep learning curve and complex configuration requirements mean teams often spend weeks setting up the platform properly before it becomes productive.
  • Users report feeling locked in after importing their data, with migration paths that are not clearly documented or supported.
  • Per-user pricing tiers can escalate quickly — additional brands cost $10/month, and adding team members beyond the initial four requires fixed-tier upgrades.
  • Some users describe the interface as clunky and consider it overpriced relative to their business needs, particularly as their operations scale.
  • Workflow automations are platform-specific and cannot be exported, requiring complete manual rebuilding on any new destination platform.

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 Dubsado objects map to Odoo CRM

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

Dubsado

Client

maps to

Odoo CRM

res.partner (Contact and Company)

1:many
Fully supported

Dubsado Clients map to Odoo res.partner records. We apply a split rule during migration: Clients with a Company name field populated become res.partner records with is_company=True (the Company). Individual contacts at that company become separate res.partner records with parent_id pointing to the Company partner. Clients without a company name become individual res.partner contacts with is_company=False. Dubsado Client custom fields map to res.partner custom fields (ir.model.fields with track_visibility). Email is the dedupe key during import.

Dubsado

Project

maps to

Odoo CRM

crm.lead (Lead) or project.project (Project)

1:many
Fully supported

Dubsado Projects have no direct Odoo CRM equivalent because Odoo separates sales pipeline (crm.lead / crm.lead) from project delivery (project.project). We apply a split rule during scoping based on project status and intent: Projects with status Active and intent to sell become Odoo crm.lead records (with stage set to a Dubsado-mapped pipeline stage). Projects with status Completed or intent to deliver become project.project records with the client as project.partner_id. Customers choose the split strategy during discovery. Project creation date and status history are preserved in custom fields on both record types.

Dubsado

Project

maps to

Odoo CRM

crm.lead (Opportunity)

lossy
Fully supported

For Dubsado Projects that map to crm.lead, we create an Odoo Opportunity record. The Dubsado project name becomes the Opportunity name, the linked Client maps to res.partner via the client mapping, and project total value maps to crm.lead.planned_revenue. We configure Odoo pipeline stages during migration setup to match Dubsado project statuses (e.g., Inquiry, Proposal Sent, Contract Signed, Active, Completed) as crm.stage records with sequence and is_won/is_lost flags.

Dubsado

Invoice

maps to

Odoo CRM

account.move (Invoice)

1:1
Fully supported

Dubsado Invoices map to Odoo account.move records with move_type='out_invoice' for standard invoices and move_type='out_refund' for credits. We preserve Invoice ID, amount, status (paid/unpaid/partial/void), due date, line items (product, quantity, unit price, tax), and Dubsado Payments transaction IDs. If Odoo Accounting is in scope, we set the journal to the customer's default sale journal. Recurring invoice schedules migrate as recurring.template records linked to sale.subscription if the customer enables the Odoo Subscription module.

Dubsado

Contract

maps to

Odoo CRM

ir.attachment + account.move (for signed documents)

1:1
Fully supported

Dubsado Contracts store PDF documents with signature data (signing timestamp, signer name). We export the contract PDF as an ir.attachment linked to the related res.partner and/or crm.lead record. Contract status (sent, signed, expired), related Client, and signature timestamps migrate to custom fields on the linked partner or lead. The actual contract PDF body content is preserved as an attachment; we do not extract individual field data from the PDF. Contract templates do not migrate as reusable templates in Odoo; the customer's admin recreates templates in Odoo Studio or via a document template app.

Dubsado

Proposal

maps to

Odoo CRM

sale.order (Quotation)

1:1
Fully supported

Dubsado Public Proposals (Premier-plan only) map to Odoo sale.order records with state='draft'. Proposal status (draft, sent, viewed, signed) maps to Odoo sale.order state and a custom field proposal_status__c. Proposal line items map to sale.order.line records with product, description, quantity, and price. Note that Odoo requires sale_timesheet or sale_stock modules to be installed for time-and-materials or subscription proposals; we confirm the relevant Odoo apps during discovery.

Dubsado

Lead Capture Form

maps to

Odoo CRM

crm.lead (from website form) + website_form.configurator

1:1
Fully supported

Dubsado Lead Capture Form submissions map to crm.lead records with the lead_source set to the form name and the form submission data stored in a custom field (lead_form_data__c) as JSON. We export form field labels and values. Odoo does not have a native form builder equivalent to Dubsado's Lead Capture Forms; the customer's admin rebuilds forms using Odoo Website builder (if installed) or a third-party form app from the Odoo Apps store. Form templates do not migrate as reusable forms.

Dubsado

Custom Fields (Client and Project)

maps to

Odoo CRM

ir.model.fields (res.partner custom, crm.lead custom)

lossy
Fully supported

Dubsado custom fields on Clients map to custom ir.model.fields on res.partner. Dubsado custom fields on Projects map to custom ir.model.fields on crm.lead or project.project depending on the project split decision. We preserve field type (short answer maps to char, date maps to date, dropdown maps to selection or many2one depending on whether the options represent a related record type). Field options are preserved as selection values or related model records. We create the custom fields in Odoo via XML data migration before importing data so that field data is written into typed columns rather than unstructured notes.

Dubsado

Task

maps to

Odoo CRM

project.task

1:1
Fully supported

Dubsado Tasks map to project.task records. We link each task to its parent Dubsado Project via project_id, set task.stage_id to the Odoo stage matching the Dubsado task status, and preserve assignee (user_ids), due date, creation date, and completion date. Dubsado task notes migrate as project.task.description (plain text). Task subtasks do not have a native Odoo equivalent; we flatten subtask relationships into a parent_task_id link where available or into a project.task custom notes field.

Dubsado

Time Entry

maps to

Odoo CRM

account.analytic.line

1:1
Fully supported

Dubsado Time Entries map to account.analytic.line records (used by Odoo Project for time tracking). We preserve duration (unit_amount), date, linked task_id (via project.task), and billable flag. Billable time entries linked to Dubsado Invoices are cross-referenced with account.move line records during invoice migration. If the customer does not install Odoo Project or Timesheet apps, time entry data migrates as a project.task custom field for reference only.

Dubsado

Client Portal

maps to

Odoo CRM

res.users (portal user) + website.portal

lossy
Fully supported

Dubsado Client Portal access status and per-client portal settings migrate as res.users records with share=True (portal user) linked to the res.partner client record. Portal-specific customizations (banner image, access permissions) are documented as a portal.config audit record because Odoo's portal access is configured via website.portal and access.control.list models rather than per-partner flags. Portal URL mapping is documented in the migration checklist. Note: Odoo portal access requires the website module and may require additional configuration beyond a basic CRM setup.

Dubsado

User / Team Member

maps to

Odoo CRM

res.users

1:1
Fully supported

Dubsado Team Members map to Odoo res.users records. Owner maps to res.users with admin=True; Manager maps to res.users with groups_id including sales_manager; Team Member maps to res.users with sales_user. Dubsado does not have a granular permission model, so the mapping is a best-effort translation. We export active users and their role assignments. If a Dubsado user does not have an Odoo login provisioned, they go to a reconciliation queue for the customer's admin to provision before production migration.

Dubsado

Canned Email Templates

maps to

Odoo CRM

mail.template

1:1
Mapping required

Dubsado Canned Email Templates export as mail.template records in Odoo. We preserve template name, subject, and body content (plain text or HTML). Dubsado merge field syntax (e.g., [Client Name]) is documented with a mapping table to Odoo Jinja2 field syntax (e.g., {{ object.partner_id.name }}). The customer's admin validates merge field mappings per template after migration. Template categorization does not migrate; we create a single folder in Odoo for migrated templates with a reference to the original Dubsado template name.

Dubsado

Package and Discount

maps to

Odoo CRM

product.product or sale.order.line discount

1:1
Fully supported

Dubsado Packages (reusable service bundles) map to Odoo product.product records with type='service' and a product.template containing the package description. Package line items map as BOM lines on the product.template if the Odoo Manufacturing or Quoting apps are installed. Otherwise, package details are stored in a product description field and the customer's admin reconstructs package templates in Odoo Studio. Discount templates map to sale.order.line discount fields on the product or quotation line.

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.

Dubsado logo

Dubsado gotchas

High

No native API export for workflows blocks automation migration

Medium

CSV export scope requires per-status pagination

Medium

Inbox email history lives outside Dubsado

Low

Free tier limited to 3 clients blocks full migration testing

Low

Premier-tier features gate proposal and scheduler data

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

  • Dubsado Projects have no direct Odoo CRM equivalent

    Dubsado's only sales container is the Project. Odoo separates sales pipeline management (crm.lead / Opportunity) from project delivery (project.project). Without a migration strategy, Projects can only land in Odoo as crm.lead records, losing the distinction between a pre-sale proposal and an active engagement. We resolve this during scoping by defining a split rule: Projects with active proposal or contract status become Odoo Opportunities, and Projects with delivery or completed status become project.project records. Customers who skip this design step end up with a flat pipeline of all projects as opportunities, or lose the historical delivery context by mapping everything to a project task list.

  • Dubsado Workflows are non-exportable and require full manual rebuild

    Dubsado Workflows cannot be exported via any native tool or documented API. Each Workflow consists of triggers, conditions, and chained actions stored in Dubsado's database in a non-extractable format. We flag this during scoping and provide a Workflow Audit Template that maps every trigger, condition, and action for manual rebuild in Odoo Studio or via Python custom modules. Customers should budget 1-3 days of admin time to document existing workflows before migration begins. Odoo Workflows are exported as Python code and XML data, making them portable for any future migration.

  • CSV export requires per-project-status pagination

    Dubsado's built-in CSV export operates on a single project status at a time. There is no 'export all' option. Each project status (Active, Completed, Archived, etc.) must be exported separately, and the export button only appears after selecting a status filter. We paginate through every project status, deduplicate across exports, and reconstruct the full project dataset. For accounts with more than five project statuses, this adds sequencing time. We document the full status list during discovery and confirm the export plan with the customer before beginning extraction.

  • Dubsado inbox email history is not in Dubsado's database

    Dubsado's email inbox connects via IMAP/SMTP relay. Sent and received messages are stored in the connected email account (Gmail, Outlook, etc.), not in Dubsado's own database. There is no Dubsado-native export of email threads. Customers must export email history directly from their email provider before migration. We document this gap in the migration checklist and recommend exporting email history before cutover. Odoo handles email integration natively via its mail.module with catchall domains and individual aliases per project.task or crm.lead, but Dubsado email history cannot be retroactively linked to migrated records.

  • Invoice and contract PDFs require separate document handling

    Dubsado Invoices and Contracts store PDFs and signature data rather than structured line-item and clause databases. We export invoice records as structured data (ID, amount, status, line items, payment records) via the account.move API, and we export contract PDFs as ir.attachment records. However, the PDF content itself is not parsed into Odoo field records. Customers who need invoice line item data visible in Odoo's Accounting reports must manually enter or reconcile historical invoice lines. Contract PDFs are preserved as attachments for reference but are not searchable as structured data in Odoo without a document management app.

Migration approach

Six steps for a successful Dubsado to Odoo CRM data migration

  1. Discovery and Odoo edition selection

    We audit the source Dubsado account across plan tier (Free/Starter/Premier), client count, project count and statuses, active workflows, invoice volume and status, contract count, custom field definitions, and user accounts. We pair this with an Odoo edition decision: Community (open-source, self-hosted or Odoo.sh) covers most migrations at lower cost; Odoo Online (SaaS) covers cloud-native deployments; Odoo Enterprise adds advanced reporting, on-premise hosting, and priority support. We confirm which Odoo modules are in scope (CRM alone, or CRM + Accounting, or CRM + Accounting + Project) based on the customer's use of Dubsado's invoicing and project delivery features. The discovery output is a written migration scope, a project-split strategy recommendation, and an Odoo module manifest.

  2. Schema design and custom field provisioning

    We design the destination schema in Odoo. This includes provisioning custom fields on res.partner, crm.lead, project.project, and account.move via XML data migration scripts executed before any record import. We configure pipeline stages (crm.stage) to match Dubsado project statuses, configure sale.order types to match Dubsado proposal statuses, and set up account.journal records for the Odoo Accounting module if invoicing is in scope. If the customer chooses the Community edition, schema deployment goes through Odoo Studio or direct XML module installation. If the customer uses Odoo Online or Enterprise, schema deployment goes through the Odoo Apps interface or a custom module upload.

  3. Staging migration and reconciliation

    We run a full migration into an Odoo staging environment (a copy of the production database) using production-like data volume. The customer reconciles record counts (Clients in, Contacts/Companies in, Projects mapped to Leads or Projects, Invoices in, Contracts attached), spot-checks 25-50 random records against the Dubsado source, and validates that pipeline stage mapping reflects the expected split rule. Any field mapping corrections, stage naming adjustments, or custom field type changes happen in staging, not in production. The customer signs off the staging results before production migration begins.

  4. User reconciliation and Odoo provisioning

    We extract every distinct Dubsado Team Member and map their role (Owner, Manager, Team Member) to an Odoo res.users record with the corresponding groups. Users without an Odoo login go to a reconciliation queue. The customer's admin provisions any missing Odoo users before production migration resumes. This step must complete before record import because res.partner records (Contacts/Companies) may be shared across users via record rules.

  5. Production migration in dependency order

    We run production migration in record-dependency order: res.partner records (Contacts and Companies with the company split applied), crm.lead records (Projects mapped to Leads and Opportunities with the split rule applied), project.project records (Projects mapped to delivery projects), account.move records (Invoices with line items and payment references), ir.attachment records (Contract PDFs and invoice PDFs linked to their parent records), project.task records (Tasks with parent project linkage), account.analytic.line records (Time Entries linked to tasks), mail.template records (Canned Email Templates), and res.users records (Portal users). Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC API with batch chunking and exponential backoff for all record imports.

  6. Cutover, validation, and Workflow rebuild handoff

    We freeze Dubsado writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the Workflow Audit Template documenting every Dubsado Workflow with its trigger, conditions, actions, and a recommended Odoo Studio or Python module equivalent. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Dubsado Workflows as Odoo automated actions inside the migration scope; that work is documented for the customer's admin or an Odoo implementation partner.

Platform deep dives

Context on both ends of the pair

Dubsado logo

Dubsado

Source

Strengths

  • Purpose-built for creative service businesses, not generic CRM adapted from enterprise software.
  • Embedded scheduling with client self-booking reduces administrative overhead significantly.
  • Integrated payment processing with Stripe eliminates third-party payment gateway complexity.
  • Branded client portals create a polished experience from first inquiry through project completion.
  • Supports multiple billing models: hourly, project-based, flat-rate, retainer, and VIP day pricing.

Weaknesses

  • No native public API documentation or developer ecosystem for automated migrations.
  • Workflow automations are locked to the platform and cannot be exported, requiring full manual rebuild on any alternative.
  • Limited reporting and analytics compared to dedicated business intelligence tools.
  • No built-in project budget tracking or resource management for teams running multiple concurrent projects.
  • User permissions model is basic — no granular role-based access controls or field-level permissions.
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. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

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

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    Dubsado: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Dubsado 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 Dubsado to Odoo CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most migrations land between three and five weeks for accounts under 5,000 Clients and 3,000 Projects with straightforward field mapping and no accounting module setup. Migrations with custom field retyping, invoice history requiring Odoo Accounting configuration, large contract document libraries, or teams larger than five users move to eight to twelve weeks because of Odoo module configuration, staging validation, and the workflow documentation work required before cutover.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Dubsado.
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