CRM migration relay

    Lumenbase Portage

    Move CRM data with a guided scan, preview, background import, and rollback.

    One-click rollback is built in.

    • Read-only access to your CRM
    • Preview before anything imports
    • Runs in the background, resumes if interrupted

    See your move before you commit

    Estimate the time and check what comes over. The source stays read-only, and you can roll back the import.

    Estimate your move

    Enter rough record counts. Times are estimates.

    ≈ 25 minfor 6,300 records
    • Pipelines & stages
    • Companies / accounts
    • Contacts, linked to their companies
    • More data types and one-click rollback.
    Migrate from Pipedrive

    Comes over from your CRM

    • Pipelines & stages
    • Companies / accounts
    • Contacts, linked to their companies
    • Deals with amount, currency, stage, owner, and status
    • Notes & activities on the timeline
    • Owners mapped to your Lumenbase team members

    Supported migration origins

    Each origin connects in Integrations, then runs the same Portage engine in Data Hub. Entity types ported are listed per origin below.

    Pipedrive

    Connect with Pipedrive or paste an API token in Portage

    Entity types

    Pipelines · Stages · Organizations · Persons · Deals · Activities

    Attio

    API token (pasted in the Portage wizard)

    Entity types

    Companies · People · Deals · Notes

    Synthetic default pipeline/stage for deal structure.

    HubSpot

    Private app service key (pasted in the Portage wizard)

    Entity types

    Pipelines · Stages · Companies · Contacts · Deals · Notes

    Salesforce

    Connected App client credentials (pasted in the Portage wizard)

    Entity types

    Stages · Accounts · Contacts · Opportunities · Tasks

    Synthetic default pipeline; stages come from your Opportunity stage picklist.

    Five-step Portage process

    Identical wizard flow for every origin: scan, configure, preview, import, summary.

    1. 1

      Scan

      Read-only inventory of your source CRM. Counts per entity type, sample records, and connection validation before anything is written.

    2. 2

      Configure

      Choose entity types to import and map source users to Lumenbase workspace members. Dependency order is enforced automatically.

    3. 3

      Preview

      Review record counts, sprint vs slow-drip pacing for large orgs, field mappings, and warnings (unmapped owners, empty types, missing relationships).

    4. 4

      Import

      Server-side batch job with checkpointed progress. Continue in the background; track status from Data Hub or Import History.

    5. 5

      Summary & rollback

      Per-entity import results, immutable entity origins, and session rollback that removes imported records using provenance rows.

    Guided process

    One five-step wizard for every supported CRM in Data Hub.

    • Unified Portage wizard

      Open Lumenbase Portage in Data Hub, then connect your source CRM.

    • Dependency-ordered import

      Imports pipelines, stages, companies, contacts, deals, then activities so links resolve in one pass.

    • User owner mapping

      Map source CRM users to Lumenbase members; unmapped owners surface as preview warnings.

    • Entity type selection

      Import only what you need; skipped types never touch the target workspace.

    • Background batch jobs

      Track live progress by the summary bar and view the full log in Import History.

    • Sprint + slow drip

      Entity types over 10,000 records import in a paced second phase to protect API budgets and server limits.

    • Pause & cancel

      Pause an in-flight import or cancel a scan; sessions resume from saved checkpoints.

    Checks & validations

    Checks run before, during, and after each import.

    • Connection validation

      Each origin validates credentials before scan (OAuth token, Attio API token, HubSpot service key).

    • Workspace membership

      Only members of the workspace can start or continue a migration session.

    • Active session guard

      One active Portage session per workspace per origin; prevents overlapping imports for the same CRM.

    • Preview warnings

      Unmapped users, zero-count entity types, and deals-without-companies relationship gaps.

    • Scan schema version

      Full pagination counts with no estimates from partial pages.

    • Duplicate-safe resume

      import_record_changes keyed by session + source_system + source_id skips already-imported rows on continuation.

    • Provenance-or-rollback

      If provenance write fails after insert, the entity row is deleted so resume never creates silent duplicates.

    • Immutable entity origins

      Each imported record gets a migration origin tag (provider, session, external source id) for audit and lineage.

    Process robustness

    Built for large workspaces, API limits, and server timeouts.

    • Chunked self-reinvoke

      Scan and import edge functions checkpoint progress and re-invoke on wall-clock or early_drop shutdowns.

    • Adaptive chunk sizing

      Import batches shrink after a timeout and grow after successful runs.

    • Rate-limit awareness

      Pipedrive: token budget headers and automatic pause metadata. All origins: stale-detector respects pause flags.

    • Stalled job recovery

      Cron + UI resume restart failed batch jobs when the session is still scanning or importing with a saved checkpoint.

    • Session rollback

      Chunked rollback via execute-import-rollback removes provenance-tracked entities and clears the session.

    • Import invocation limits

      Migration edge functions cap self-reinvoke depth to prevent runaway loops.

    • Cancel propagation

      Cancelled sessions abort continuations and mark linked batch jobs cancelled.

    Audit & lineage

    Know what was imported, from where, and undo it if needed.

    • import_record_changes

      Every imported row logged with migration_session_id, source_system, source_id, and target record_id for rollback.

    • entity_origins

      First-origin certificate: origin_kind=migration, origin_system=provider, origin_run_id=session, external_source_id=source key.

    • Batch job operational log

      Scan and import milestones appended to batch_jobs metadata for support and recovery.

    • Per-provider batch job types

      Distinct job types (e.g. attio_migration_import) for monitoring and stale-detector rules.

    Entity catalog & field mapping

    Import order is fixed across all origins: Pipelines → Stages → Companies → Contacts → Deals → Activities. Below: Lumenbase entity, origin object labels, API references, provenance keys, and field mappings.

    1. Pipelines

    pipelines

    Deal pipeline definitions and ordering.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedrivePipelineGET /api/v2/pipelinespipelines
    • Name namename
    • Order order_nrposition
    AttioDefault pipeline (synthetic)Portage default. Attio deals use status instead of Pipedrive-style pipelinesSingle default pipeline created so Attio deals can attach to a stage.pipelines
    • Name defaultname → "Deals"
    HubSpotDeal pipelineGET /crm/v3/pipelines/dealspipelines
    • Label labelname
    • Display order displayOrderposition
    SalesforceDefault pipeline (synthetic)Portage default, since Salesforce structures deals with a stage picklist instead of pipeline objectsSingle pipeline created so Opportunity stages keep their order.pipelines
    • Name defaultname → "Salesforce pipeline"

    2. Pipeline stages

    pipeline_stages

    Stages within each pipeline; linked to parent pipeline.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedriveStageGET /api/v2/stagesLinks: pipeline_id → pipelinestages
    • Name namename
    • Order order_nrposition
    • Pipeline pipeline_idpipeline_id
    AttioDefault stage (synthetic)Portage default. Maps the Attio deal status ID when presentLinks: pipeline_source_id: defaultDeal stage links use Attio status id when available on the deal record.stages
    • Name default-openname → "Open"
    HubSpotPipeline stageGET /crm/v3/pipelines/deals (nested stages)Links: pipelineIdstages
    • Label labelname
    • Display order displayOrderposition
    • Pipeline pipelineIdpipeline_id
    SalesforceOpportunity stageSOQL: OpportunityStage (MasterLabel, SortOrder)Links: pipeline_source_id: defaultstages
    • Stage label MasterLabelname
    • Sort order SortOrderposition

    3. Companies

    companies

    Organizations / accounts.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedriveOrganizationGET /api/v2/organizationsorganizations
    • Name namename
    • Address addressaddress
    • Phone phonephone
    • Website websitewebsite
    • Owner owner_idcreated_by
    AttioCompanyPOST /v2/objects/companies/records/querycompanies
    • Name values.namename
    • Domain / website values.domainswebsite
    • Owner values.created_bycreated_by
    HubSpotCompanyGET /crm/v3/objects/companiescompanies
    • Name properties.namename
    • Website properties.website | domainwebsite
    • Phone properties.phonephone
    • Address properties.addressaddress
    • Owner properties.hubspot_owner_idcreated_by
    SalesforceAccountSOQL: Accountcompanies
    • Name Namename
    • Website Websitewebsite
    • Phone Phonephone
    • Billing address BillingStreet + BillingCity + …address
    • Owner OwnerIdcreated_by

    4. Contacts

    contacts

    People; optionally linked to a company.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedrivePersonGET /api/v2/personsLinks: organization_id / org_id → companypersons
    • First name first_namefirst_name
    • Last name last_namelast_name
    • Email emails[] / emailemail
    • Phone phones[] / phonephone
    • Company link organization_idcompany_id
    • Owner owner_idcreated_by
    AttioPersonPOST /v2/objects/people/records/queryLinks: values.company | primary_company → companypeople
    • First name values.first_name | namefirst_name
    • Last name values.last_name | namelast_name
    • Email values.email_addressesemail
    • Phone values.phone_numbersphone
    • Company link values.companycompany_id
    • Owner values.created_bycreated_by
    HubSpotContactGET /crm/v3/objects/contactsLinks: properties.associatedcompanyid → companycontacts
    • First name properties.firstnamefirst_name
    • Last name properties.lastnamelast_name
    • Email properties.emailemail
    • Phone properties.phone | mobilephonephone
    • Company link properties.associatedcompanyidcompany_id
    • Owner properties.hubspot_owner_idcreated_by
    SalesforceContactSOQL: ContactLinks: AccountId → companycontacts
    • First name FirstNamefirst_name
    • Last name LastNamelast_name
    • Email Emailemail
    • Phone Phone | MobilePhonephone
    • Company link AccountIdcompany_id
    • Owner OwnerIdcreated_by

    5. Deals

    deals

    Opportunities linked to company, contact, pipeline, and stage when available.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedriveDealGET /api/v2/dealsLinks: org_id, person_id, pipeline_id, stage_iddeals
    • Title titletitle
    • Amount valueamount
    • Currency currencycurrency
    • Status statusstatus
    • Expected close expected_close_dateexpected_close_date
    • Owner owner_idcreated_by
    AttioDealPOST /v2/objects/deals/records/queryLinks: company, person, stage (status id)deals
    • Title values.nametitle
    • Amount values.valueamount
    • Currency values.value.currency_codecurrency
    • Stage link values.stage.status.idstage_id
    • Owner values.created_bycreated_by
    HubSpotDealGET /crm/v3/objects/dealsLinks: associatedcompanyid, associatedcontactids, pipeline, dealstagedeals
    • Name properties.dealnametitle
    • Amount properties.amountamount
    • Currency properties.deal_currency_codecurrency
    • Close date properties.closedateexpected_close_date
    • Stage properties.dealstagestage_id
    • Pipeline properties.pipelinepipeline_id
    • Owner properties.hubspot_owner_idcreated_by
    SalesforceOpportunitySOQL: Opportunity (+ primary OpportunityContactRole)Links: AccountId, primary OpportunityContactRole, StageNamedeals
    • Name Nametitle
    • Amount Amountamount
    • Close date CloseDateexpected_close_date
    • Stage StageNamestage_id
    • Won / lost IsWon / IsClosedstatusOpen opportunities stay open; closed ones map to won or lost.
    • Owner OwnerIdcreated_by

    6. Activities

    activities

    Timeline activities (notes and typed activities) linked to company, contact, or deal.

    OriginObject labelAPI / sourceProvenance keyField mapping
    PipedriveActivityGET /api/v2/activitiesLinks: org_id, person_id, deal_idactivities
    • Type typetypeMapped to Lumenbase activity enum (call, email, meeting, task, note, …)
    • Subject subjecttitle
    • When due_date / due_time / add_timeoccurred_at
    • Body notedescription
    • Owner owner_idcreated_by
    AttioNoteGET /v2/notesLinks: parent_object + parent_record_idnotes
    • Title titletitle
    • Body content_plaintextdescription
    • When created_atoccurred_at
    • Type (fixed)type → note
    HubSpotNoteGET /crm/v3/objects/notesLinks: associations: contacts, companies, dealsnotes
    • Body properties.hs_note_bodydescription
    • When properties.hs_timestampoccurred_at
    • Owner properties.hubspot_owner_idcreated_by
    • Type (fixed)type → note
    SalesforceTaskSOQL: TaskLinks: WhoId → contact, WhatId → company or dealtasks
    • Type TaskSubtypetypeCalls and emails keep their type; everything else lands as task.
    • Subject Subjecttitle
    • Body Descriptiondescription
    • When ActivityDate | CreatedDateoccurred_at
    • Owner OwnerIdcreated_by

    Sign up, connect your CRM in Integrations, then run Lumenbase Portage from Data Hub, one wizard for every origin.

    Try the full workspace free for 14 days. No credit card required.