CRM migration

Migrate from FotoNotes to Odoo CRM

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

FotoNotes logo

FotoNotes

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between FotoNotes and Odoo CRM.

Complexity

BStandard

Timeline

24–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

FotoNotes structures its data around a Container/Containee model — projects holding work orders that group inspections, vendors, and customers — with a granular role system (Portal Admin, Manager, Field User, Customer, Vendor Admin, Vendor Field User) and heavy reliance on photo attachments as the primary record artifact. Odoo CRM models everything on crm.lead (leads and opportunities share the same table), res.partner for contacts and companies, and ir.attachment for files. There is no native inspection-work-order concept in Odoo CRM, so FlitStack AI translates FotoNotes containers into Odoo leads with a custom Property_Container__c field to preserve the parent-child relationship, and containees into child leads or opportunities linked by that field. FotoNotes role assignments (which are multi-permission sets per user) collapse into a single x_FotoNotes_Roles__c custom field on res.partner since Odoo grants access through user groups, not inline role lists. Photos stored in FotoNotes migrate as binary files re-uploaded to ir.attachment linked to the corresponding Odoo partner or lead record. Workflows, templates, and batch-report definitions have no Odoo equivalent — FlitStack exports FotoNotes template schemas as JSON for manual rebuild in Odoo Studio, and preserves batch report configurations as CSV exports for reimport. The migration uses FotoNotes' REST API for record export and Odoo's XML-RPC API for bulk upsert, with a 24–48h delta-pickup window capturing any records modified during cutover.

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

FotoNotes logo

FotoNotes

What's pushing teams away

  • Status updates on work orders sometimes fail to sync across the web portal and mobile app, causing field supervisors to lose visibility on which properties have been completed.
  • The platform rebranded from FotoNotes to SiteCapture in 2022, and the two product names cause confusion during vendor evaluation and support escalation — existing customers on the legacy FotoNotes branding struggle to locate updated documentation and pricing pages.
  • Batch report generation is an admin-only feature, so front-line field managers who need on-demand PDF summaries must request exports from a portal admin rather than generating them independently.
  • Custom fields created via templates are per-account and not easily documented — when migrating off platform, the complete field schema requires manual enumeration from within the portal admin settings.

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

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

FotoNotes

Container (Project)

maps to

Odoo CRM

crm.lead

1:1
Fully supported

FotoNotes containers (projects) map to Odoo crm.lead records. A custom x_Property_Container__c char field preserves the original FotoNotes container name so the parent-child relationship is queryable within Odoo. Container status maps to crm.stage by matching FotoNotes status labels to Odoo stage names.

FotoNotes

Containee (Work Order)

maps to

Odoo CRM

crm.lead

1:1
Fully supported

FotoNotes work orders map to Odoo crm.lead records. The parent container ID is stored in x_Parent_Container_ID__c to reconstruct the project hierarchy in Odoo. Work order type (e.g., inspection, maintenance) maps to a custom x_Work_Order_Type__c pick-list on the lead record. The due_date from the work order populates date_deadline, and assigned user emails are resolved to Odoo res.users login identifiers to set user_id.

FotoNotes

Property

maps to

Odoo CRM

res.partner

1:1
Fully supported

FotoNotes property records map directly to Odoo res.partner records. Property name becomes partner name, street/address fields map field-for-field, and a custom x_FotoNotes_Property_ID__c field stores the source FotoNotes ID for delta-run de-duplication. City, state_id, zip, and country_id are transferred to Odoo partner columns, while phone and email are stored in the partner phone and email fields. The ID field also enables the migration process to skip duplicate properties on subsequent runs.

FotoNotes

Vendor Contact

maps to

Odoo CRM

res.partner

1:1
Fully supported

FotoNotes vendor contacts (Vendor Admin and Vendor Field User roles) map to res.partner records with vendor=True set. The full FotoNotes role label is stored in x_FotoNotes_Roles__c so the migration plan can specify which Odoo user groups each role maps to on the Odoo side.

FotoNotes

Customer Contact

