Migrating from HubSpot
If you're coming from HubSpot's CRM v3 API, most of your code maps one-to-one. The conventions are different — but small.
What changes
- Auth. HubSpot OAuth or private app tokens. ContactFollowUp: service-account bearer tokens (
hns_…). Same shape — different prefix and lookup. - Field casing. HubSpot uses lowercase, snake-y keys (
firstname,lifecyclestage). ContactFollowUp uses camelCase (firstName,lifecycle). - Money. HubSpot's
amountis a decimal string. ContactFollowUp'samountCentsis an integer in cents — never floats. - Errors. HubSpot returns
{ status, message, correlationId }. ContactFollowUp returns{ error, issues? }. - Engagement objects. HubSpot has separate endpoints for notes / emails / calls / tasks. ContactFollowUp folds them into
/api/activitieswith atypefield. - Pagination. HubSpot uses
aftercursors with apagingenvelope. ContactFollowUp useslimit/offseton most endpoints and inlinenextCursoron the high-volume ones.
Endpoint map
Contacts
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/objects/contacts | POST /api/contacts | Use camelCase fields (firstName, not firstname). |
GET /crm/v3/objects/contacts | GET /api/contacts | Search via ?q= + ?lifecycle=. |
GET /crm/v3/objects/contacts/{id} | GET /api/contacts/{id} | — |
PATCH /crm/v3/objects/contacts/{id} | PATCH /api/contacts/{id} | — |
DELETE /crm/v3/objects/contacts/{id} | DELETE /api/contacts/{id} | ADMIN-only. Soft-deletes via PHI tombstone. |
Companies
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/objects/companies | POST /api/companies | — |
GET /crm/v3/objects/companies | GET /api/companies | — |
Deals
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/objects/deals | POST /api/deals | dealstage ➜ stage; amount ➜ amountCents (integer cents). |
GET /crm/v3/objects/deals | GET /api/deals | — |
Tickets
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/objects/tickets | POST /api/tickets | — |
GET /crm/v3/objects/tickets | GET /api/tickets | — |
Engagements / activities
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/objects/notes | POST /api/activities | ContactFollowUp folds notes / emails / calls / tasks into one object with type. |
POST /crm/v3/objects/emails | POST /api/activities | Pass type: EMAIL. |
POST /crm/v3/objects/calls | POST /api/activities | Pass type: CALL. |
POST /crm/v3/objects/tasks | POST /api/activities | Pass type: TASK. |
Lists & properties
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/lists | POST /api/lists | — |
GET /crm/v3/lists | GET /api/lists | — |
POST /crm/v3/properties/{objectType} | POST /api/properties | — |
GET /crm/v3/properties/{objectType} | GET /api/properties?objectType=… | — |
Pipelines
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /crm/v3/pipelines/{objectType} | POST /api/pipelines/v2 | — |
GET /crm/v3/pipelines/{objectType} | GET /api/pipelines/v2 | — |
Sequences (HubSpot Marketing Hub)
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
GET /automation/v3/sequences | GET /api/sequences | — |
POST /automation/v3/sequences/enrollments | POST /api/sequences/enrollments | — |
Forms
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
POST /marketing/v3/forms | POST /api/forms | — |
GET /marketing/v3/forms | GET /api/forms | — |
Meetings
| HubSpot | ContactFollowUp | Notes |
|---|---|---|
GET /scheduler/v3/meetings/meeting-links | GET /api/meetings | — |
GET /scheduler/v3/meetings | GET /api/meetings/bookings | — |
Bringing your data over
Export your HubSpot data as CSV from the in-app export tool. Then use ContactFollowUp's bulk import endpoints — see POST /api/contacts/import on the reference page — or sequence imports manually with a small script: chunk into 100-record batches and post each batch as a single transaction.