Before You Begin
HubSpot API Calls Made by Chert
Each integration surface consumes a known number of HubSpot API calls.
A typical operator who opens 50 contact records, sends from 10 of
them, and receives 10 replies consumes roughly 80 HubSpot API calls
per day.
Chert Send Capacity
When the daily cap is reached, the workflow action returns
ok = false with error = "daily cap reached". The sidebar card
returns the same shape and renders an inline notice. The contact
creation webhook logs the event with status failed and skips the
send.
Every HubSpot-facing failure body now also carries a numeric code,
a generic human message, a retryable boolean, and a trace_id
alongside ok: false / error. The numeric code follows the shared
Messaging API error scheme. All of these routes return
HTTP 200 for logical failures — see Retry Semantics below.
Retry Semantics
From HubSpot to Chert
All four HubSpot-facing routes return HTTP200 for every logical
failure — including signature verification failures — so HubSpot’s
retry-on-non-2xx behavior never fires on a per-event error. The failure
is signalled in the body (ok: false with code / message /
retryable / trace_id, or outputFields.ok: false for the workflow
action). Branch on the body, not the HTTP status.
From Chert to HubSpot
Inside the Chert pipeline
Idempotency
A response carrying
duplicate: true is a successful outcome and
should be treated identically to duplicate: false by downstream
workflow branches.
Sandbox versus Production
HubSpot’s developer sandbox accounts are first-class for this integration. The same install flow, scopes, and signature scheme apply. Differences to plan for:
Chert provisions a separate tenant per HubSpot account regardless of
sandbox or production status. A sandbox install does not consume a
production install slot.
See Also
- Architecture — where each limit applies in the call graph.
- Configuration — daily cap and sending window settings.
- Security — what is logged for retried events.

