CRM migration

Migrate from SendPulse to Twenty CRM

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

SendPulse logo

SendPulse

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

55%

6 of 11

objects map 1:1 between SendPulse and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

SendPulse is primarily a multi-channel marketing platform with a lightweight built-in CRM, while Twenty CRM is a dedicated open-source CRM designed for teams that want full data ownership. The migration is less about a like-for-like platform swap and more about consolidating from a marketing-plus-CRM stack into a purpose-built CRM. We export Contacts, Companies, Deals, and Tasks from SendPulse via its REST API and CSV export, then load them into Twenty through Twenty's GraphQL API using batch mutation requests and per-minute rate-limit handling. Because Twenty has no built-in bulk-import UI, the migration is API-driven throughout. SendPulse Automation 360 flows, chatbot configurations, landing pages, and sender email addresses cannot be migrated programmatically and require manual rebuild or re-verification in Twenty. Campaign statistics (open rates, click rates, bounce data) are extracted as structured records and written to Twenty as custom properties on the associated contact or company record. We flag data quality issues including duplicate email addresses, missing required fields, and stale records during the audit phase so the customer can decide what to keep before any data moves.

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

SendPulse logo

SendPulse

What's pushing teams away

  • Email sending restrictions and unpredictable delivery delays — over half of negative Capterra reviews cite blocked lists, moderation queues, and inconsistent inbox delivery as ongoing pain points.
  • Limited and shallow reporting — users describe the analytics dashboard as lacking the detail needed for meaningful campaign optimization and ROI analysis.
  • Customer support inconsistency — while some reviews praise responsiveness, others report difficulty reaching knowledgeable staff for technical or billing issues.
  • Scaling cost surprises — as subscriber lists grow beyond plan limits, pricing escalates and the per-sender-address cap on lower tiers becomes a friction point.
  • Feature gaps compared to dedicated CRMs — the built-in CRM is lightweight; users needing robust pipeline management, custom objects, or advanced forecasting outgrow it.

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 SendPulse objects map to Twenty CRM

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

SendPulse

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

SendPulse CRM Contacts map directly to Twenty Person records. The first_name, last_name, email, phone, and custom properties migrate as standard and custom fields on Person. SendPulse's contact avatar URL migrates as a custom text field. We deduplicate by email address during the extract phase and flag duplicate SendPulse contacts (same email, different IDs) for the customer's review before import into Twenty. Any SendPulse contact with a linked Company record gets the Company-_person link preserved via the Twenty relationship model.

SendPulse

Company

maps to

Twenty CRM

Company

1:1
Fully supported

SendPulse CRM Companies map directly to Twenty Company records. Company name, domain, address, industry, and custom fields migrate 1:1. The company domain is used as a dedupe key and populates the Company URL field in Twenty. SendPulse's company-contact linkage migrates as a primary contact relation in Twenty's data model. Companies without contacts are imported as standalone records.

SendPulse

Deal

maps to

Twenty CRM

Opportunity

1:1
Fully supported

SendPulse Deals map to Twenty Opportunities. The deal name, value, stage, responsible user, and custom fields migrate to Twenty's Opportunity object. SendPulse pipeline stages map to Twenty pipeline stages, which we configure in Twenty's Data Model before migration. Closed-won and closed-lost reasons from SendPulse custom fields become custom text fields on the Opportunity in Twenty.

SendPulse

Task

maps to

Twenty CRM

Task

1:1
Fully supported

SendPulse CRM Tasks map to Twenty Task records. Task title, due date, assignee, status, and linked contact or company migrate directly. The linked entity reference (contact_id or company_id) is resolved to the corresponding Twenty Person or Company record ID during the transform phase. Open tasks migrate with their original due dates preserved; completed tasks migrate with completion timestamps.

SendPulse

Subscriber

maps to

Twenty CRM

Person (tagged)

lossy
Fully supported

SendPulse Subscribers from the email marketing module are distinct from CRM Contacts. We extract subscribers with their subscription status (subscribed, unsubscribed, bounced) and segment membership, then map them as Person records in Twenty tagged with the original mailing list name and a subscription_status field. Bounced and unsubscribed addresses are imported with their status preserved as custom fields. Active subscribers from mailing lists that are also in the CRM become merged with existing Person records; mailing-list-only subscribers are imported as new Person records with a custom source field set to SendPulse mailing list.

SendPulse

Campaign Statistics

maps to

Twenty CRM

Person or Company (custom properties)

lossy
Mapping required

SendPulse campaign statistics (open rate, click rate, bounce count, unsubscribe count per campaign per subscriber) are extracted as structured records and written to Twenty as custom number or text fields on the corresponding Person record. For aggregate reporting, we create a custom CampaignHistory object in Twenty linked to Person, capturing campaign_id, send_date, opens, clicks, and bounces. This preserves historical performance data that SendPulse exports to CSV.

SendPulse

Sender Email Address

maps to

Twenty CRM

Not migratable

lossy
Fully supported

