Skip to content
Docs menu

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's amountCents is 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/activities with a type field.
  • Pagination. HubSpot uses after cursors with a paging envelope. ContactFollowUp uses limit/offset on most endpoints and inline nextCursor on the high-volume ones.

Endpoint map

Contacts

HubSpotContactFollowUpNotes
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

HubSpotContactFollowUpNotes
POST/crm/v3/objects/companies
POST/api/companies
GET/crm/v3/objects/companies
GET/api/companies

Deals

HubSpotContactFollowUpNotes
POST/crm/v3/objects/deals
POST/api/deals
dealstagestage; amountamountCents (integer cents).
GET/crm/v3/objects/deals
GET/api/deals

Tickets

HubSpotContactFollowUpNotes
POST/crm/v3/objects/tickets
POST/api/tickets
GET/crm/v3/objects/tickets
GET/api/tickets

Engagements / activities

HubSpotContactFollowUpNotes
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

HubSpotContactFollowUpNotes
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

HubSpotContactFollowUpNotes
POST/crm/v3/pipelines/{objectType}
POST/api/pipelines/v2
GET/crm/v3/pipelines/{objectType}
GET/api/pipelines/v2

Sequences (HubSpot Marketing Hub)

HubSpotContactFollowUpNotes
GET/automation/v3/sequences
GET/api/sequences
POST/automation/v3/sequences/enrollments
POST/api/sequences/enrollments

Forms

HubSpotContactFollowUpNotes
POST/marketing/v3/forms
POST/api/forms
GET/marketing/v3/forms
GET/api/forms

Meetings

HubSpotContactFollowUpNotes
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.