CRM migration
Field-level mapping, validation, and rollback between Atomic CRM and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Atomic CRM
Source
Salesforce Sales Cloud
Destination
Compatibility
7 of 13
objects map 1:1 between Atomic CRM and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Atomic CRM to Salesforce is a migration from a developer-maintained Postgres template to an enterprise SaaS platform with a typed schema, per-user licensing, and a structured Bulk API. Because Atomic CRM has no hosted SaaS layer, every migration starts at the Supabase Postgres database — we read the actual column set rather than relying on application documentation to capture all custom fields added through Supabase Studio. Deal categories and Task types are not stored in the database; they are passed as TypeScript props to the CRM root component in App.tsx. We ask customers to share that file during scoping so we can replicate the enum values in Salesforce Picklist fields. We migrate Notes using a polymorphic relationship query to resolve parent references, and we use the Salesforce Bulk API 2.0 with chunking and exponential backoff for all standard object writes. Workflows, automations, and any custom business logic encoded in Atomic CRM's TypeScript source do not migrate; we deliver a written inventory of these for the customer's admin to rebuild in Salesforce Flow.
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 Atomic CRM object lands in Salesforce Sales Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Atomic CRM
Contact
Salesforce Sales Cloud
Contact
1:1Atomic CRM Contact records (name, email, phone, company association, custom fields) map to Salesforce Contact. The Supabase UUID primary key is held as a reference string in a custom field atomic_crm_id__c on the destination Contact for audit traceability. We query Contacts first during migration to resolve the AccountId lookup before any dependent import begins.
Atomic CRM
Company
Salesforce Sales Cloud
Account
1:1Atomic CRM Company records map to Salesforce Account. The company domain becomes the Account Website field and serves as the dedupe key during import. We create Account records before Contact import so the AccountId foreign key is satisfied at the moment of Contact insert. Any custom columns discovered on the Supabase companies table migrate as Account custom fields.
Atomic CRM
Deal
Salesforce Sales Cloud
Opportunity
1:1Atomic CRM Deal records map to Salesforce Opportunity. The Deal value, stage category (eCommerce, SaaS, Consulting, etc.), and custom fields migrate directly. The App.tsx Deal category prop values become Salesforce Opportunity StageName picklist entries that we pre-configure in Setup before migration. Closed-Won and Closed-Lost dates migrate to CloseDate and a custom Loss_Reason__c field.
Atomic CRM
Deal Stage
Salesforce Sales Cloud
Opportunity Stage
lossyEach distinct Deal category value found in App.tsx becomes a Salesforce Opportunity StageName picklist value. We configure stage probabilities based on the original Atomic CRM deal stage distribution. If the customer has modified the stage enum in App.tsx post-deployment, we capture those values during scoping and replicate them as picklist entries rather than allowing Salesforce's default stage set to overwrite the existing data model.
Atomic CRM
Note
Salesforce Sales Cloud
Note / ContentDocumentLink
1:manyAtomic CRM Notes use a polymorphic Supabase relationship (referencing either Contact or Deal as parent). We resolve the polymorphic foreign key by querying the actual Supabase table structure, identify the parent type per note, and map Notes linked to Contacts to Salesforce Note with a Contact WhoId; Notes linked to Deals map to ContentDocumentLink on the Opportunity. The note body migrates as rich text. This polymorphic resolution step is unique to Atomic CRM and requires a schema-level inspection before any note records are written.
Atomic CRM
Task
Salesforce Sales Cloud
Task
1:1Atomic CRM Tasks map to Salesforce Task. The Task type classification (Call, Email, Meeting, and any custom types from App.tsx) migrates as TaskType or TaskSubtype. Status, Priority, ActivityDate, and assignee (via Supabase Auth UUID-to-Salesforce User email lookup) transfer directly. Tasks are imported after Owner reconciliation so that OwnerId references are valid at insert time.
Atomic CRM
Custom Fields (table columns)
Salesforce Sales Cloud
Custom Fields
lossyCustom fields in Atomic CRM are Postgres columns added via Supabase Studio — not UI-configured properties. During scoping we run a pg_catalog column query against every table to capture every column, type, nullable status, and default value. We then map each to an equivalent Salesforce custom field (custom__c API name) with the matching field type (text, number, date, checkbox, picklist). Custom field audit happens before schema design, not after, to prevent silent data loss.
Atomic CRM
User / Owner
Salesforce Sales Cloud
User
1:1Atomic CRM User records are Supabase Auth users. We resolve owners by email match against the Salesforce destination org's User table. Owner assignment on Deals and Tasks references Supabase Auth UUIDs, which have no meaning in Salesforce. We map by email so that the correct Salesforce User record is assigned to each migrated Opportunity and Task. Owners without a matching Salesforce User are held in a reconciliation queue for the customer's admin to provision before record import resumes.
Atomic CRM
Tag (custom multi-checkbox property)
Salesforce Sales Cloud
Multi-Select Picklist
lossyIf the Atomic CRM instance uses tag-style multi-checkbox properties on Contacts or Deals, these map to Salesforce multi-select picklist fields on the Contact or Opportunity object. We capture the distinct tag values from the Supabase column values at migration time and pre-populate the picklist entries before import. Tags with more than 150 distinct values are evaluated for conversion to Salesforce Topics instead.
Atomic CRM
Attachment (Supabase Storage)
Salesforce Sales Cloud
ContentDocument / ContentVersion
1:1Atomic CRM stores attachment metadata in Supabase but the actual binary files live in Supabase Storage buckets. We check whether file attachments are present during scoping. If they are, we export the bucket contents (images, PDFs, documents) and map them to Salesforce ContentVersion records, linked to the parent Contact or Opportunity via ContentDocumentLink. Files stored outside Supabase (e.g. on a custom S3 bucket) require separate coordination outside the standard migration scope.
Atomic CRM
Supabase RLS Policy
Salesforce Sales Cloud
Field-Level Security
lossySupabase Row Level Security policies on the source tables can block bulk reads during extraction. We audit RLS policies during scoping and request that the customer grants the migration service account SELECT permission on all tables before extraction begins. Without this step, bulk SELECT queries return empty result sets for some record subsets.
Atomic CRM
App.tsx Configuration
Salesforce Sales Cloud
Picklist Values / Field Defaults
lossyDeal category enums and Task type enums are passed as TypeScript props to the CRM root component in App.tsx, not stored in the database. We ask customers to share their App.tsx (or equivalent configuration file) during discovery so we capture every enum value used in the instance. These values become Salesforce picklist entries on Opportunity.Stage and Task.Type. Without this file, we cannot enumerate the full set of stage and task type values and some records will land with empty or mismatched picklist fields.
Atomic CRM
Custom Postgres Tables
Salesforce Sales Cloud
Custom Objects
1:1If the customer added custom tables beyond the five core entities (Contacts, Companies, Deals, Notes, Tasks), those map to Salesforce custom objects with __c API names. We pre-create the destination schema via the Salesforce Metadata API including custom fields, lookup relationships, and validation rules before importing any data. Custom tables with foreign key dependencies on core tables are imported after the core migration phase to satisfy the lookup constraints.
| Atomic CRM | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Deal Stage | Opportunity Stagelossy | Fully supported | |
| Note | Note / ContentDocumentLink1:many | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Custom Fields (table columns) | Custom Fieldslossy | Fully supported | |
| User / Owner | User1:1 | Fully supported | |
| Tag (custom multi-checkbox property) | Multi-Select Picklistlossy | Fully supported | |
| Attachment (Supabase Storage) | ContentDocument / ContentVersion1:1 | Fully supported | |
| Supabase RLS Policy | Field-Level Securitylossy | Fully supported | |
| App.tsx Configuration | Picklist Values / Field Defaultslossy | Fully supported | |
| Custom Postgres Tables | Custom Objects1:1 | Mapping required |
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.
Atomic CRM gotchas
No hosted SaaS version — migration target is a Postgres database
Custom fields are schema changes, not UI-configured properties
CRM component props define business logic that lives in code, not data
No native file attachment export — storage backend varies by deployment
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
Pair-specific challenges
Migration approach
Discovery and Postgres schema audit
We request Supabase project credentials and run a pg_catalog column query against every table (contacts, companies, deals, tasks, notes, and any custom tables) to capture the complete column set. We ask for the App.tsx (or equivalent) configuration file to capture Deal category and Task type enum values that live as TypeScript props. We check for RLS policies, Supabase Storage bucket configuration, and any custom tables beyond the five core entities. The discovery output is a written migration scope including the full column-to-field mapping, enum value list, and storage attachment inventory.
App.tsx enum capture and Salesforce picklist pre-configuration
We extract every Deal category value and Task type value from the shared App.tsx configuration. We pre-configure Salesforce Opportunity StageName picklist values and Task.TaskType values in the destination org via Setup before any data import begins, so that incoming records do not fail picklist validation on import.
Sandbox migration and reconciliation
We run a full migration into a Salesforce Sandbox (Full Copy or Developer Pro) using production-equivalent data volume. The customer reconciles record counts across all objects, spot-checks 25-50 random records against the Supabase source, and reviews custom field coverage. Schema corrections, picklist value additions, and mapping adjustments happen in Sandbox before production migration begins.
Owner reconciliation and User provisioning
We extract every distinct Supabase Auth UUID referenced as an owner on Deals and Tasks and match by email against the Salesforce destination org's User table. Owners without a matching Salesforce User go to a reconciliation queue. The customer's admin provisions any missing Users. OwnerId references are validated before migration of Opportunities and Tasks resumes.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Companies), Contacts (with AccountId resolved), Opportunities (with Stage from App.tsx enum, OwnerId from User reconciliation, and RecordTypeId resolved), Tasks (after Owner resolution), Notes (with polymorphic parent resolved to Contact or Opportunity), custom objects (last, because they may have cross-lookups to standard objects), and file attachments from Supabase Storage (mapped to ContentVersion and ContentDocumentLink). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, delta sync, and handoff
We freeze Supabase writes during cutover, run a final delta migration of any records modified during the migration window, then enable Salesforce as the system of record. We deliver a written inventory of App.tsx-based enum values and any custom TypeScript configuration that requires translation to Salesforce picklist fields or workflow conditions. We support a one-week hypercare window for reconciliation issues. Workflows, automations, and custom business logic encoded in the TypeScript source do not migrate; that inventory is handed to the customer's admin for Salesforce Flow rebuild.
Platform deep dives
Atomic CRM
Source
Strengths
Weaknesses
Salesforce Sales Cloud
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Atomic CRM and Salesforce Sales Cloud.
Object compatibility
2 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
Atomic CRM: Per Supabase rate limits applicable to your project tier.
Data volume sensitivity
Atomic CRM exposes a bulk API — large-volume migrations stream efficiently.
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 Atomic CRM to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Atomic CRM to Salesforce Sales Cloud migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Atomic CRM
Other ways to arrive at Salesforce Sales Cloud
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.