Beyond Webhooks: Why Your Customers Will Outgrow HTTP-Only Delivery
The first webhook customer asks for a JSON POST. The fifteenth asks for an S3 dump. The fiftieth asks for BigQuery. What happens between is the story.
Webhooks are the universal first destination. Every customer's stack has a place to receive an HTTP POST. So you build webhooks first, and that takes you a long way. Then your customers start asking for other things, and the question becomes: do you build each new destination, or do you stop at webhooks?
The progression
The pattern is consistent across SaaS:
Year one: Customers want webhooks. You build a webhook sender. You explain "we have webhooks" in every enterprise sales conversation. It's enough.
Year two: A handful of customers ask for events delivered to their S3 bucket. They have a data lake. They don't want to write a webhook consumer to forward to S3 when you can just deliver to S3 directly. You build an S3 adapter. It takes a few weeks.
Year three: The data warehouse asks start. "Can you deliver to our BigQuery?" "Can you stream to our Snowflake?" Each one is a multi-week integration. You build BigQuery first because the most customers ask for it; Snowflake comes a quarter later.
Year four: Queue-based asks. "Can you publish to our Kafka topic?" "Our SQS queue?" Each is another adapter. The integrations team you didn't have now exists.
Year five: Database asks. Postgres, MySQL, ClickHouse. Less common than queues but more demanding, schema management, batching trade-offs, idempotency at the row level.
By year five, you've built a destinations platform whether you intended to or not. The question is whether you built it on purpose, or accidentally accumulated it.
Why the progression happens
Customers don't ask for "an outbound webhook." They ask for a result: "we want product events to land in our data warehouse." Webhooks are one way to deliver that result; direct warehouse delivery is another. Once a vendor offers the direct path, the webhook+forwarding pattern looks unnecessarily complex.
For the customer, every hop adds operational overhead: a webhook consumer to maintain, retries to handle, schema validation to apply, batching to implement before the warehouse load. If the vendor can skip the hop and deliver natively, the customer takes the offer.
For the vendor, supporting native destination types is harder than supporting webhooks. Each adapter has its own auth model, batching constraints, schema concerns, error handling. The complexity scales with N-destination-types, not linearly.
What changes per destination
Every destination type has at least these dimensions to think through:
-
Auth. Webhook: HMAC + URL. S3: IAM role or access key + bucket policy. BigQuery: service account JSON or Workload Identity Federation. Snowflake: key-pair + role + warehouse + database + schema. Kafka: SASL/PLAIN, SCRAM, mTLS. Postgres: password or RDS IAM.
-
Batching. Webhook: one event per request. S3: NDJSON batches with time-or-size flush. BigQuery: row-level streaming or load-job batching. Kafka: native producer batching. Postgres: multi-row INSERTs with transaction boundaries.
-
Schema. Webhook: opaque JSON. S3: NDJSON, customer reads the shape. BigQuery: schema-aware columns, schema migration on new event types. Snowflake: similar to BigQuery. ClickHouse: typed columns at table level.
-
Error semantics. Webhook: HTTP status codes. S3: AWS SDK errors. BigQuery: per-row errors in batch responses. Kafka: producer callbacks. Postgres: SQL errors.
-
Idempotency. Webhook: header-based. S3: object name. BigQuery: row dedup via streaming insert IDs. Kafka: idempotent producer. Postgres: ON CONFLICT DO NOTHING.
Each cell in the matrix needs an implementation. There are no shortcuts, each adapter is a distinct module that handles its destination type's reality.
The right call
You can build this matrix yourself, one adapter every few months, accumulating an integrations team along the way. Or you can use a platform that ships the matrix complete.
The right call depends on whether outbound delivery is your differentiator. For some products it is, the destinations themselves are part of why customers buy. For most B2B SaaS, outbound delivery is plumbing that the product needs but doesn't sell with. Building plumbing in-house is expensive; buying it is the rational call.
What a destinations platform looks like
The platform's job is to provide a consistent interface, one ingest API, one routing layer, one observability surface, over a diverse set of destination types. The customer experiences "delivery to anywhere" instead of "N separate integrations."
Pushrail's destinations catalog covers 18 destination types across webhooks, object storage, warehouses, queues, streams, databases, and analytics. The same retry, replay, audit, and observability primitives apply uniformly. The customer's mental model is one platform, not eighteen integrations.
Next in the Beyond-webhooks cluster: event routing patterns, what filtering, fan-out, and per-customer routing look like once you have more than one destination type to route to.