API & Webhooks

Why Webhook-Dependent Automations Keep Breaking and What Builders Are Replacing Them With

October 21, 2026
Why Webhook-Dependent Automations Keep Breaking and What Builders Are Replacing Them With

Webhook failures silently corrupt automations. A look at the patterns replacing them, polling, SSE, and reactive architectures, with real examples from GitHub incidents and zero-webhook payment processors.

Webhooks remain the default integration pattern for most automation platforms, yet they are the single most common cause of silent data loss in production workflows. When GitHub's webhook delivery failed for Issues and Webhooks in May 2026, the incident page showed no immediate alert to downstream consumers, only a status update after resolution. Any automation that relied on those webhooks to trigger n8n workflows, update CRM records, or fire AI agent tasks simply missed events with no retry signal and no visibility.

The problem is not that webhooks fail. It is that the failure modes, network partitions, receiver downtime, signature verification mismatches, rate limit rejections, are invisible to the sender and unrecoverable by the receiver without bespoke infrastructure. Builders who have moved past webhook-first architectures are adopting three patterns: deterministic polling with cursor-based pagination, server-sent events for long-lived connections, and reactive state synchronisation that treats the remote system as a read model rather than an event source.

The Failure Modes That Make Webhooks Unreliable

A webhook is a fire-and-forget HTTP POST. The sender does not know whether the receiver processed the payload, only whether the TCP connection succeeded. When the receiver returns 200 but the workflow engine crashes before persisting the event, the event is gone. When the receiver returns 500, the sender may retry, but retry logic varies wildly across platforms. GitHub retries for up to three days with exponential backoff. Stripe retries for 72 hours. Shopify retries for 48 hours. Some platforms retry indefinitely. Others give up after three attempts.

This inconsistency forces automation builders to implement idempotency keys, deduplication stores, and reconciliation cron jobs, essentially rebuilding the reliability guarantees that webhooks were supposed to provide. The GitHub incident illustrates the blind spot: the status page reported the incident as resolved, but any workflow that missed events during the outage had no programmatic way to discover the gap unless the builder had already implemented a separate reconciliation process.

Pattern One: Deterministic Polling with Cursors

Polling gets dismissed as inefficient, but cursor-based pagination over a stable sort order (created_at ascending, ID ascending) provides something webhooks cannot: a complete, ordered, replayable event log. The caller controls the pace, the retry logic, and the checkpoint. If the automation crashes, it resumes from the last cursor. If the API returns an error, the caller decides whether to back off, alert, or escalate.

This pattern works when the source API supports:

  • Stable sort order that never reorders historical records

  • Cursor or offset pagination with predictable limits

  • Filtering by updated_at or created_at windows

  • Rate limits that accommodate the polling frequency

n8n's HTTP Request node combined with a Set node to store the cursor in a workflow static data field or an external key-value store (Redis, Postgres, even a Google Sheet) implements this pattern without custom code. The trade-off is latency, events appear at the next poll interval rather than instantly, but for most business automations (lead enrichment, invoice sync, support ticket mirroring) a five-minute delay is acceptable in exchange for completeness.

Pattern Two: Server-Sent Events for Long-Lived Streams

Server-sent events (SSE) keep a single HTTP connection open and push newline-delimited JSON from server to client. Unlike WebSockets, SSE works over standard HTTP/1.1, passes through most corporate proxies, and reconnects automatically via the browser's EventSource API or a lightweight client library. The WordBattle project demonstrates this: its agent integration exposes an MCP server over JSON-RPC 2.0, but the human-facing game uses SSE to stream opponent moves and leaderboard updates without polling.

For automation builders, SSE shifts the reliability burden to the connection manager. The receiver must handle:

  • Automatic reconnection with last-event-id header to resume the stream

  • Heartbeat detection to spot silent connection death

  • Backpressure when the event rate exceeds processing capacity

