How virtual webhook retry and recovery works

Updated:


September 16, 2026

Virtual webhooks give you a consistent event stream on supported integrations, even when an integration does not offer native webhooks. This page describes recovery for virtual webhooks. Native webhooks get 3 immediate delivery retries and no extended backoff, then the webhook is marked unhealthy; see How to troubleshoot unhealthy webhooks. Behind that experience is a recovery system that treats reading from the integration and delivering to your endpoint as two separate concerns, so a temporary problem on one side does not burn the retry budget of the other.

This guide explains how that recovery works at a high level, what you can expect when something fails, and how health monitoring fits in.

If you are new to virtual webhooks, start with Understanding virtual webhooks. For diagnosing an unhealthy webhook, see How to troubleshoot unhealthy webhooks.

Two sides of every virtual webhook

Every virtual webhook cycle has two stages:

  1. Read: Unified checks the connected integration for new or updated data (according to your subscription and interval).
  2. Dispatch: When there is something to send, Unified POSTs that data to your hook_url.

Failures can happen in either stage: the integration may be slow, rate-limited, or briefly unavailable; your endpoint may time out, return an error, or be down for a deploy. Unified recovers each stage independently so integration instability and your endpoint's availability do not share a single retry budget.

When your endpoint is unavailable (dispatch recovery)

Delivery only succeeds when your server acknowledges the POST, typically with a 2xx response.

If your endpoint is unreachable or returns an error:

  1. Short immediate retries: Unified retries the same delivery up to 3 times right away, 1 second apart, to ride out blips (cold starts, brief network glitches).
  2. Progressive backoff: If those attempts still fail, Unified backs off progressively, spacing later retries further apart. A backoff retry re-reads the same page from the integration rather than resending a stored payload; no customer records are held in a delivery queue. The read position only advances after a successful delivery.
  3. Sustained recovery window: For consecutive failures, that schedule can continue for an extended recovery window, currently up to roughly two weeks, so longer outages (maintenance windows, weekend incidents) still have a chance to recover automatically. A successful delivery resets the retry schedule; the next failure starts recovery from the beginning again.
  4. Health signal: If delivery cannot succeed across that consecutive-failure window, the webhook is marked unhealthy (is_healthy: false) and scheduling stops until you fix the endpoint or the connection's auth, then recreate the webhook.

You do not need to implement your own delivery retry loop for virtual webhooks. Respond quickly with success when you have accepted the payload; Unified handles delivery retries.

When the integration is unavailable or rate-limited (read recovery)

Reading from the integration can also fail: transient API errors, auth refresh races, or rate limits.

In those cases Unified:

  • Backs off with the same progressive delay pattern used for delivery recovery, instead of hammering the integration. As with dispatch, consecutive failures escalate the wait; a successful read resets the schedule.
  • Honours rate-limit guidance from the integration when it is present (for example a retry-after hint), and still escalates delays if pressure continues, so a short 'try again soon' hint cannot pin the system into a tight retry loop.
  • Keeps your delivery budget intact: read-side failures do not consume the dispatch retry budget for data that has already been fetched, and vice versa. Once your endpoint is healthy again, reading resumes from the last successfully delivered page. This independence applies while the webhook remains in recovery. If the subscription eventually transitions to is_healthy: false, further reading and dispatch stop until you recreate the webhook.

When the integration recovers, change detection resumes on your configured interval and new events are dispatched as usual.

Not every read failure enters that long recovery window. Some problems, typically broken authorization or missing permissions on the connection, are treated as non-retryable: Unified marks the webhook unhealthy right away instead of backing off for days. That usually means fixing or recreating the connection (and then the webhook), not waiting for automatic recovery. See How to troubleshoot unhealthy webhooks for those cases.

Why separate read and dispatch recovery matters

Without separate recovery:

  • A long integration outage could exhaust retries and mark the webhook unhealthy even though your endpoint was fine the whole time.
  • A short customer outage could stop Unified from reading new data once the integration came back.

By isolating the two stages, a failure on one side does not use up the other side's retry budget. That isolation lets virtual webhooks recover from transient failures without coupling integration availability to endpoint availability.

What 'healthy' means in practice

SignalMeaning
is_healthy: trueThe subscription can continue operating or recovering. This does not necessarily mean the most recent read or dispatch succeeded; transient failures may still be retrying.
is_healthy: falseRetries were exhausted, or Unified hit a terminal / non-retryable failure (for example broken connection auth). Reading and dispatch stop; recreate the webhook after fixing the cause. See How to troubleshoot unhealthy webhooks.
is_paused: trueThe webhook or connection is paused by Unified's billing/plan controls. While paused, Unified does not read or dispatch.
Use the dashboard and the webhook's recent runs to see whether recent attempts succeeded. Details are covered in How to troubleshoot unhealthy webhooks.

