Move your CRM to Lumenbase
Scan your old CRM, preview every record, then import in the background. Change your mind? Roll back in one click.
- Read-only access to your CRM
- Preview before anything imports
- One-click rollback
Where are you coming from?
See your move before you commit
Estimate your move
- Pipelines & stages
- Organizations, as companies
- People, linked to their organizations
- More data types and one-click rollback.
Comes over from your CRM
- Pipelines & stages
- Companies / accounts
- Contacts, linked to their companies
- Deals with amount, currency, stage, owner, and status
- Notes or activities on the timeline (varies by CRM)
- Owners mapped to your Lumenbase team members
How it works
Scan
Portage reads your old CRM and counts what is there. Nothing is written yet.
Choose
Pick what to bring over and match your old users to your new team.
Preview
Check counts, field mappings and warnings before a single record lands.
Import
The import runs in the background. Close the tab and keep working.
Review or roll back
See what came over. Not happy? Remove the imported records in one click.
Built to be safe to try
Read-only access to your CRM
Portage only reads from your CRM. Nothing in your source CRM is changed, moved, or deleted at any point in the migration.
One-click rollback
Not happy with the result? Roll the migration back in one click and every record it created is removed. Records you edited after the import, or that were merged into records you already had, are kept.
Preview before anything imports
A preview shows exact record counts, field mappings, and warnings (unmapped owners, missing links) before a single record is written.
Runs in the background, resumes if interrupted
Large workspaces move over gradually and pick up where they left off if interrupted. Your team keeps working in both tools while it runs.
Credentials stay encrypted
Your API key for your CRM is stored encrypted in this workspace's vault. Disconnect it anytime.
Migrate in passes without duplicates
Run Portage again whenever you like; already-imported records are detected and skipped, so re-runs never create duplicates.
Field-by-field mapping
Exactly which source field lands where. Open a record type to see it.
| Lumenbase field | ||||
|---|---|---|---|---|
| Name | name | Always "Deals" | label | Always "Salesforce pipeline" |
| Order | order_nr | Not imported | displayOrder | Not imported |
- Attio: Single default pipeline created so Attio deals can attach to a stage.
- Salesforce: Single pipeline created so Opportunity stages keep their order.
| Lumenbase field | ||||
|---|---|---|---|---|
| Name | name | title | label | MasterLabel |
| Order | order_nr | display_order | displayOrder | SortOrder |
| Pipeline | pipeline_id | Not imported | pipelineId | Not imported |
- Attio: Archived stages are skipped. With no stages set up in Attio, deals land in one "Open" stage.
| Lumenbase field | ||||
|---|---|---|---|---|
| Name | name | values.name | properties.name | Name |
| Address | address | Not imported | properties.address | BillingStreet + BillingCity + … |
| Phone | phone | Not imported | properties.phone | Phone |
| Website | website | values.domains | properties.website | domain | Website |
| Owner | owner_id | values.created_by | properties.hubspot_owner_id | OwnerId |
| Lumenbase field | ||||
|---|---|---|---|---|
| First name | first_name | values.first_name | name | properties.firstname | FirstName |
| Last name | last_name | values.last_name | name | properties.lastname | LastName |
emails[] / email | values.email_addresses | properties.email | Email | |
| Phone | phones[] / phone | values.phone_numbers | properties.phone | mobilephone | Phone | MobilePhone |
| Company | organization_id | values.company | properties.associatedcompanyid | AccountId |
| Owner | owner_id | values.created_by | properties.hubspot_owner_id | OwnerId |
| Lumenbase field | ||||
|---|---|---|---|---|
| Title | title | values.name | properties.dealname | Name |
| Amount | value | values.value | properties.amount | Amount |
| Currency | currency | values.value.currency_code | properties.deal_currency_code | Not imported |
| Status | status | Not imported | Not imported | IsWon / IsClosedOpen opportunities stay open; closed ones map to won or lost. |
| Close date | expected_close_date | Not imported | properties.closedate | CloseDate |
| Owner | owner_id | values.created_by | properties.hubspot_owner_id | OwnerId |
| Stage | Not imported | values.stage.status.id | properties.dealstage | StageName |
| Pipeline | Not imported | Not imported | properties.pipeline | Not imported |
| Lumenbase field | ||||
|---|---|---|---|---|
| Activity type | typeMapped to Lumenbase activity enum (call, email, meeting, task, note, …) | Always note | Always note | TaskSubtypeCalls and emails keep their type; everything else lands as task. |
| Title | subject | title | Not imported | Subject |
| Date | due_date / due_time / add_time | created_at | properties.hs_timestamp | ActivityDate | CreatedDate |
| Body | note | content_plaintext | properties.hs_note_body | Description |
| Owner | owner_id | Not imported | properties.hubspot_owner_id | OwnerId |
Rather not do it yourself?
Messy data, an unusual setup, or no time for it. We can run the migration with you, free.
