CRM migration

Migrate from FotoNotes to Twenty CRM

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

FotoNotes logo

FotoNotes

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between FotoNotes and Twenty CRM.

Complexity

BStandard

Timeline

24–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

FotoNotes is a field-operations SaaS built around Container/Containee hierarchies — a property record (Container) that holds multiple work order types (Containee) with photos, comments, and vendor assignments. It is not a traditional CRM; FotoNotes contacts are vendor and field-user records tied to a property graph rather than a lead-opportunity model. Twenty CRM is an open-source Salesforce alternative with standard objects for People, Companies, Opportunities, Notes, and Tasks, plus unlimited custom objects on the Pro plan ($9/user/month). Migrating FotoNotes to Twenty means translating a nested container-work order structure into Twenty's flat object model: Containers become either Companies or custom-object records; Containee work orders become Opportunities or custom-object records linked by a companyId foreign key; FotoNotes user and vendor role assignments map to Twenty Workspace Members; and photo references stored as URLs or file paths are preserved as link fields on the migrated records. FlitStack sequences the migration by exporting FotoNotes batch reports and API data as CSV, resolving the container-work order parent-child relationship in a load-order that respects Twenty's foreign-key constraints, and inserting a 24-hour delta-pickup window before finalizing the cutover. Workflows, batch PDF exports, portal permission tiers (Portal Admin, Manager, Field User, Customer, Vendor), and email notification templates do not migrate — those must be rebuilt in Twenty's workflow builder or configured manually post-import. All custom fields on Container and Containee objects migrate as custom fields on the corresponding Twenty objects. FlitStack delivers a field-level diff against a sample slice before the full run commits.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How FotoNotes objects map to Twenty CRM

Each row shows how a FotoNotes object lands in Twenty 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 / Property

maps to

Twenty CRM

Company

1:1
Fully supported

FotoNotes Container records (property or project names with addresses, status, and display lines) map directly to Twenty Company records. The Company.displayName field holds the Container name; address fields map to company address fields in Twenty. If the FotoNotes Container represents a parent property in a hierarchy, the Parent Company link becomes the Twenty ParentId reference.

FotoNotes

Containee / Work Order

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Each Containee work order record maps to a Twenty Opportunity linked to the parent Container's Company record via companyId. The Opportunity.name field holds the work order title; work order status maps to Opportunity.stage as a select field with FotoNotes' original status values as options. If FotoNotes has multiple work order types (e.g., Inspection, Maintenance, Repair), each type maps to a separate Opportunity record type in Twenty.

FotoNotes

Containee Work Order Type

maps to

Twenty CRM

Custom Object (e.g., WorkOrder)

1:1
Fully supported

If FotoNotes runs multiple Containee templates (Inspection, Maintenance, Vendor Work) with distinct custom fields per type, those cannot all share the same Twenty Opportunity schema cleanly. FlitStack creates a WorkOrder custom object in Twenty and maps each Containee type to it, preserving the template-type field as a select (WorkOrderType__c). This avoids flattening heterogeneous custom fields onto a single Opportunity object.

FotoNotes

Vendor / Field User

maps to

Twenty CRM

People

1:1
Fully supported

FotoNotes vendor users and field users map to Twenty People records. The person's name, email, phone, and role assignment (Vendor Admin, Vendor Field User) become fields on the People record. The role assignment is stored as a custom select field (FotoNotesRole__c) for audit trail. Vendor companies themselves map to separate Company records if the vendor is an organization; individual vendor users map to People linked to that Company.

FotoNotes

Customer Portal User

maps to

Twenty CRM

People

1:1
Fully supported

FotoNotes Customer role users (property owners or clients who can view projects via portal) map to Twenty People records with a custom flag (IsCustomerPortal__c). Their access to view shared projects is not a native Twenty construct — FlitStack preserves the customer relationship as a note on the associated Company record and recommends rebuilding read-access via Twenty's row-level permissions on the Organization plan post-migration.

FotoNotes

Photo / Attachment

maps to

Twenty CRM

Note + Link Field

1:1
Fully supported

FotoNotes stores photo references as CDN URLs attached to Containee work orders. These migrate to Twenty as Note records linked to the corresponding Opportunity (or WorkOrder custom object), with the original CDN URL preserved in the Note body or a custom URL field (PhotoURL__c). For inline images, FlitStack downloads and re-uploads to Twenty's file storage and updates the reference. Batch PDF reports (FotoNotes Batch Reports feature) are not migratable and are documented as a rebuild target.

FotoNotes

Work Order Comment / Activity Log

maps to

Twenty CRM

Task

1:1
Fully supported