SendPulse verified sender addresses (SMTP senders used for campaigns) are platform-specific and tied to SendPulse's sending infrastructure. They cannot be transferred to Twenty because Twenty does not include an email sending module. We document every verified sender domain and address for the customer's reference so they can configure DNS records (DKIM, SPF, DMARC) for their chosen email sending provider (Resend, AWS SES, Postmark) in parallel with the CRM migration.

SendPulse

Product

maps to

Twenty CRM

Custom Object or Opportunity Line Item

1:1
Fully supported

SendPulse CRM Products (name, price, SKU, category, and hidden integration fields) map to Twenty as a custom object named Product if the customer tracks products independently of opportunities. We extract hidden integration fields via the targeted API call with the integration_fields parameter and write them as custom text fields on the Product custom object. If the customer uses products within deal contexts, we recommend a Product custom object linked to Opportunity rather than Twenty's built-in opportunity line item model.

SendPulse

Automation 360 Flow

maps to

Twenty CRM

Not migratable

lossy
Fully supported

SendPulse Automation 360 flows have no API export endpoint. Flow definitions exist only in the SendPulse UI and cannot be programmatically extracted. We provide a written inventory of every active Automation 360 flow documenting its trigger, conditions, delay steps, and actions based on screenshots and walkthroughs with the customer. The customer's admin rebuilds each flow in Twenty Workflows post-migration. Complex multi-branch flows may require significant reconfiguration time in Twenty.

SendPulse

Chatbot Configuration

maps to

Twenty CRM

Not migratable

lossy
Fully supported

SendPulse chatbots (Telegram, Facebook Messenger, Instagram, WhatsApp, TikTok, Viber) cannot be exported via API. Chatbot flow logic, trigger conditions, and message content are stored on SendPulse's platform and tied to their messenger integrations. We document the messenger channels in use, the primary use cases (lead capture, FAQ automation, order tracking), and recommend a replacement chatbot platform (ManyChat, Tidio, or native messenger developer tools) to be configured separately from the CRM migration.

SendPulse

Owner

maps to

Twenty CRM

Workspace Member

1:1
Fully supported

SendPulse CRM owners (assigned users on contacts, companies, deals, tasks) map to Twenty Workspace Members. We resolve SendPulse owner email addresses against the Twenty destination workspace's member list. If a SendPulse owner has no matching Twenty account, we hold the assignment in a reconciliation field and flag it for the customer to provision the corresponding Twenty user before record import. Active vs inactive status is preserved.

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.

SendPulse logo

SendPulse gotchas

High

Automation 360 flows have no API export endpoint

High

Email send restrictions and moderation delays are common

Medium

Unique subscriber billing count differs from raw list size

Medium

Hidden product integration fields are not visible in standard export

Low

Overdue payments deactivate the entire plan, not just one tool

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

  • Twenty has no bulk-import UI; all migrations are API-driven

    Twenty does not yet offer a built-in CSV or bulk-import wizard for CRM records. Every object (Person, Company, Opportunity, Task) must be imported through Twenty's GraphQL API using batch mutation requests or the REST API with chunked payloads. This means migration scripts must handle rate-limit headers (100 requests/minute on Pro, 200 on Organization), exponential backoff on 429 responses, and batch chunking for large record sets. Without an API-driven migration tool, teams attempting manual CSV uploads into Twenty hit a dead end. We handle the API sequencing, chunking, and error recovery as part of the migration engagement.

  • SendPulse Automation 360 flows have no export endpoint

    SendPulse does not expose Automation 360 flow definitions via its REST API or any bulk export mechanism. The flow trigger, step conditions, delays, and actions exist only within the SendPulse UI. We cannot programmatically extract flow logic during migration. We document every active flow from screenshots and step-by-step walkthroughs, then deliver a written flow inventory with Twenty Workflow equivalents. The customer's admin rebuilds each flow in Twenty Workflows post-migration. Complex multi-branch flows with multiple entry points and conditional branches require significant reconfiguration time and should be scoped as separate work.

  • Custom fields must exist in Twenty before records can import

    Twenty requires all custom fields to be created in Settings -> Data Model before any records containing those fields can be imported via API. If a SendPulse contact has a custom field called preferred_language, that field must be pre-created in Twenty's Person object metadata with the correct type (text, select, number, date, etc.) before the import script attempts to write any contact records. We handle schema pre-creation as a prerequisite step before any data migration phase begins, using Twenty's /metadata API to provision fields. This is a hard dependency that blocks record import if missed.

  • SendPulse's unique-subscriber billing count differs from raw list size

    SendPulse tracks unique subscribers as a deduplicated monthly count of email addresses contacted within a billing period. A list with 5,000 contact records may count as 3,800 unique subscribers for billing purposes due to shared email addresses across multiple contacts. When exporting SendPulse data for migration, we count raw unique email addresses to establish the migration record set. Any email address that appears in both the CRM Contacts module and the Subscribers module is deduplicated to a single Person record in Twenty. This deduplication reduces the final record count compared to raw SendPulse list exports.

  • Email delivery history should not be treated as definitive

    SendPulse applies content moderation to outbound campaigns, and users report blocked lists, unexpected sending pauses, and unpredictable delivery timing. Campaign open rates, click rates, and delivery statistics in SendPulse may not reflect true inbox delivery because some emails were likely blocked or held in moderation queues. We flag that historical delivery statistics should be treated as approximate, not definitive, and recommend validating email deliverability separately after migration using a verification tool. Campaign statistics are migrated as-is with a data-quality flag for the customer to interpret.