maps to

Odoo CRM

res.partner

1:1
Fully supported

FotoNotes customer-role contacts map to Odoo res.partner with customer=True. Customer-specific fields such as the can_view_reports flag are migrated as custom boolean fields on the partner record, preserving the original FotoNotes permission. The FotoNotes customer flag is stored in x_Is_FotoNotes_Customer__c to identify the contact source. Email, phone, and street address are transferred to the partner’s fields, and any role labels are recorded in x_FotoNotes_Roles__c for Odoo access-group assignment.

FotoNotes

Template

maps to

Odoo CRM

Custom field schema (JSON export)

1:1
Fully supported

FotoNotes inspection templates have no Odoo CRM equivalent — they define required fields, approval chains, and form structure. FlitStack exports each template's field definitions as a JSON schema file and delivers it alongside the migration so your Odoo admin can recreate field sets in Studio.

FotoNotes

Batch Report

maps to

Odoo CRM

CSV export (reference file)

1:1
Fully supported

FotoNotes batch reports (multi-project PDF exports) have no Odoo equivalent. We export the batch report configuration as CSV with record IDs and timestamps so your team can rebuild scheduled reporting in Odoo using its built-in report designer or a BI connector.

FotoNotes

Photo / File Attachment

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

FotoNotes inspection photos and flagged images migrate to Odoo ir.attachment linked to the corresponding crm.lead (work order) or res.partner record. Each file is downloaded from FotoNotes storage, Base64-encoded, and POSTed to Odoo's /web/binary/attachment/file endpoint. Files over 25MB are split before upload.

FotoNotes

User (Internal)

maps to

Odoo CRM

res.users

1:1
Fully supported

FotoNotes internal users (Portal Admin, Manager, User, Field User) are matched to Odoo res.users by email address. Unmatched users are flagged before migration so your Odoo admin can create accounts first. FotoNotes role names are noted in the migration plan for Odoo access-group assignment.

FotoNotes

Activity Log (Status History)

maps to

Odoo CRM

mail.message

1:1
Fully supported

FotoNotes records status-change timestamps in its activity log. These translate to Odoo mail.message records on the crm.lead, preserving the original timestamp, the user who made the change, and the old/new status values. Body text is formatted as a readable activity note.

FotoNotes

Service / Type Definition

maps to

Odoo CRM

Custom field on crm.lead

1:1
Fully supported

FotoNotes services and work-order types have no direct Odoo equivalent. We create a custom pick-list field x_Work_Service_Type__c on crm.lead and map each FotoNotes service name to a corresponding pick-list value, preserving the drop-down semantics your team uses to categorize work.

FotoNotes

Comments / Notes on Work Orders

maps to

Odoo CRM

mail.message

1:1
Fully supported

FotoNotes work order comments migrate as Odoo mail.message records with message_type='comment', attached to the corresponding crm.lead. The timestamp of each comment is stored in the mail.message date field to preserve order. Author is resolved by email match to res.users; if unmatched, the author name is stored in the body as plain text. After migration, comments appear in the lead’s chatter and can be viewed in the Odoo UI alongside history.

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.

FotoNotes logo

FotoNotes gotchas

High

Container-to-contained field inheritance is implicit

Medium

Batch PDF reports are the only bulk export mechanism

Medium

Vendor sub-accounts require hierarchical mapping

Low

