Failure PatternDecision layer

The Fan-Out Illusion: Why Webhook Automation Stalls When One Endpoint Serves Every Client

Symptom: A single shared endpoint handles events for several client accounts, and a destination change for one account requires a redeploy that risks every other account. Root cause: Fan-out logic is written per integration rather than per client, so routing rules, retry policy, and destination credentials live in the same code path and cannot be changed independently.

By InnovaAI ResearchPublished Updated

How do you recognize it?
  • •A single shared endpoint handles events for several client accounts, and a destination change for one account requires a redeploy that risks every other account
  • •Duplicate deliveries appear in Slack or Telegram channels after a retry cycle, and nobody can say which attempt was the original
  • •Client-facing dashboards show activity while the downstream CRM or ticketing system is missing records from the same window
  • •Onboarding a new client means copying an existing routing config by hand, so the new account inherits another client's destination list
  • •Nobody on the delivery team can answer how many events were received versus delivered for a given client last month
Why does it happen?
  • •Fan-out logic is written per integration rather than per client, so routing rules, retry policy, and destination credentials live in the same code path and cannot be changed independently
  • •Deduplication keys are optional and inconsistently applied, which means retries that should be idempotent create second copies of the same event downstream
  • •Event volume is treated as a monitoring problem rather than a contract problem, so no per-client delivery record exists to reconcile against when a client disputes a missed notification
  • •The endpoint is treated as plumbing that needs no owner, leaving no one accountable for destination drift when a client swaps tools mid-retainer
How do you fix it?
  • •Assign every client a unique inbound path or signing secret so routing changes for one account cannot touch another account's destinations
  • •Require a deduplication key on every event that triggers a downstream write, and reject payloads that arrive without one
  • •Build a daily reconciliation count per client: events received, events delivered, events failed after final retry, published somewhere the client can see
  • •Freeze new destination additions for one week and document the current routing map, including which client owns which channel and credential