Skip to main content
Every request crossing the trust boundary is signed, every secret is stored encrypted at rest, and every scope is the minimum needed to make a feature work.
HubSpot trust boundary

Trust Boundary

The boundary runs along the OAuth grant. Revoking the grant in HubSpot — or disconnecting from the Chert console — is sufficient to end Chert’s access to the account.

OAuth Scopes

Each scope is the least-privilege scope that makes its feature work. Chert does not request scopes for deals, companies, tickets, custom objects, files, marketing email, ads, or social.

HubSpot Signature v3

Every webhook and every fetch from the sidebar UI extension carries HubSpot’s v3 signature. Chert verifies the signature before any database work and before parsing the request body. The request URI is URL-decoded before hashing and includes the full scheme, host, path, and query string.
The GET signature shape is a frequent source of integration bugs. HubSpot signs GETs without any body segment — a GET signature computed over ${method}${uri}${""}${timestamp} will always disagree.
The install flow uses a short-lived signed cookie to bind the OAuth state parameter to the originating Chert project. The callback rejects the request if the cookie is missing, the signature does not match, the embedded state does not match the URL state, or the timestamp is older than the TTL.

Token Storage

Refresh tokens rotate on every refresh — the helper persists the new value before returning. Stale refresh tokens are not retained. The Chert console never exposes access or refresh tokens in any UI or API response. The admin dashboard surfaces only the granted scopes, the token expiry, and the per-tenant counters.

Data Handling

Chert does not log full request or response bodies for HubSpot calls beyond the 500-character preview noted above. PII fields are redacted in error logs by server-side sanitization.

Sub-processors

The current sub-processor list is published at https://trychert.com/legal/sub-processors.

Incident Response

See Also

  • Install — scopes and consent flow.
  • Architecture — how the verified payload flows through the runtime.
  • Limits — rate limits and retry semantics.