CRM migration
Field-level mapping, validation, and rollback between FotoNotes and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
FotoNotes
Source
Twenty CRM
Destination
Compatibility
12 of 12
objects map 1:1 between FotoNotes and Twenty CRM.
Complexity
BStandard
Timeline
24–72 hours
Overview
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.
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 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
Twenty CRM
Company
1:1FotoNotes 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
Twenty CRM
Opportunity
1:1Each 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
Twenty CRM
Custom Object (e.g., WorkOrder)
1:1If 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
Twenty CRM
People
1:1FotoNotes 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
Twenty CRM
People
1:1FotoNotes 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
Twenty CRM
Note + Link Field
1:1FotoNotes 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
Twenty CRM
Task
1:1FotoNotes 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
Twenty CRM
Custom Fields on Company
1:1FotoNotes 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
Twenty CRM
Custom Fields on Opportunity / WorkOrder
1:1Containee 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
Twenty CRM
Company.ParentId
1:1FotoNotes 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
Twenty CRM
WorkspaceMember / People.ownerId
1:1FotoNotes 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
Twenty CRM
Record Type + Custom Object
1:1FotoNotes 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.
| FotoNotes | Twenty CRM | Compatibility | |
|---|---|---|---|
| Container / Property | Company1:1 | Fully supported | |
| Containee / Work Order | Opportunity1:1 | Fully supported | |
| Containee Work Order Type | Custom Object (e.g., WorkOrder)1:1 | Fully supported | |
| Vendor / Field User | People1:1 | Fully supported | |
| Customer Portal User | People1:1 | Fully supported | |
| Photo / Attachment | Note + Link Field1:1 | Fully supported | |
| Work Order Comment / Activity Log | Task1:1 | Fully supported | |
| Container Display Lines / Custom Properties | Custom Fields on Company1:1 | Fully supported | |
| Containee Custom Properties | Custom Fields on Opportunity / WorkOrder1:1 | Fully supported | |
| Container Hierarchy / Parent-Child | Company.ParentId1:1 | Fully supported | |
| User Assignment / Owner | WorkspaceMember / People.ownerId1:1 | Fully supported | |
| Template Configuration / Work Order Types | Record Type + Custom Object1:1 | 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.
FotoNotes gotchas
Container-to-contained field inheritance is implicit
Batch PDF reports are the only bulk export mechanism
Vendor sub-accounts require hierarchical mapping
FotoNotes is now SiteCapture — documentation split
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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
FotoNotes
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across FotoNotes and Twenty CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
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
FotoNotes: Not publicly documented.
Data volume sensitivity
FotoNotes 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 FotoNotes to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave FotoNotes
Other ways to arrive at Twenty 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.