FotoNotes is now SiteCapture — documentation split

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

  • Container/Containee hierarchy has no native Odoo equivalent and must be reconstructed with custom fields

    FotoNotes structures all work as a Container (project) containing Containee records (work orders) with their own status, assignees, and attachments. Odoo CRM has no native parent-child inspection record — crm.lead is a flat table. FlitStack AI creates a custom x_Parent_Container_ID__c char field on crm.lead to store the FotoNotes parent container ID and a custom x_Work_Order_Type__c pick-list for the work order type, preserving the full hierarchy as queryable Odoo records. Without this custom field strategy, every work order lands as an orphan lead with no way to reconstruct the project relationship in Odoo's standard pipeline view.

  • FotoNotes role system does not translate directly to Odoo access groups — manual post-migration mapping required

    FotoNotes defines eight discrete roles (Portal Admin, Manager, User, Field User, Customer, Vendor Admin, Vendor Field User, Vendor) with fine-grained field-level and template-level permissions per role. Odoo controls access through Groups assigned to res.users and record rules on a per-model basis — there is no inline role field on res.partner or crm.lead. FlitStack AI stores the full FotoNotes role label in x_FotoNotes_Roles__c on both res.users and res.partner, and delivers a Role-Mapping Plan CSV that lists each FotoNotes role alongside the recommended Odoo group assignment (e.g., Vendor Admin → 'Partner Manager' group). Your Odoo admin must apply these group assignments manually after migration because Odoo's group model requires an authenticated user session to modify.

  • FotoNotes photo attachments require binary re-upload through Odoo's file endpoint, not direct database insert

    FotoNotes stores inspection photos in its own cloud file storage and exposes them via URL or binary download. Odoo stores files in ir.attachment with a datas Base64-encoded field and requires POSTing to /web/binary/attachment/file or using the model API's write() with the datas field. Direct PostgreSQL INSERT into ir.attachment bypasses Odoo's access-rights checks and creates orphaned records. FlitStack AI downloads each FotoNotes photo, Base64-encodes it, and writes it through Odoo's XML-RPC model API, which sets res_model, res_id, name, datas, and create_uid correctly. Files exceeding Odoo's 25MB limit per ir.attachment are split before upload to avoid API errors.

  • FotoNotes template field definitions and approval chains have no Odoo CRM equivalent and must be rebuilt

    FotoNotes templates define the schema of each work order type — required fields, field order, approval routing, and conditional display rules are all template-bound. Odoo CRM has no template concept for crm.lead form structure; field visibility is controlled by Odoo Studio view customizations and access groups. FlitStack AI exports every FotoNotes template definition as a JSON schema file (field names, types, required flag, pick-list values) and delivers it alongside the migration output. Your Odoo admin uses this JSON as a rebuild reference for Odoo Studio field creation and view ordering on the crm.lead form.

  • Odoo XML-RPC API rate limits on batch operations require staggered import cycles

    Odoo's XML-RPC API does not enforce a hard per-second rate limit on standard database users, but Odoo.sh and self-hosted Odoo instances can trigger PostgreSQL lock timeouts under sustained concurrent writes from a single session. FotoNotes setups with more than 10,000 work order records require FlitStack AI to batch writes into cycles of 500 records per transaction with a 2-second pause between batches to avoid Odoo worker exhaustion errors. This staging extends the migration timeline but prevents the 'Premature end of data' XML parse errors that occur when Odoo's RPC thread pool is saturated.

Migration approach