Quiet periods

Virtual webhooks only POST when there is something to send. Between events, Unified continues to check on your interval.

What you should do on your side

  1. Acknowledge after you've accepted the payload: Return a success status (2xx) once you've safely accepted the work, and do heavy processing asynchronously when possible. After Unified receives that acknowledgment, it does not redeliver that same attempt. Retries only happen when Unified does not receive a successful acknowledgment (for example a timeout or non-success status). If your handler processes the body and then fails or times out before responding, you may see the same delivery again, so design for that edge case.
  2. Keep your URL stable and reachable: TLS, DNS, and firewall rules that reject Unified's POSTs look like delivery failures and enter the same retry path.
  3. Watch health: Alert on is_healthy flipping to false so you can fix the endpoint before customers notice stale data.

Summary

Virtual webhooks are not 'just polling.' They include a recovery layer that:

  • Retries dispatch to your endpoint with immediate retries, then progressive backoff for consecutive failures (currently up to about two weeks), resetting on the first success.
  • Retries reads from the integration with the same progressive backoff (also resetting on success), while respecting rate limits, except for non-retryable connection problems (for example broken auth), which mark the webhook unhealthy immediately.
  • Keeps those two retry paths independent, so one side's instability does not silently consume the other's chances.
  • Surfaces lasting or non-retryable failure through is_healthy. Once a webhook becomes unhealthy, Unified stops reading and dispatching until you recreate the webhook; there is no automatic resume from that state.

You get a single webhook API; Unified owns the hard parts of staying reliable when either side of the pipe has a bad day.

