Vol. IV · No. 04 Monday · 29 June 2026
Now writing — Why Your Index Scan Is Slower Than a Sequential Scan: When the Planner Is Right to Ignore Your Index dispatches · 3 streams
← All dispatches
api-design Dispatch 7 min read · 30 May 2026

Designing API Webhook Subscription Discovery: How Customers Find What Events to Subscribe To

Most webhook documentation lists available events somewhere in a markdown page and expects customers to find them. The customers who do find them often pick the wrong ones because the names do not describe what the event actually means at the business level. Better subscription discovery is one

api-design · Curiosity

Most webhook documentation lists available events somewhere in a markdown page and expects customers to find them. The customers who do find them often pick the wrong ones because the names do not describe what the event actually means at the business level. The customers who do not find them call support to ask whether a particular notification can be received via webhook, and the answer is sometimes yes-but-under-a-different-name and sometimes no-but-here-is-a-workaround. Better subscription discovery is one of the highest-leverage investments in webhook product design and is consistently underprioritized because the value is invisible in any single customer interaction.

What customers actually need from discovery

The customer entering a webhook integration has a specific business outcome in mind. They want to know when an invoice is paid, when a monitor fails, when a feature flag changes, when a request arrives. The event taxonomy of the webhook provider is incidental to that outcome; the customer reasons about business events and translates to provider events as a secondary step.

The translation is the gap. A customer thinking about invoice payment has to find the event names that correspond to payment in the provider's taxonomy. The names might be invoice.paid or charge.succeeded or payment_intent.succeeded or some combination, each with subtly different semantics. The provider knows the difference because they designed the taxonomy. The customer learns the difference through experimentation, support tickets, or worse, production bugs that are caught after the integration ships.

Three things help close the gap. The first is a discovery surface organized around customer intent rather than provider taxonomy: "notify me when..." starting points that map to the underlying event names. The second is descriptive documentation per event that explains the business meaning, not just the schema. The third is sample payloads that customers can read to understand what data is delivered and what is not.

The catalog organization question

The dominant pattern in webhook documentation is alphabetical or hierarchical organization by resource name. The customer scrolls through invoice.* and charge.* and payment_intent.* events looking for the ones that match their need. The organization is easy to maintain and matches the provider's mental model.

The alternative is task-organized discovery. The documentation has sections like "be notified when a customer pays" or "be notified when a delivery fails" with the relevant events called out and contextualized. The organization is harder to maintain because it requires understanding customer use cases, but the cognitive load on the customer is substantially lower.

The hybrid pattern that most large providers settle into is task-organized starting points with a complete reference at the bottom. The customer enters via the use-case page that matches their intent and finds the relevant events. The customer who needs a less-common event falls back to the alphabetical reference. The duplication between the two organizations is real but the discovery improvement justifies it.

Event naming as discovery surface

Event names are the most-read piece of webhook documentation because they appear in subscription dashboards and in every payload. The names earn back any investment in clarity many times over because customers see them constantly.

The convention that has converged across most providers is resource.verb in past tense: invoice.paid, monitor.failed, flag.updated, request.received. The dotted-namespace structure supports prefix-matching for subscription filters and groups related events visually. The past-tense verb signals that the event reports a completed state change rather than a state.

The traps are synonyms and overlapping definitions. invoice.completed and invoice.paid might mean the same thing or might mean different things, and customers cannot tell from the names alone. The discipline is to consolidate synonyms during API design rather than ship duplicates, and to document the distinction explicitly when two similar-sounding events actually mean different things.

The per-event documentation page

The per-event documentation page is the unit of discovery that customers spend the most time on once they have found a candidate event. The page should answer five questions: what business event triggers this, what data is in the payload, what edge cases exist, how does this interact with other events, and what is a complete code example showing how to handle it.

The business-event question is the most important and most frequently glossed. invoice.paid sounds self-explanatory but the payload might fire on first payment of a multi-installment invoice, on partial payment, on payment received via a method that has not yet settled, or only on confirmed payment. The exact triggering condition is what the customer needs to know and is what causes the most production bugs when it is wrong.

The payload-data question is straightforward but worth being explicit about. The page should show a complete sample payload with annotations explaining each field. The annotations distinguish required fields from optional, identifiers from values, snapshot data from references. The customer can copy the sample into their integration and verify the parser produces the expected shape.

The edge-cases question is the one most providers under-document. invoice.paid might or might not fire when a payment is retried after a previous failure. The deduplication semantics, the retry semantics, the ordering semantics, and the failure recovery semantics all belong in the per-event documentation because customers cannot infer them from the schema.

The sample payload as discovery tool

The sample payload is one of the most-used parts of webhook documentation and is consistently treated as an afterthought. Customers copy sample payloads into tests, into their parsing code, and into discussions with their internal teams about what data they will need to extract.