Six steps for a successful FotoNotes to Odoo CRM data migration

  1. Export FotoNotes data via REST API and enumerate container/containee hierarchy

    FlitStack AI authenticates to FotoNotes using your API credentials (OAuth or API key), exports all Container records, all Containee records with their parent links, all res.partner records (vendors, customers, and internal users), all ir.attachment metadata, all activity log entries, and all template schemas as JSON. The export produces a manifest CSV listing record count per object, average attachment size, and container depth so we can estimate Odoo XML-RPC batch count and flag any FotoNotes accounts with over 1,000 containers early.

  2. Design Odoo custom field schema and stage mapping plan

    Based on the FotoNotes export, FlitStack AI creates a schema setup plan: custom fields x_Property_Container__c, x_Parent_Container_ID__c, x_Work_Order_Type__c, x_FotoNotes_Roles__c, x_FotoNotes_Property_ID__c, x_Original_Create_Date__c, x_Work_Service_Type__c, and x_Is_FotoNotes_Customer__c are defined on crm.lead and res.partner. A FotoNotes-status-to-Odoo-stage value map is built per crm.team. A role-mapping plan CSV lists each FotoNotes role and the target Odoo access group. Your Odoo admin creates these fields in Odoo Studio before migration data arrives.

  3. Resolve FotoNotes users and contacts to Odoo res.users and res.partner records

    FlitStack AI matches FotoNotes user emails to Odoo res.users login field — matched users get their FotoNotes role stored in x_FotoNotes_Role__c for group assignment. Unmatched users are listed in an unresolved-owners report. All FotoNotes vendor and customer contacts are matched by email to existing Odoo res.partner records; duplicates are flagged for your team to decide whether to merge or keep separate. This step ensures every containee and attachment has a valid res_id before the Odoo write cycle begins.

  4. Migrate partners, containers, and containees in dependency order with XML-RPC batch cycles

    FlitStack AI writes FotoNotes vendor and customer contacts to res.partner first (required for foreign-key integrity). Containers are written as crm.lead records with x_Property_Container__c set and stage_id mapped from FotoNotes status. Containees are written as child crm.lead records linked to their parent via x_Parent_Container_ID__c. Each batch of 500 records is followed by a 2-second pause to prevent Odoo worker saturation. Activity log entries are written as mail.message records after their parent crm.lead records exist. A migration audit log records every XML-RPC call's record ID, timestamp, and status.

  5. Re-upload FotoNotes photo attachments to ir.attachment via Odoo binary API

    After crm.lead and res.partner records are committed, FlitStack AI downloads each FotoNotes photo from its source URL or binary endpoint, Base64-encodes it, and POSTs it to Odoo's /web/binary/attachment/file endpoint with res_model=crm.lead (or res.partner), res_id pointing to the migrated record, and the original file name preserved. Files over 25MB are split. Attachment names, create dates, and owner IDs are set from FotoNotes metadata. A final attachment count diff is generated against the FotoNotes export manifest to confirm zero missing files.

  6. Run delta pickup, validate record counts and field values, deliver rollback package

    FlitStack AI runs a delta pickup window (24–48 hours) to capture FotoNotes records created or modified after the initial export snapshot. Delta records are written in a second migration pass using the same batch-cycle approach. A field-level validation report compares source vs destination counts per object, null-rate per custom field, and attachment completeness. If reconciliation fails, FlitStack AI delivers a one-click rollback that purges all migrated crm.lead, res.partner, and ir.attachment records created by the migration run, leaving your Odoo instance in its pre-migration state.

Platform deep dives

Context on both ends of the pair

FotoNotes logo

FotoNotes

Source

Strengths

  • Photo-first inspection workflow with mobile app capture and cloud sync across devices
  • Container/containee data model reduces duplicate property data across large portfolios
  • Supports seven distinct user roles including vendor admin and customer read-only access
  • Batch PDF report exports allow portfolio-level review across multiple properties at once
  • Field user mobile app works offline and syncs when connectivity is restored

Weaknesses

  • The FotoNotes-to-SiteCapture rebranding splits web presence and creates documentation gaps for legacy customers
  • Granular role-based permissions require careful mapping during migration — vendor admin and customer roles do not map directly to standard CRM roles
  • Custom work type templates vary by account, making schema extraction non-trivial without direct portal admin access
  • Status synchronization issues between web and mobile are an ongoing pain point reported in user reviews
  • No publicly documented public API means programmatic data export relies on the admin batch report feature rather than a REST endpoint
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 FotoNotes and Odoo CRM.

B

Overall complexity

Standard migration

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

  • Object compatibility

    A

    All 8 core objects map 1:1 between FotoNotes 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

    FotoNotes: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Most FotoNotes-to-Odoo CRM migrations complete in 24–72 hours for under 25,000 FotoNotes records. Setup of Odoo custom fields and role-mapping planning takes 1–2 days before data movement starts. Large FotoNotes deployments with 100,000+ containee records and high photo volume extend to 5–10 days, primarily because each photo requires a separate binary upload round-trip to Odoo's ir.attachment endpoint and FotoNotes container hierarchies must be reconstructed with custom fields before migration runs.

Adjacent paths

Related migrations to explore

Ready when you are

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