Pipedrive to Attio is a data-model translation problem. Use Attio's Assert API for upserts, avoid Import2 if you have existing records, and always load Companies → People → Deals in order.
There is no native migration path that preserves relationships from Pipedrive to Attio. Pipedrive is pipeline-centric with flat custom fields identified by 40-character hex hashes and no custom objects. Attio is object-relational with custom objects, relationship attributes, and lists that aggregate records across workflows. The fundamental gap is architectural: Pipedrive's Import2 integration cannot update existing records, and Attio's standard Companies and People objects do not support custom unique attributes — forcing domain and email matching as the only deduplication strategy. Every migration requires API-based extraction with custom field hash resolution, Attio's Assert endpoint for upserts, strict Companies → People → Deals load ordering, and explicit handling of records that lack domains or email addresses.
Read this first
Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.
Pipedrive Leads are not Contacts
In Pipedrive, Leads are unconverted prospects in a separate inbox with limited field support. Decide during planning whether they become People records, Deal records in a qualification stage, or list entries in Attio.
Attio custom object constraints
Attio supports custom objects, but the real limitation is key design: custom required attributes are only available on custom objects, and custom unique attributes are not available on standard Companies or People. This means you cannot add a pipedrive_org_id as a unique key on Companies — you must rely on domains for matching. (attio.com)
Multi-pipeline Pipedrive setups
If your Pipedrive account uses multiple pipelines (e.g., separate pipelines for new business, renewals, and partnerships), map each pipeline to its own Attio list or status grouping before migration. Attio Deals have a single status attribute — you cannot represent multiple independent pipelines on one object without either flattening stages across pipelines into a single status field (with prefixed names like Renewals: Negotiation) or creating separate custom objects per pipeline. Decide this during schema design, not during loading.
The Import2 Limitation
Import2 creates new records but will not update attribute values on records that already exist in Attio. If your team has already connected email inboxes (which auto-creates People and Company records from email history), you must delete all existing records in Attio — including those created by mailbox sync — before running Import2. This means disconnecting all inboxes, purging the workspace, running the migration, then reconnecting inboxes. (attio.com)
Monitor your daily budget
Check the API Usage Dashboard in Pipedrive's Company Settings before starting. A 10-seat Professional plan gives ~300,000 tokens/day. A migration extracting 50,000 records across all entity types can consume 30–60% of that budget in a single day.
Load order matters
Attio doesn't automatically create referenced records — the record you're referencing must already exist. Import Companies first, then People (with company relationship references), then Deals (with people and company references). If you reverse the order, reference writes will fail silently.
Assert endpoint gotcha for Deals
Attio's Deal object has no default unique attribute. If you call the Assert endpoint without specifying a matching attribute that has a unique constraint, every call creates a new record. Create and populate a pipedrive_deal_id attribute first.
Rollback mechanics
Attio does not offer a bulk delete API endpoint. To delete migrated records, you'll need to query records by your pipedrive_id or pipedrive_deal_id attribute using the List Records endpoint, then delete each record individually via DELETE /v2/objects/{object}/records/{record_id}. For large migrations, script this deletion loop with the same rate-limit handling you used for loading. Budget time accordingly — deleting 20,000 records at 25 requests/second takes roughly 13 minutes per object type.
The runbook
Work top to bottom. Tick steps as you go — your progress is saved in this browser.
01 Discovery Agree scope, pipeline design and success criteria before touching data.
Objective A scope covering every object in the revenue model, with sales leadership signed up to the pipeline design.
Keep these open
-
Inventory every object in Pipedrive
Count accounts, contacts, leads, deals or opportunities, activities, notes, emails, files, products and quotes. Activity and email history is usually the largest object by an order of magnitude and the one people forget to size.
Data Profiler Get real record counts instead of estimating from memory -
Map the current pipeline and agree the target model
Document every pipeline, stage, probability and required field, then agree the Attio model with sales leadership. Migrating a broken pipeline faithfully is a wasted opportunity; redesigning it mid-migration is a wasted migration.
Stage changes alter historical conversion rates. Agree how you will restate reporting before you change the model.
-
Catalogue integrations and automation
List every system touching Pipedrive: marketing automation, quoting, billing, ERP, data enrichment, dialler, BI. Each is a separate cutover task with its own owner, and each can silently write bad data into your new CRM.
-
Capture the reporting that must survive
Interview the people who actually live in the dashboards — forecast, pipeline coverage, rep activity, cohort conversion. Every one of these needs the underlying fields to migrate, which frequently expands the scope.
-
Build the business case and pick the go-live date
Model licence delta, implementation effort and productivity dip. Then choose the date deliberately: mid-quarter is disruptive, quarter-end is worse. Most teams land on the first week of a new quarter.
COI & ROI Calculator Build the 36-month business case you will need for sign-off -
Record count comparison
Total records per entity in Pipedrive vs. Attio, including archived subsets. Any discrepancy means dropped records.
-
Import ordering and ID mapping
that must be exact — one bug in the Company → People → Deal chain breaks all relationships.
Pipedrive → Attio specifics
- Data model flexibility
- Pipedrive's model is deal-pipeline-centric: a Person has a single Organization association, and there are no custom objects. When your business needs to model multi-company relationships, product usage data, or investor relationships, Pipedrive forces you into workarounds with custom fields. Attio lets you create custom objects, define relationship attributes between any objects, and build lists that aggregate records across workflows.
- Relationship intelligence
- Attio automatically ingests email and calendar data when users connect their inboxes, enriching People and Company records with interaction history — no manual logging.
- API-first architecture
- Attio's API is well-documented and consistent, which matters for teams building internal tooling and integrations around their CRM.
- Cost consolidation at scale
- Pipedrive's per-seat pricing with add-ons (LeadBooster, Smart Docs, Projects) adds up. Attio's plan structure bundles more functionality per tier.
- Empty Attio, simple data, low engineering bandwidth
- Test Import2 first, then validate hard. (attio.com)
Don't move on until
- Object counts confirmed for accounts, contacts, deals and activities
- Target pipeline and stage model agreed with sales leadership
- Reporting requirements captured from the people who use the reports
02 Data Audit CRM data is usually dirtier than anyone expects. Find out how dirty.
Objective A profiled export with duplicates, ownership gaps and relationship integrity all quantified and triaged.
Keep these open
-
Export and profile every object
Profile null rates, distinct values and type consistency across all objects. Pay attention to fields sales reps were supposed to fill in: an 80% null rate on a field your forecast depends on is a business finding, not a data one.
Data Profiler Profile the Pipedrive export for nulls, outliers and type drift -
Quantify duplicates and agree the merge policy
Measure duplicate accounts (same company, different spellings and suffixes) and contacts (same email, or same person at a renamed company). Agree survivorship rules before merging: which record wins, which fields, and what happens to the activity history on the loser.
Merging before you have agreed survivorship rules destroys history irreversibly. Decide first, merge second.
Data Cleaner Strip empty rows, stray whitespace and dead columns -
Verify relationship integrity
Check every deal has a valid account, every contact a valid account, every activity a valid parent. Referential breaks are the defect that turns a clean-looking load into a CRM where the pipeline report does not tie to the account list.
-
Resolve ownership and the user map
Build the Pipedrive user → Attio user map, including leavers. Every record needs a valid owner: records assigned to deactivated users either fail to load or land unassigned, and unassigned pipeline is pipeline nobody works.
Records owned by deactivated users are a top cause of load failures. Decide the reassignment target before you start.
-
Scan for PII and regional compliance
CRMs hold marketing consent, lawful basis and unsubscribe state. Confirm these fields migrate intact and that consent provenance survives — losing consent records is a regulatory problem, not a data-quality one.
PII & Compliance Scanner Find regulated fields before they land in a new system -
Clean, normalise and archive the pre-state
Normalise country and state values, phone formats, currencies and casing, and standardise all timestamps to UTC. Keep an untouched copy of the raw export — it is your only reference if a mapping decision turns out wrong.
-
Use v2 endpoints where available
Pipedrive's v2 API offers cursor-based pagination, stricter validation, RFC 3339 timestamps, and lower token costs. Fall back to v1 only for entities not yet on v2 (Notes, Files, some mail endpoints).
-
Extract archived records separately
Pipedrive has separate archived paths for deals and leads — don't assume active list endpoints are enough.
Pipedrive → Attio specifics
- Paginate with cursor (v2) or start + limit (v1)
- Fetch in batches of 100–500 records. (pipedrive.readme.io)
- Respect rate-limit headers
- Pipedrive returns X-RateLimit-Remaining, X-RateLimit-Reset, and token budget headers. Implement exponential backoff with jitter on 429s.
- Separate extraction passes
- Export Organizations, Persons, Deals, Activities, Notes, and Files in separate sequential passes. Activities, notes, and files linked to deals and contacts must be exported separately — Pipedrive's global export does not bundle them.
- Former-employee email extraction
- recovering historical correspondence from churned reps that Attio's native inbox sync can't reach.
- Rate limit management
- across both platforms with proper throttling, retry logic, and dead-letter handling.
Don't move on until
- Duplicate rate quantified per object with a merge policy agreed
- Every record has a valid owner mapped to a target user
- Relationship integrity verified — no orphaned deals or contacts
03 Field Mapping Map objects, relationships and picklists — in that order.
Objective A signed mapping spec that covers objects, relationships, picklist values and currency handling.
Keep these open
-
Map objects and their relationships first
Establish how Pipedrive objects correspond to Attio objects before any field work. Leads-versus-contacts, accounts-versus-organisations and deal hierarchies differ structurally between CRMs, and a field map built on the wrong object model has to be redone.
Schema Mapper Opens pre-loaded with the Pipedrive → Attio field pair -
Generate and then hand-review the field map
Auto-match both schemas, then review every row. Look hardest at anything named "type", "source", "stage" or "status", where names match and meanings do not.
-
Map every picklist value, including retired ones
Enumerate all values on both sides — deal stages, lead sources, industries, statuses — and map each explicitly, including values no longer offered but still present on old records. Unmapped values either fail the row or land as blanks that quietly break segmentation.
Historical records often carry picklist values that were retired years ago and no longer appear in the UI.
-
Decide currency, amount and date handling
If you sell in multiple currencies, confirm how Attio stores amounts, exchange rates and dated conversion rates. Recalculating historical deal values at today's rate silently rewrites your revenue history.
Multi-currency deals re-converted at current rates will not tie to your historical reporting or your finance system.
-
Determine the load order
Sequence the load so parents exist before children: users, then accounts, then contacts, then deals, then activities and notes. Keep source IDs in custom fields so relationships can be rebuilt by lookup rather than guesswork.
-
Freeze the spec and sign off
Version-control the mapping, walk RevOps and sales leadership through the decisions that change reporting, and get written sign-off before the pilot.
-
Set fields
Pipedrive multi-option select maps to Attio multi-select, but option IDs won't match — use label-based mapping.
Pipedrive → Attio specifics
- Monetary fields
- Pipedrive includes a currency code per value. Attio's currency attribute requires the currency to be set at the attribute level. If your Pipedrive deals use mixed currencies, you'll need separate Attio attributes per currency or a transformation layer.
- Phone fields
- Pipedrive supports labels like "work" and "mobile." Attio stores the number and country code but uses a different structure.
- Rich notes
- Pipedrive notes are HTML-formatted and can be up to ~100KB each. Plan an HTML-to-Markdown or HTML-to-plaintext transform rather than assuming they'll drop in untouched. (developers.pipedrive.com)
- Cache custom field definitions first
- Call the fields endpoint for each entity type and store the hash-to-label mapping before extracting any records.
Don't move on until
- Object and relationship model mapped and reviewed
- Every picklist value explicitly mapped, including dead values
- Load order determined so parents always exist before children
04 Test Migration Pilot with related records, not a flat sample.
Objective A pilot load whose relationships, ownership and roll-up reporting all verify against source.
Keep these open
-
Configure the Attio sandbox to match the agreed model
Build the pipelines, stages, custom fields, record types and user roles first. Load into a default configuration and you will only discover the configuration defects at full scale.
-
Select a connected pilot slice
Take complete account trees — 50-100 accounts with all their contacts, deals, activities and files — rather than a flat random sample. Relationship defects are the whole point of a CRM pilot and a flat sample cannot expose them.
-
Run the load in dependency order with full logging
Load users, accounts, contacts, deals, then activities, logging every request against its source ID. Note which failures are transient (rate limits, timeouts) and which are structural (validation, missing parent).
-
Verify relationships and roll-ups
Confirm every deal sits on the right account with the right owner and stage, and that pipeline totals per account and per rep match Pipedrive exactly. Roll-up mismatches almost always mean a relationship or currency defect upstream.
Migration Validation Tool Diff the pilot batch against source before scaling up -
Measure throughput and project the full load
Record actual records-per-hour under Attio's API limits and extrapolate, remembering activity history usually dominates volume. If the projection exceeds your window, split the load or trim activity scope now.
-
Let reps work the pilot data
Put two or three reps in the sandbox against their own accounts. They spot missing context, wrong owners and unusable notes far faster than any reconciliation script, and their buy-in is what makes adoption work.
Pipedrive → Attio specifics
- Field-level spot checks
- Sample 50 records per entity and compare every field value against the Pipedrive source. Pay special attention to dates (timezone shifts), currency values, and multi-select fields.
- Relationship integrity
- For a sample of Deals, verify that the linked Company and People records exist and are correct in Attio.
- Notes and activity count
- For 20 randomly selected contacts, compare the number of notes/activities in Pipedrive vs. Attio.
- Pipeline stage distribution
- Compare the count of Deals per stage in Pipedrive vs. Attio. Mismatches indicate a stage-mapping error.
- Enrichment drift check
- After migration, spot-check whether Attio's automatic enrichment has overwritten any migrated field values on Companies or People — particularly industry, description, and employee count fields.
Don't move on until
- Relationships intact across the whole pilot slice
- Pipeline roll-ups match source for the pilot accounts
- Reps have worked pilot records and confirmed they are usable
05 Cutover Switch the revenue system with the pipeline intact.
Objective All in-scope CRM data live in Attio, integrations repointed, and reps selling on day one.
Keep these open
-
Pre-load history ahead of the freeze
Load closed deals, historical activities and inactive accounts while Pipedrive stays live. Only open pipeline and the final delta need to move inside the window.
-
Publish the cutover runbook
A timed sequence with owners and abort criteria: freeze, final export, delta load, integration switch, smoke test, go/no-go, rep enablement. Pick a window that avoids quarter-end and month-end close.
-
Freeze Pipedrive and take the final delta
Set Pipedrive read-only and export everything changed since the pre-load. Reps updating deals during an unenforced freeze is the classic way to lose the most recent — and most valuable — pipeline changes.
A rep who updates a deal in the old CRM during the freeze will lose that update permanently.
-
Load the delta and reconcile the pipeline
Run the delta, then verify open pipeline value and count per rep against Pipedrive before anything else. If the pipeline number is wrong on day one, reps stop trusting the system and never fully come back.
Migration Validation Tool Confirm the final delta landed before you reopen -
Repoint every integration and verify with real records
Switch marketing automation, quoting, billing, enrichment, dialler and BI connections, then push a live record through each path. An unrepointed integration writing into the old CRM causes divergence that gets harder to reconcile every day.
Two-way integrations left pointing at the old CRM will keep writing there. Disable them before you switch, not after.
Cron Expression Builder Schedule the delta syncs that run through the freeze -
Go/no-go, then enable the reps
Call the decision explicitly against the exit criteria. Run enablement on real data with their own accounts on screen, and keep Pipedrive read-only rather than cancelled until validation closes.
Don't move on until
- Historical load complete and reconciled before the freeze
- All integrations repointed and verified end to end
- Reps logged in with pipeline visible and correct
06 Validation Prove the revenue numbers tie out, then close the project.
Objective Reconciled data, forecast parity with pre-migration reporting, and signed acceptance.
Keep these open
-
Reconcile every object
Compare counts and values across accounts, contacts, deals, activities and files, plus field-level spot checks on a random sample. Produce a single report suitable for audit and for finance.
Migration Validation Tool Reconcile Pipedrive and Attio record-for-record -
Tie the pipeline and forecast to baseline
Rebuild forecast, pipeline coverage and win-rate reporting and compare to pre-migration figures. Every variance needs an explanation — most trace back to stage or currency mapping decisions made in Field Mapping.
Stage-model changes will legitimately shift historical conversion rates. Restate the baseline rather than chasing the difference as a defect.
-
Verify ownership, visibility and permissions
Confirm every record has the right owner and that sharing rules, territories and role hierarchy give each rep exactly the visibility intended. Over-broad visibility in a CRM is a data-protection issue as much as a config one.
-
Re-profile for field completeness
Compare loaded null rates against the source profile per field. A field that arrived empty while counts matched is the failure counts alone cannot detect.
Data Profiler Prove field completeness held up through the load -
Test automation and integration write-back
Fire every workflow, assignment rule, sequence and notification, and confirm each integration writes correctly in both directions. Automation is rebuilt rather than migrated, so it is unproven until observed.
-
Sign off and schedule decommission
Get written acceptance against the Discovery criteria, keep Pipedrive read-only for 30-90 days with a final archive export taken, then diarise cancellation so the contract does not auto-renew.
-
Rebuild automations
Pipedrive workflow automations don't transfer. Rebuild them in Attio's workflow builder or via the API.
-
Configure pipeline views
Set up Kanban and list views for each pipeline stage in Attio. Attio Deals ship with default stages — map these to your actual pipeline before the team starts working.
-
Check enrichment overwrites
Review a sample of migrated Companies and People to see if Attio's automatic enrichment has replaced any values you migrated from Pipedrive. Adjust your schema (use custom attributes for Pipedrive-authoritative data) if needed.
Pipedrive → Attio specifics
- Reconnect inboxes
- If you disconnected inboxes for Import2, re-sync all team members' Google or Microsoft accounts. Attio will backfill email history for active mailboxes.
- Team training
- Attio's UI and mental model differ from Pipedrive. Run a focused walkthrough covering: record navigation, relationship attributes, list views, and the notes/tasks workflow.
- Systematic validation
- record counts, field-level spot checks, relationship integrity — not ad hoc checks.
Don't move on until
- Full reconciliation report complete across all objects
- Forecast and pipeline reports tie to pre-migration baselines
- Acceptance signed and Pipedrive decommission scheduled
Field mapping reference
The field-by-field mapping for each object. Use this as the starting point for your mapping spec.
Method Complexity
| Pipedrive field | Attio field | Notes |
|---|---|---|
| Import2 | Low | Notes only |
| CSV | Low | ❌ |
| Direct API script | High | ✅ |
| Custom ETL | High | ✅ |
| iPaaS | Medium | Limited |
| Managed service | Low (for you) | ✅ |
Pipedrive Pipedrive Type
| Pipedrive field | Attio field | Notes |
|---|---|---|
| name (Org) | varchar | Direct map |
| address (Org) | varchar | Parse into structured fields |
| owner_id (Org) | int | Map Pipedrive user IDs to Attio member IDs |
| name (Person) | varchar | Split into first_name / last_name |
| email (Person) | array | Multi-value; lowercase and dedupe before loading |
| phone (Person) | array | Restructure from label-based to country-code-based |
| org_id (Person) | int | Map to Company record_id via crosswalk |
| title (Deal) | varchar | Direct map; required in Attio |
| value (Deal) | monetary | Set currency at attribute level |
| stage_id (Deal) | int | Map stage IDs to Attio status options |
| person_id (Deal) | int | Map to People record_id; supports multiple |
| org_id (Deal) | int | Map to Company record_id |
| add_time (Deal) | datetime | Preserve original timestamp |
| note (Note) | text/html | HTML-to-Markdown transform; link to parent record |
Risk matrix
Per-object risk for this pair. Plan extra validation around anything marked high.
| Object | Risk | Notes |
|---|---|---|
| Organizations → Companies | medium | Domain matching works but orgs without a usable domain create orphan records that cannot be deduplicated |
| Persons → People | medium | Email matching with normalization; multi-value emails need flattening and primary selection |
| Deals → Deals | high | No default unique attribute; custom key required for Assert API or every write creates duplicates |
| Leads → People + List Entries | medium | Routing decision needed based on business meaning — list entries or early-stage Deals |
| Activities → Notes/Tasks | high | Type classification required; links to parent records must be rebuilt via ID crosswalk |
| Custom Fields → Attributes | medium | Monetary fields need per-attribute currency; set fields need label-based mapping; phone fields need restructuring |
| Products → Custom Object | medium | No direct equivalent in Attio; requires custom object creation or list attributes on Deals |
| Notes → Notes | low | Direct API migration with parent record linking via Notes API |
| Files/Attachments | high | No direct file upload endpoint; requires external hosting and URL-based linking |
| Pipeline Stages → Status | medium | Pre-create matching stage options in Attio and build a stage-name mapping in the transform layer |
The hard parts
What makes this specific migration difficult, beyond the mechanics.
Import2 Limitation
Import2 cannot update existing records. If inboxes have been connected, all auto-created records must be deleted before use — or you must skip Import2 entirely.
No Unique Key on Deals
Attio Deals have no default unique attribute. A custom pipedrive_deal_id with unique constraint must be created before using the Assert API.
Custom Field Resolution
Pipedrive's 40-character hex hash keys differ per account and must be resolved to labels via the Fields API before any transformation.
Records Without Identifiers
Organizations without domains and People without emails cannot benefit from Attio's native deduplication or enrichment.
Former-Employee Emails
Historical correspondence from departed staff will not resurface through Attio's inbox sync and must be explicitly extracted and imported as Notes.
Tools used in this playbook
All free, all run entirely in your browser — nothing is uploaded.
FAQ
Can I use Import2 to migrate from Pipedrive to Attio without losing existing data?
No. Import2 creates new records but cannot update attributes on records that already exist in Attio. If your team has connected email inboxes (which auto-creates People and Company records), you must delete all existing records before running Import2. For teams that can't lose inbox-synced data, an API-based migration using Attio's Assert (upsert) endpoint is the correct approach.
What are the API rate limits for Pipedrive and Attio during migration?
Pipedrive uses a token-based system: 30,000 base tokens × plan multiplier × seats per day, with burst limits on a rolling 2-second window (80 requests/2s on Lite up to 480 on Ultimate). The Search API is stricter at 10 requests per 2 seconds. Attio allows 100 read requests/second and 25 write requests/second, with score-based limits on complex list queries.
How do Pipedrive Deals map to Attio Deals?
Pipedrive Deals map to Attio's Deals object, but Attio Deals have no default unique attribute. You must create a custom attribute (e.g., pipedrive_deal_id) with a unique constraint before using the Assert API. Pipeline stages map to Attio's status attribute — pre-create matching stage options and build a stage-name mapping in your transformation layer.
What happens to email history from former employees during migration?
Attio pulls in email history when active users connect their inboxes, so current employees' correspondence backfills automatically. Emails from employees who have left the company and disconnected their inbox won't resurface through sync. That interaction history must be explicitly extracted from Pipedrive's API and imported into Attio as Notes.
How long does a Pipedrive to Attio migration take?
It depends on the method and dataset size. A small Import2 migration (<5K records) can finish in a day. An API-based migration of 20K+ records with custom fields, activities, and relationship mapping typically takes 40-80 engineering hours for a custom build, or 2-5 days with a managed service.