FotoNotes activity log entries on Containee work orders — status changes, flag events, comment threads — map to Twenty Task records linked to the corresponding Opportunity. The Task.title field holds a summary of the activity; Task.body or the description field holds the comment text with original timestamp and user attribution preserved. This gives teams the full work-order activity timeline in Twenty's record history.

FotoNotes

Container Display Lines / Custom Properties

maps to

Twenty CRM

Custom Fields on Company

1:1
Fully supported

FotoNotes Container records support display lines (custom fields per template) that hold property-specific data — for example, property type, inspection frequency, or billing code. These migrate as custom fields on the Twenty Company object. FlitStack creates each custom field in Settings → Data Model before the import run and maps the field values during the CSV load. Field type mapping follows FotoNotes' field-type definitions (text, number, date, select).

FotoNotes

Containee Custom Properties

maps to

Twenty CRM

Custom Fields on Opportunity / WorkOrder

1:1
Fully supported

Containee work order records carry custom fields specific to each work order template — inspection findings, priority level, scheduled date, assigned vendor. These migrate as custom fields on the Twenty Opportunity (or WorkOrder custom object) based on the Containee template type. FlitStack creates the fields in Twenty before import and applies value-level mapping for select/multi-select fields using FotoNotes' original pick-list values as options.

FotoNotes

Container Hierarchy / Parent-Child

maps to

Twenty CRM

Company.ParentId

1:1
Fully supported

FotoNotes supports nested Container hierarchies (parent properties with child sub-properties or project phases). Twenty Company's ParentId field holds the parent Company reference. FlitStack resolves the hierarchy during export: the parent Container must migrate as a Company first so its ID is available as a foreign key when child Containers are loaded. Circular or orphan references are flagged before migration runs.

FotoNotes

User Assignment / Owner

maps to

Twenty CRM

WorkspaceMember / People.ownerId

1:1
Fully supported

FotoNotes assigns users to Containers and Work Orders by user ID (Manager, Field User, assigned vendor). Twenty resolves ownership via WorkspaceMember records matched by email. FlitStack performs an email match against Twenty's member list before migration: matched users get their records assigned directly; unmatched users are flagged for the admin to invite to Twenty first, with a fallback assignee configured before the full run.

FotoNotes

Template Configuration / Work Order Types

maps to

Twenty CRM

Record Type + Custom Object

1:1
Fully supported

FotoNotes Container and Containee templates define which fields appear per work order type — this is a schema-level configuration with no export path. FlitStack documents the full template schema (field names, types, required flags) as a setup guide for Twenty administrators, including which fields map to Twenty's standard objects versus custom fields. This documentation is delivered alongside the migration runbook.

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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Container-Containee hierarchy has no native equivalent in Twenty's flat object model

    FotoNotes' Container/Containee structure is a parent-child hierarchy unique to the platform — a Container (property) holds multiple Containee work orders, each with its own status, assigned vendor, and photos. Twenty CRM has no container object; the parent-child relationship must be modeled using Company.ParentId for Container-level nesting and Opportunity.companyId (or a custom WorkOrder object with companyId) for the Containee-to-Container link. Migrating a FotoNotes setup with 4+ levels of Container nesting or multiple Containee types per Container requires creating a custom WorkOrder object in Twenty and resolving all foreign keys in the correct load order (Companies first, then People, then Opportunities or WorkOrder records). FlitStack delivers a load-order plan and flags any circular or orphan Container references before data moves.

  • FotoNotes vendor-role user model does not translate to Twenty's WorkspaceMember structure

    FotoNotes distinguishes between Portal Admin, Manager, User, Field User, Customer, Vendor Admin, and Vendor Field User — a multi-role permission model specific to field-service operations. Twenty CRM has standard workspace members (view, edit, delete permissions set at the object level on Pro/Organization plans) with no native equivalent to the Vendor Admin / Vendor Field User split. FlitStack maps FotoNotes vendor role assignments to a custom select field (FotoNotesRole__c) on the People record and recommends rebuilding the permission intent using Twenty's role and row-level permission system post-migration. The actual permission enforcement must be configured manually in Twenty's Settings → Roles.

  • Batch PDF reports and email notification templates do not export from FotoNotes

    FotoNotes' Batch Reports feature generates multi-project PDF exports on demand, and email notification templates are configured per Container or Containee template. Neither of these constructs has an export path in FotoNotes' API or batch export tool. Twenty CRM has a workflow builder (Pro/Organization) that can replicate notification logic, but workflow definitions do not migrate automatically. FlitStack preserves the existence and configuration intent of FotoNotes' batch reports and email templates in a migration audit document that lists each configured report and template with its trigger conditions, so the Twenty admin can rebuild them in Twenty's workflow builder from a reference spec rather than starting from scratch.

  • FotoNotes photo attachments are CDN URL references, not embedded files

    FotoNotes stores photos as CDN-hosted image URLs attached to Containee work orders. When migrating to Twenty CRM, these URL references are preserved as Note body text or a custom PhotoURL__c field on the linked Opportunity. However, FotoNotes does not expose a bulk file export API for photo downloads — FlitStack retrieves accessible CDN URLs and re-uploads inline images to Twenty's file storage, but FotoNotes setups with restricted CDN access or expire-on-export links require manual photo re-attachment post-migration. The migration plan documents every photo URL and links it to the migrated Opportunity so nothing is lost, even if re-attachment requires a manual step.

  • Twenty Pro plan limits API calls to 50/minute; self-hosted has no rate limit

    Twenty CRM Pro tier enforces 50 API calls per minute per workspace; the Organization tier raises this to 100 calls/minute. For FotoNotes migrations exceeding 10,000 Container and Containee records, FlitStack uses Twenty's bulk CSV import endpoint (which bypasses per-record API rate limits) for the primary data load and reserves the REST/GraphQL API for validation queries and delta-pickup updates. If the migration uses the REST/GraphQL API for all writes on Pro tier, FlitStack implements exponential backoff and throttles to 45 calls/minute to stay within the limit. Self-hosted Twenty instances have no enforced rate limit, making them significantly faster for large migrations.

