externalId field is the link between your record identifier
and our customer record. Use it deliberately and create-or-update
from your CRM becomes a single API call.
The rule
- When a CRM event fires (created or updated), call
POST /v1/customerswith the sameexternalIdevery time. - We will create on first call, update on every subsequent call.
- No bookkeeping needed on your side.
Why not just call PATCH?
PATCH requires our customer id (UUID) or your externalId in the
path. If your CRM event fires before we know we have a record (race),
or if you’re rebuilding state, you’d have to handle “not found →
create”. POST with externalId handles both cases in one call.
Picking a good externalId
- Stable. Use the immutable id from your CRM, not the email (emails change).
- Scoped to your organisation. Two of your records cannot share an
externalId. Reusing an id is the upsert signal — make sure you mean it. - Reasonable length. Up to 255 characters; usual CRM ids fit comfortably.
Worked example
CRM webhook fires with the contact:- First call: returns
201 Createdwith our UUID. - Jane updates her phone in HubSpot → webhook re-fires → same call →
returns
200 OKwith the same UUID.
Email conflicts
If you try to send a record whereemail matches an existing
customer with a different externalId, we reject with 409 conflict:

