Our automated renewal workflow depends on webhooks from the Contract API to trigger downstream processes. We have a webhook subscription set up for contract.renewal events, but it stopped firing about two weeks ago. No changes were made to our webhook configuration or endpoint.
The webhook works fine for contract.created and contract.updated events, but specifically fails on renewal events. We’ve verified our endpoint is accessible and responding with 200 status codes for other webhook types.
This is blocking our entire renewal automation pipeline - we’re currently having to manually check for renewals daily which defeats the purpose of automation. Has anyone experienced webhook reliability issues with contract renewal events? We’re wondering if there’s a specific subscription configuration we’re missing or if there’s a workflow-based workaround we should implement instead.
I can provide a complete solution based on the recent changes to HubSpot’s webhook event model:
Webhook Event Support: HubSpot consolidated contract events in the HS-2022 release. The dedicated contract.renewal event was deprecated and merged into the contract.property_change event type. You need to update your webhook subscription to listen for property_change events instead of renewal events specifically.
Subscription Configuration: Here’s what you need to change:
- Update your webhook subscription to include ‘contract.property_change’ events
- In your webhook handler, filter for changes to these specific properties: ‘hs_renewal_date’, ‘hs_contract_renewal_status’, or ‘hs_renewal_amount’
- Add logic to identify renewal events by checking if the property change indicates a renewal action
Your handler should check if the incoming webhook payload contains property changes matching renewal indicators. When you detect a renewal-related property change, that’s your trigger to fire the downstream automation.
Workflow Workaround: As a more reliable alternative, implement a hybrid approach:
- Create a HubSpot workflow triggered by ‘Contract renewal date is less than 30 days from now’
- Add a workflow action to call your external webhook endpoint with contract details
- Set the workflow to re-enroll contracts when the renewal status changes
- This gives you a workflow-based trigger that’s independent of API webhook reliability
The workflow approach is actually preferable for critical automation because:
- Workflows have built-in retry logic
- You can add delays and conditional logic
- They’re not affected by API webhook delivery issues
- You get full audit logs in HubSpot
For maximum reliability, keep both systems running - use the property_change webhook as your primary trigger and the workflow as a backup that fires if the webhook doesn’t process within a certain timeframe. This redundancy ensures your renewal automation never misses a contract.
While you’re fixing the webhook issue, I’d strongly recommend setting up a workflow-based backup trigger. Create a workflow that monitors contracts approaching renewal date and triggers a custom webhook to your system. This way you have redundancy if the API webhooks fail again. Workflows are generally more reliable than API webhooks for critical business processes in HubSpot.
Good suggestions. I checked the webhook logs and found something interesting - the renewal events ARE being sent, but they’re coming through as contract.property_change events with a specific property flag, not as dedicated contract.renewal events. It looks like HubSpot changed how they handle renewal events in a recent update. Has anyone else noticed this change?
Check your webhook subscription settings in the HubSpot developer portal. Sometimes subscriptions get automatically disabled if they return too many errors or timeouts. Look for a red warning icon next to your contract renewal subscription. If it’s disabled, you’ll need to re-enable it and possibly update your endpoint URL.
That makes sense. HubSpot deprecated several specific event types in favor of more generic property change events. For renewals, you need to filter the contract.property_change events and look for changes to the renewal_date or renewal_status properties. It’s less elegant but gives you more flexibility. You’ll need to update your webhook handler to parse the property changes and identify renewal-specific updates.