Install any skill in seconds. Free to start, no credit card required.
Get Started Free →jeremylongshore/hubspot-webhook-handlers
Build and harden HubSpot v3 webhook handlers that survive production: HMAC-SHA256 signature verification, Redis SET NX deduplication, async batch processing with immediate 200 ACK, dead-letter queuing for permanent failures, and event-ordering guards for property-change streams.
Passed 22 of 25 test cases with the skill, and 18 of 25 without it.
and 3 more in the full report
4 fixed18 passed either way3 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 4 test cases the skill fixed. Same model, same prompt, with and without the skill.
When a HubSpot webhook delivery arrives with a missing or invalid signature header, standard web frameworks often return HTTP 401 Unauthorized. What HTTP status code should our middleware return to signal signature rejection?
| Checked | Without skill | With skill |
|---|---|---|
| Returns HTTP status code 403 for signature rejection. | Missed | Passed |
The instructions your model reads when the skill loads.
Receive and process HubSpot webhook events reliably at production scale. This is not a walkthrough for getting your first event — it is the handler code your integration runs when HubSpot delivers 100 events in a single payload at 2am, when a misconfigured proxy silently strips your signature header, when a 3-day outage causes events to arrive in a burst after recovery, and when a rapid sequence of property updates arrives reversed because HubSpot sends in delivery order rather than chronological order.
The six production failures this skill prevents:
X-HubSpot-Signature-v3 allows any party to send spoofed webhook payloads to your endpoint. One misconfigured load balancer or proxy that strips the X-HubSpot-Signature-v3 header silently disables all security — your handler returns 200 to unauthenticated requests without knowing it.contact.propertyChange events in delivery order, not chronological order. A fast property update followed by a slow one can arrive reversed: your handler sees the newer value first, then overwrites it with the older value. Sequence guards on occurredAt are required.contact.propertyChange for lifecyclestage does not automatically deliver list-membership changes. Those require a separate subscription to the list-membership event type and a separate oauth scope or crm.lists.read scope on the app.HUBSPOT_CLIENT_SECRET environment variable set in your runtimecrm.lists.read scope granted to your appBuild in this order. Each section neutralizes one production failure mode.
HubSpot v3 signatures use HMAC-SHA256 over the concatenation of your client secret, HTTP method, full request URI (including query string), raw request body, and the timestamp from X-HubSpot-Request-Timestamp. You must compute this over the raw body bytes, not a parsed JSON string. Any body middleware that re-serializes JSON will produce a signature mismatch.
The full algorithm:
HMAC-SHA256(
clientSecret,
httpMethod + requestUri + rawBody + timestamp
)
test cases passed, vs 18 / 25 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.