Migration approach

Six steps for a successful SendPulse to Twenty CRM data migration

  1. Data audit and deduplication

    We extract all CRM records from SendPulse (Contacts, Companies, Deals, Tasks, Products) via REST API and CSV export, and separately extract Subscribers from the email marketing module with subscription status and segment membership. We run deduplication across email addresses to identify records that share the same email (both within the CRM and between CRM Contacts and email Subscribers), flag duplicates for the customer's decision, and remove stale records (contacts with no activity in 24+ months per the customer's criteria). The audit output is a record-count breakdown and a data-quality summary covering missing required fields, invalid email formats, and orphaned company links.

  2. Schema design and custom field provisioning in Twenty

    We design the destination schema in Twenty before any data import. This includes creating custom fields on Person (for SendPulse contact custom properties), Company, Opportunity (for SendPulse deal fields and custom properties), and Task. We provision any custom objects needed for Products or campaign history. Each custom field is created via Twenty's /metadata API with the correct type (text, number, date, select, multi-select) matched to the SendPulse source field type. We also configure the Twenty workspace members list by matching SendPulse owner email addresses to Twenty user accounts, flagging any SendPulse owners without a corresponding Twenty user for the customer to provision.

  3. Twenty workspace configuration

    We configure the Twenty workspace to receive the migrated data, including setting up pipeline stages that map from SendPulse deal stages, configuring company domain settings for the domain-based company deduplication, and setting up any custom views needed to display the migrated data in the customer's preferred layout. This step is done in a staging or development Twenty workspace if the customer is using self-hosted, or in the production workspace if using Twenty cloud, before records are loaded.

  4. API-driven migration in dependency order

    We run the migration using Twenty's GraphQL API with batch mutations. Records are loaded in dependency order: Companies first (standalone records with no external dependencies), then Persons (resolving any linked Company by name or domain), then Opportunities (resolving linked Person and Company), then Tasks (resolving linked Person, Company, and Opportunity), then custom object records. Each phase emits a row-count reconciliation report comparing records loaded to records expected. We apply exponential backoff and chunking for large batches, and we handle 429 rate-limit responses by pausing and resuming within the configured per-minute limit.

  5. Subscriber and campaign statistics migration

    Active subscribers from SendPulse mailing lists that are not already in the CRM contacts are imported as Person records tagged with the mailing list name and subscription_status field. Campaign statistics are written to Twenty as a custom CampaignHistory object linked to Person records, capturing campaign ID, send date, opens, clicks, bounces, and unsubscribes per contact per campaign. This preserves historical SendPulse campaign performance data for reporting in Twenty.

  6. Cutover, validation, and automation rebuild handoff

    We freeze SendPulse CRM writes during cutover, run a delta migration of any records modified during the migration window, then enable Twenty as the system of record. We deliver the Automation 360 flow inventory with Twenty Workflow equivalents, the chatbot documentation with replacement platform recommendations, and the sender address list for DNS configuration with the customer's chosen email sending provider. We support a one-week post-migration validation window. We do not rebuild SendPulse Automation 360 flows or chatbot configurations as part of the migration scope; that is separate work for the customer's admin team or a Twenty implementation partner.

Platform deep dives

Context on both ends of the pair

SendPulse logo

SendPulse

Source

Strengths

  • Bundles email, SMS, chatbots, web push, and a CRM in a single subscription.
  • Free tier with no credit card required and genuine feature parity for small lists.
  • Multi-messenger chatbot builder, especially strong for Telegram automation.
  • Dynamic segmentation with saved segments on Standard+ plans and unlimited on Pro/Enterprise.
  • Per-channel pricing for SMS and messenger messages based on country-by-country rates.

Weaknesses

  • Reporting is shallow compared to dedicated email marketing platforms — limited campaign attribution and funnel analytics.
  • Email delivery inconsistencies and moderation delays are recurring customer complaints.
  • Built-in CRM is lightweight; lacks advanced deal forecasting, custom objects, and robust pipeline customization.
  • Automation 360 flow logic is not programmatically exportable, requiring manual rebuild in destination platforms.
  • Sender address limits on lower tiers (100 on Standard, 300 on Pro) create friction as teams scale.
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 SendPulse 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

    SendPulse: Not publicly documented on the developer site.

  • Data volume sensitivity

    B

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

Estimator

Estimate your SendPulse 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 SendPulse to Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most migrations land between three and five weeks for accounts with under 10,000 contacts, 500 companies, and 1,000 deals with no custom CRM objects. Migrations involving multiple custom fields on CRM objects, large mailing list segmentation history requiring tag reconstruction, or more than 25,000 total records move to six to ten weeks because of API batch sequencing, deduplication logic, and parent-record lookup resolution. The migration timeline assumes the customer provides timely access to SendPulse API credentials and approves the deduplication decisions within the audit phase.

Adjacent paths

Related migrations to explore

Ready when you are

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