The discipline is to produce sample payloads that exercise the realistic distribution of values rather than the simplest possible case. A sample invoice.paid payload should show an invoice with multiple line items, with taxes, with discounts, with a billing address, with metadata fields populated. The realistic sample helps customers find the bugs that their parser has against edge cases before those edge cases appear in production.

The complementary discipline is to produce multiple sample payloads representing different paths through the same event. A monitor.failed payload should have samples for HTTP timeout, for HTTP error response, for DNS failure, for connection refused. The samples document the variation in payload shape that the same event type can produce.

The interactive discovery surface

The interactive discovery surface is the part of the dashboard that lets customers explore events without writing integration code. The minimum useful surface is a "send test event" button per event type that delivers a sample payload to a configured URL. The customer can verify their receiver works against a known good payload before integrating with real production events.

The expanded surface includes an event browser that shows recent real events on the customer's account, lets the customer click into individual events to see the full payload, and lets the customer replay specific events to their endpoints. The browser is where customers debug receiver issues, validate integrations against actual data, and recover from missed events.

The further expanded surface includes a subscription wizard that walks customers through choosing event types based on their intent. The wizard is the task-organized discovery surface implemented in the dashboard rather than only in documentation. The cost is substantially higher than per-page documentation but the customer-success benefit is larger.

The deprecation discoverability question

Deprecated events are a discovery problem most providers handle poorly. The event is no longer in the active taxonomy but customers who built integrations against it years ago still receive it. New customers searching the documentation should not find it; existing customers needing to debug their integration should find clear migration documentation.

The pattern that works is a separate deprecated events section in the documentation, visible only when filtering is enabled or when the customer follows a deep link from an old subscription. The migration path is documented per-event with the replacement event identified and the schema differences enumerated. The sunset date is prominent.

The trap is treating deprecation as invisible work that does not affect discovery. Customers continue subscribing to deprecated events when they appear in the active catalog. Removing them from the active catalog without breaking existing subscriptions requires the two-track documentation approach plus explicit dashboard warnings on existing subscriptions to deprecated events.

The OpenAPI question

Modern API providers maintain OpenAPI specifications that document REST endpoints with schemas, examples, and metadata. The webhook event taxonomy is conspicuously absent from most OpenAPI documents because the spec was designed for request-response APIs.

The OpenAPI 3.1 webhook extension added formal support for documenting webhook events, including event names, payload schemas, and metadata. The extension is underused because most providers had built their webhook documentation systems before the extension existed. The migration to OpenAPI 3.1 webhooks improves machine-readable discovery and supports tools like Postman and OpenAPI generators to produce webhook handlers from the spec.

The cost is the duplication during the migration window. The legacy documentation cannot disappear immediately because customers reference it. The new OpenAPI documentation must reproduce the same content with the same fidelity. The discipline is to single-source the documentation from the OpenAPI spec and generate the human-readable documentation from it, which is a substantial engineering investment but pays back in long-term consistency.

Three patterns that fail

The first pattern that fails is documentation hidden behind a contact-sales surface for enterprise events. The customer cannot evaluate whether the events meet their needs without going through a sales process, which selects against self-serve integration adoption. The right pattern is to publish all event documentation publicly with pricing tier annotations where relevant.

The second pattern that fails is documentation that does not match production behavior. The discrepancy is usually small (a field renamed, a value type changed) but is the source of the highest-frustration support tickets because the customer reasonably believes the documentation. The discipline is to generate the documentation from the same source as the implementation, which prevents the discrepancy from ever appearing.

The third pattern that fails is treating discovery as a one-time investment. The event taxonomy grows over the lifetime of the API. New events appear, old events deprecate, payload schemas evolve. The documentation must evolve in lockstep. The maintenance discipline matters more than the initial implementation quality because the documentation degrades over years without ongoing investment.

Our use across the four products

Our four products use task-organized starting points with alphabetical reference at the bottom across their webhook documentation, with per-event pages that document business event meaning, payload structure, edge cases, and complete code examples in three languages. The dashboard surface includes send-test-event buttons for every event type plus an event browser for recent real events. The structure converged from initial alphabetical-only discovery after customer support load revealed the task-organized improvement was high-leverage.

The deeper observation is that webhook subscription discovery is a product surface that compounds value over the lifetime of the API. The initial integration is a small part of the customer relationship; the years of subsequent integration work as the customer's needs evolve are where good discovery pays off. The investment in discovery is invisible in any single customer interaction and visible in the aggregate retention and expansion metrics that reflect customers who can find what they need without escalating to support.


Our products: DocuMint (PDF invoice generation API), CronPing (cron job monitoring with status pages), FlagBit (feature flags API for modern teams), and WebhookVault (webhook capture and replay) put these patterns into production.

Written by

Vera

Engineering researcher. APIs, databases, infrastructure, systems design.

More from Vera →