Migration approach

Six steps for a successful FotoNotes to Twenty CRM data migration

  1. Audit FotoNotes Container/Containee schema and export data

    FlitStack connects to FotoNotes via batch export and API to pull every Container, Containee work order, vendor user, photo reference, and activity log entry. We document the full schema: every Container template, its custom display lines, each Containee work order type and its custom fields, the Container hierarchy depth, and the total photo attachment count. This audit identifies orphaned containers, duplicate records, and fields with no Twenty equivalent before a single record moves. We deliver a migration scope document with record counts per object and a list of FotoNotes-specific constructs (batch reports, portal roles, email templates) that must be rebuilt post-migration.

  2. Prepare Twenty workspace: custom objects, fields, and member invitations

    Before data lands, FlitStack creates all required custom fields and any custom objects (e.g., WorkOrder) in Twenty via Settings → Data Model, matching the FotoNotes Containee template schema field-for-field. We also create the FotoNotesRole__c and PhotoURL__c custom fields on the People and Opportunity objects. Your team invites all FotoNotes vendor users and field users to Twenty via Settings → Members — those Workspace Members must exist before the migration run so FlitStack can resolve owner assignments by email match. We provide a step-by-step Twenty setup checklist derived from the FotoNotes audit.

  3. Run a sample migration slice with field-level diff

    FlitStack migrates a representative slice — typically 200–500 records spanning 3–5 Containers, their Containee work orders, associated vendor users, and activity logs — as a test run before committing the full dataset. We generate a field-level diff comparing source values to migrated values in Twenty, surface any mismatches in Container-Containee parent-child linking, and verify that vendor role assignments resolved correctly against Twenty's member list. You review the diff in a shared validation report; no full migration runs until you sign off.

  4. Execute full migration with load-order sequencing and delta pickup

    The full migration runs in the correct dependency order: Companies first (for Container records), then People (for vendor and field users), then Opportunities and WorkOrder custom-object records (for Containee work orders) with companyId and assignedVendorId foreign keys resolved. Photos and activity logs load after their parent records. A 24-hour delta-pickup window runs concurrently: any FotoNotes records modified during the cutover are captured and applied to Twenty within that window. FlitStack logs every operation to an audit trail and runs a post-migration reconciliation count against the FotoNotes source export.

  5. Post-migration verification and rebuild reference handoff

    FlitStack delivers a post-migration verification report comparing record counts and field-value samples between FotoNotes and Twenty for every object. We surface any records that failed to migrate with error codes and remediation steps. Alongside the data migration, we hand off a rebuild reference document: a structured list of every FotoNotes batch report, email notification template, and portal permission configuration, mapped to its intended function in Twenty's workflow builder or role settings. Your Twenty admin uses this document to recreate the FotoNotes operational logic in Twenty without guessing which templates existed.

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
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 FotoNotes and Twenty 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

    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 Twenty 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 Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most FotoNotes to Twenty CRM migrations complete in 24–72 hours of clock time for setups under 10,000 Container and Containee records. The longest planning step is resolving the Container-Containee hierarchy into Twenty's flat Company + Opportunity schema and creating the corresponding custom fields in Twenty before data loads. FotoNotes setups with 5+ Containee work order templates, nested Container hierarchies, or over 20,000 total records extend to 5–10 days; FlitStack sequences the load in dependency order (Companies → People → Opportunities) which takes longer than a direct object-to-object map but prevents orphaned foreign keys.

Adjacent paths

Related migrations to explore

Ready when you are

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