When these are handled, SSE delivers ordered, at-least-once delivery with far simpler infrastructure than a webhook receiver farm. The source API must support SSE endpoints, many modern platforms do (GitHub's Events API, Stripe's CLI webhook forwarding uses SSE internally, Supabase Realtime, Vercel's Event Source).

Pattern Three: Reactive State Synchronisation

Flowglad, an open-source payment processor launched in late 2025, takes a different approach: it eliminates webhooks entirely. Instead of pushing events, it exposes a reactive client library that subscribes to feature flags, usage meters, and credit balances as local state. When a customer's subscription changes, the local state updates automatically. The automation reads the current state when it needs to make a decision, no event log, no replay, no missed webhook.

This pattern treats the remote system as a materialised view. The automation queries "what is the current state?" rather than "what happened?". It works when:

  • The source of truth is a single system that can be queried on demand

  • Decisions are made at well-defined points (checkout, feature gate, usage check)

  • Eventual consistency of seconds or minutes is acceptable

The trade-off is coupling: the automation must import the provider's client library or implement the same state machine. Flowglad mitigates this by schematising features and products as slugs defined by the integrator, so the automation only depends on the slug contract, not the provider's internal schema.

Comparing the Patterns

PatternLatencyCompleteness GuaranteeInfrastructure ComplexityBest ForWebhooksSub-secondNone (silent loss possible)High (receiver, queue, retry, dedup, reconciliation)Real-time UI updates, instant notificationsCursor PollingPoll interval (1, 30 min)Full (replayable from cursor)Low (scheduler, cursor store)ETL, sync, enrichment, reportingServer-Sent EventsSub-secondAt-least-once (with last-event-id)Medium (connection manager, reconnection logic)Dashboards, collaborative features, agent streamsReactive State SyncOn-read (local state)Eventual (depends on sync frequency)Low (client library, local cache)Feature gates, usage meters, entitlement checks

Choosing the Right Pattern for Your Automation

Most production automation stacks need more than one pattern. A typical agency stack might use:

  • Webhooks only for human-facing notifications (Slack alerts, email triggers) where occasional loss is tolerable

  • Cursor polling for CRM sync, invoice import, and lead enrichment where completeness is non-negotiable

  • SSE for real-time dashboards that show workflow execution status to clients

  • Reactive state sync for feature flags and usage limits that gate AI agent capabilities

The key decision criterion is not latency, it is the cost of a missed event. If a missed webhook means a customer loses access to a paid feature, webhooks are the wrong choice. If a missed webhook means a dashboard shows stale data for five minutes, webhooks are fine.

Implementing Cursor Polling in n8n

n8n's workflow static data makes cursor polling straightforward without external storage:

  1. Add an HTTP Request node configured for the source API's list endpoint with query parameters for cursor and limit

  2. Add a Set node that writes the last item's cursor field to workflow static data (use the "Keep Only Set" option)

  3. Add an IF node that checks whether the response array is empty, if empty, stop; if not, continue

  4. Add a Loop Over Items node to process each record

  5. Schedule the workflow on a cron trigger (every 5 minutes, hourly, daily)

For resilience, wrap the HTTP Request in an Error Trigger workflow that alerts on non-retryable errors (401, 403, 404) and lets retryable errors (429, 5xx) bubble to n8n's built-in retry policy.

What This Means for Marketplace Buyers

When evaluating automation templates on AutoStack, check the trigger mechanism. A template that uses only webhook triggers for critical data flows will inherit the source platform's webhook reliability. Templates that implement polling fallbacks or reconciliation schedules are more durable. Ask the creator:

  • Does this template handle missed webhooks? How?

  • Is there a reconciliation workflow included?

  • Can I switch the trigger to polling without rewriting the downstream logic?

Creators who build webhook-only templates are not necessarily cutting corners, webhooks are the documented integration path for most platforms. But buyers who run revenue-critical automations should plan for the failure modes that the documentation does not emphasise.

Summary

Webhooks are convenient but fragile. The GitHub incident of May 2026 is a reminder that even well-engineered platforms lose webhook deliveries without notifying consumers. Builders who need completeness are moving to cursor-based polling for batch sync, SSE for real-time streams, and reactive state synchronisation for decision-time reads. The automation that survives is the one that assumes the event stream will break and designs for recovery before the first event arrives.