Share
All guidesWebhooksWebhook modelVirtual webhooksAdvertising Report Metrics by IntegrationATS to Vector DB: How to Power Talent Intelligence with Real-Time DataBuilding AI applications with Unified and LangbaseConcur & Concur (Company) — Connection GuideConfigure Greenhouse Native Candidate WebhooksConnect Amazon Seller Central to Unified.toConnecting BambooHR via OAuth 2Connecting Google Workspace Integrations with a Service AccountCorrect WelcomeKit Scopes for Jungle IntegrationCreating Ads using the Unified Ads APICreating Walmart Items via UnifiedEnd-Users, Integrations, and ConnectionsEnriching Unified Objects with Custom MetadataEnterprise-managed authorization (EMA) with a static keyEnterprise-managed authorization (EMA) with a workspace secretEnterprise-managed authorization (EMA) with Microsoft Entra IDExtended observability — pushing API logs to ClickHouseExtended observability — pushing API logs to Grafana / LokiExtended Observability - Pushing API Logs to your Datadog InstanceFacebook Messenger Webhook SetupFireflies Integration GuideGetting started with WorkableHandling Delegated vs. Application Scopes in Microsoft IntegrationsHiBob & Unified: connection and time off guideHow long are logs retainedHow to access employees and usersHow to add API support for the Create Activity in CrelateHow to Associate a Connection ID with Your End-UserHow to build a Candidate Assessment product withHow to build a candidate sourcing or job board app with Unified.toHow to build a Discord support bot with Unified.to and LangbaseHow to Build a Fintech Application with Unified's Payments APIHow to Build an E-Commerce Product Integration with UnifiedHow to build an invoicing system with Unified.toHow to build Enterprise Search using RAGHow to configure Bullhorn Redirect URI for creating a connectionHow to configure webhooks in HubSpotHow to configure webhooks in Thrive LearningHow to configure webhooks in Toast for UnifiedHow to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Cohere to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect LLMs to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Zoom and Zoom PhoneHow to create a Connection In Microsoft TeamsHow to create a token-based connection in HighlevelHow to Create a Unified.to Connection to HighLevelHow to Create a Xero Connection in Unified.toHow to create and configure webhooksHow to create Connection with HubspotHow to customize portal URLs for Stripe and GoCardlessHow to filter webhook eventsHow-to Get a Private Support Channel for Your Unified IntegrationHow to get help fromHow to get your 8x8 Connect API Key and Account ID: Step-by-step guideHow to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guideHow to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guideHow to get your Ashby API Key: Step-by-step guideHow to get your Brex API token: Step-by-step guideHow to get your Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password: Step-by-step guideHow to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guideHow to get your Crelate API key: Step-by-step guideHow to get your Dashlane API Key: Step-by-step guideHow to get your Deel Access Token: Step-by-step guideHow to get your Dialpad API Key: Step-by-step guideHow to get your Discord OAuth 2 credentials and bot tokenHow to get your ELMO client ID and client secret: Step-by-step guideHow to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guideHow to get your Greenhouse API Key and Job board token: Step-by-step guideHow to get your Helpscout API Key: Step-by-step guideHow to get your HiBob Service User ID and Service User Token: Step-by-step guideHow to get your HighLevel API Key and Location ID: Step-by-step guideHow to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)How to get your Humaans API Key: Step-by-step guideHow to get your iCIMS API Username, API Password and Customer ID: Step-by-step guideHow to get your JobDiva Client ID, Username/email and Password: Step-by-step guideHow to get your Jobvite API Key, API Key Secret and Email: Step-by-step guideHow to get your Lever API Key: Step-by-step guideHow to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guideHow to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guideHow to get your Microsoft Azure AD OAuth 2 credentialsHow to get your OAuth 2 credentials for GmailHow to get your OAuth 2 credentials for Microsoft Dynamics 365How to get your OAuth 2 credentials in PipeDriveHow to get your OpenAI API Key: Step-by-step guideHow to get your Paycom SID/Username and Token/Password: Step-by-step guideHow to get your PCRecruiter Username, Password, Database ID, App Key and App ID: Step-by-step guideHow to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guideHow to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guideHow to get your Shopify Admin API access token and Store ID: Step-by-step guideHow to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guideHow to get your Workable API Token and Subdomain: Step-by-step guideHow to get your yotpo APP Key / Store ID and Secret Key: Step-by-step guideHow to Handle Attachments in Invoice, Bill and Credit MemoHow to migrate or import your integrations into Unified.toHow to obtain your GitHub OAuth2 credentialsHow to Power Claude with Live Customer Data Using Unified MCPHow to receive assessment orders from an ATS with Unified.toHow to register a Google developer app and get OAuth 2 credentialsHow to register a Salesforce developer app and get OAuth 2 credentialsHow to register a Slack developer account and get OAuth 2 credentialsHow to Register a Workday Developer App and Get OAUTH2 CredentialsHow to Register a Workday Developer App and Get OAUTH2/ SOAP CredentialsHow to Register a ZendeskSell Developer App and Get OAUTH2 CredentialsHow to Register a Zoho Developer App and Get OAUTH2 CredentialsHow to Register an ADP Developer App and Get OAUTH2 CredentialsHow to Register an Atlassian Developer App and Get OAUTH2 CredentialsHow to Register your Facebook OAuth2 ApplicationHow to Register your Google Ads OAuth2 ApplicationHow to Register your MetaAds OAuth2 applicationHow To Request & Write Raw Integration DataHow to Retrieve Microsoft Dynamics 365 Business Central CredentialsHow to set up a custom API URL with a CNAMEHow to set up a HiBob marketplace installHow to Set Up a Microsoft Teams Bot with UnifiedHow to set up and configure NotionHow to set up Google Business Profile API access and get OAuth 2 credentialsHow to Set Up LinkedIn Webhooks with UnifiedHow to set up native webhooks for QuickBooks Online with UnifiedHow to set up Slack webhooks using event subscriptionsHow to set up Telegram (bot) with Unified.toHow to set up your scopes in HubSpotHow to setup a Freshbooks developer appHow to setup a TikTok Shop applicationHow to Setup AWS Assume Role for AWS Secret ManagerHow to setup Oracle JD EdwardsHow to Setup Quickbooks DesktopHow to setup Sage 100 with Unified.toHow to test webhooks in the Synthetic Data (Sandbox) environmentHow to troubleshoot unhealthy connectionsHow to troubleshoot unhealthy webhooksHow to use SCIM with the Unified APIHow to use the Passthrough APIHow to Use Unified.to's Generative AI API with OpenAI and ClaudeHow to use User Provisioning and Verification with UnifiedIntegration set-up guide for LeverManaging custom validation rules in SalesforceNetSuite Authentication Setup for UnifiedNotice of Deprecation of Fields and Objects (Nov 2025)Oracle HCM / Taleo OAuth Credentials GuideRetrieval-Augmented Generation (RAG)SalesForce (External Client Apps) on Multiple OrganizationsSAML Single-Sign-OnScaling MCP Tools with Anthropic's (& OpenAI's) Defer LoadingSet Environments for your Unified.to WorkspaceSetting up a Slack Bot Connection with Unified.toSetting up OAuth 2 Credentials for Greenhouse's APIsTrello Connection Guide in UnifiedUnderstanding OAuth2 Authorization flowsUnderstanding Response Time Headers in the Unified APIUnified Assessment API: Embed Assessments Inside ATS PlatformsUnified's MCP ServerUnified MCP Server with LangChain and LangGraphUnlock real-time data with virtual webhooksUse Unified to sign in your users into your applicationWorkable: Creating candidates and attaching them to jobsWorkday vs Workday Legacy — Why Unified.to Supports BothWorking with hierarchical tree data in Storage, Messaging, and KMS APIs
Are we missing anything? Let us know
Was this page helpful?