CRM migration
Field-level mapping, validation, and rollback between InStream and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
InStream
Source
Twenty CRM
Destination
Compatibility
8 of 11
objects map 1:1 between InStream and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from InStream to Twenty CRM is a migration from a lightweight social-contact CRM to an open-source, self-hosted CRM with a modern data model. InStream's Contact and Company objects map directly to Twenty's Person and Company objects, and its Kanban-style Deals map to Twenty's Opportunities. The critical migration decisions center on preserving social profile URLs (which InStream links from LinkedIn, Twitter, and Facebook but does not store as independent fields), resolving InStream's free-text pipeline stage names against Twenty's configurable stages, and transforming InStream list membership into Twenty's tagging system. We do not migrate InStream workflows, automations, or social enrichment snapshots as code or data — these require manual rebuild in Twenty. Twenty is self-hosted, so the customer's team is responsible for infrastructure, not a SaaS provider.
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 InStream 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.
InStream
Contact
Twenty CRM
Person
1:1InStream Contact records map to Twenty Person. The Person record receives name fields, email, phone, and any social profile URLs extracted from InStream's LinkedIn, Twitter, and Facebook fields. We extract these as URL fields on the Person record, not as enriched data snapshots, since InStream does not store the enrichment as independent fields — it is linked from the external social APIs at access time.
InStream
Company
Twenty CRM
Company
1:1InStream Company records map directly to Twenty Company. The domain and website fields transfer, and the Company is linked to all associated Person records via the standard relationship. We resolve the Company-Person link during migration to ensure Person records reference the correct parent Company.
InStream
Deal
Twenty CRM
Opportunity
1:1InStream Deals map to Twenty Opportunities. The deal name, value, and expected close date transfer directly. Pipeline stage mapping is the critical step: InStream uses free-text stage names with no enforced taxonomy, so we capture the original stage name, stage order, and probability (if set) during discovery and create matching stage values in Twenty's pipeline configuration before migration.
InStream
Pipeline Stage
Twenty CRM
Pipeline Stage
lossyEach InStream pipeline's stage names are user-defined and unnormalized, meaning 'Lead' in one account can mean 'Qualified' in another. We document every distinct stage name and its position in the pipeline during discovery, then configure Twenty's pipeline stages to match the original order and naming. Probability values transfer where set; we flag any stage without a probability as needing manual assignment in Twenty.
InStream
List
Twenty CRM
Tag
1:manyInStream Lists segment Contacts into named groups. We transform list membership into Twenty Tags, creating a tag per list and applying it to all Person records that were members. The list-to-tag mapping is documented so that if the customer used list names as campaign cohorts, those groupings are preserved as tag filters in Twenty.
InStream
Activity: Email
Twenty CRM
TimelineEntry (Email)
1:1InStream email history attached to a Contact migrates as a TimelineEntry with type=email in Twenty. The email body, subject, sender/recipient addresses, and timestamp transfer. We resolve the target Person record by email match before inserting the activity.
InStream
Activity: Call
Twenty CRM
TimelineEntry (Call)
1:1InStream call logs migrate as TimelineEntry records with type=call in Twenty. Call duration, disposition notes (where present), and timestamp transfer. The target Person record is resolved by email lookup before the activity is attached.
InStream
Activity: Meeting
Twenty CRM
TimelineEntry (Meeting)
1:1InStream meeting records migrate as TimelineEntry with type=meeting. Title, date, location, and attendee list transfer. Attendees resolve to Person records by email match, creating the association in Twenty's meeting record.
InStream
Activity: Note
Twenty CRM
TimelineEntry (Note)
1:1InStream Notes attached to Contacts migrate as TimelineEntry records with type=note in Twenty. The note body and timestamp transfer directly, linked to the target Person record.
InStream
Tag
Twenty CRM
Tag
1:1InStream tags on Contacts transfer as Twenty Tags. Tag names are preserved verbatim, and multiple tags on a single Contact become multiple Tag records associated with that Person. We deduplicate tags by name during the transform to avoid duplicate Tag records in Twenty.
InStream
Custom Field
Twenty CRM
Custom Field
lossyInStream's custom field schema is not publicly documented via API. We extract field definitions from the UI export (CSV or JSON) during discovery and cross-reference them against Twenty's custom field API via /metadata. Any unmapped custom fields are flagged for manual review and created in Twenty before the record migration begins. This is a higher-risk step for this pair because the custom field extraction relies on the customer's UI export quality.
| InStream | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | Person1:1 | Fully supported | |
| Company | Company1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline Stage | Pipeline Stagelossy | Fully supported | |
| List | Tag1:many | Fully supported | |
| Activity: Email | TimelineEntry (Email)1:1 | Fully supported | |
| Activity: Call | TimelineEntry (Call)1:1 | Fully supported | |
| Activity: Meeting | TimelineEntry (Meeting)1:1 | Fully supported | |
| Activity: Note | TimelineEntry (Note)1:1 | Fully supported | |
| Tag | Tag1:1 | Fully supported | |
| Custom Field | Custom Fieldlossy | 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.
InStream gotchas
Free plan 100-contact cap applies to total contacts, not just active ones
Social profile enrichment does not migrate as raw data
Pipeline stage names are free-text and not normalized
Custom fields schema is not publicly documented
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
Discovery and InStream export
We audit the InStream account for Contact count, Company count, Deal count, pipeline stage names and order, list names and membership counts, engagement volume, and any custom field definitions present in the UI. We request a full CSV or JSON export from InStream and review it for completeness. This phase identifies whether the export includes all custom field data and flags the social profile enrichment limitation for the customer before migration begins.
Twenty schema configuration
We set up the Twenty CRM workspace by creating the pipeline with stage values that match InStream's original stage names and order, creating any custom fields (extracted from the InStream export) via Twenty's /metadata API, and verifying the Person, Company, and Opportunity object structure is in place before records are written. This is performed in a staging or development Twenty instance first for validation.
Record dependency mapping and transform
We build the migration transform in dependency order: Companies first (so Person records can reference a parent), then Persons (with social profile URLs extracted from the source fields and the Company link resolved), then Opportunities (with stage names mapped to the configured Twenty stage values and the Person/Company links resolved), then Tags (deduplicated and created before list membership is applied), then list membership applied as Person-Tag associations, then Activities (emails, calls, meetings, notes) linked to the resolved Person records. Each phase emits a row-count reconciliation report.
Sandbox or staging migration and reconciliation
We run a full migration into a staging Twenty instance (or a copy of the target environment). The customer reviews a random sample of migrated records against the InStream source and validates pipeline stage labels, tag membership, and activity timestamps. We correct any mapping errors in the transform before the production migration runs.
Production migration and cutover
We freeze writes to InStream during the cutover window, run a delta extraction for any records modified since the initial export, apply the transform, and load into the production Twenty instance. We verify row counts match across all object types. Any record with an unresolved parent reference (Person without a Company, Opportunity without a Person) is held in a reconciliation queue and reported to the customer for manual resolution.
Workflow inventory handoff and post-migration support
We deliver a written inventory of every active InStream workflow rule with its trigger, conditions, and actions. The inventory includes a note on whether each workflow has a direct Twenty equivalent or requires a different approach. We do not rebuild InStream automations inside the migration scope. We support a three-day post-migration window where we resolve reconciliation issues and answer questions about the migrated data in Twenty.
Platform deep dives
InStream
Source
Strengths
Weaknesses
Twenty CRM
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 InStream and Twenty CRM.
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
InStream: Not publicly documented..
Data volume sensitivity
InStream 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 InStream to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your InStream 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 InStream
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.