Revenue webhooks without a server

Updated 2026-08-04

Receiving a webhook needs a public HTTPS endpoint. It does not need a server you maintain.

The options

Serverless functions

Cloudflare Workers, Netlify Functions, Vercel Functions, AWS Lambda. You deploy a function; the platform gives you a URL. No server to patch, generally free at the volumes an indie business produces.

Best for: anything custom. This is the default answer.

Hosted webhook routers

Zapier, Make, Pipedream. Point Stripe at their URL and configure an action — Slack message, spreadsheet row, push notification — without writing code.

Best for: non-developers, or wiring something up in ten minutes. Trade-off: a third party sees your event payloads, which include revenue data.

A stateless relay

A function whose only job is to forward. It receives the event, sends a notification, and stores nothing.

This is how FRGMNT's push works: provider webhooks reach a small Cloudflare Worker that forwards to Apple's push service and retains nothing — no database, no credentials, no revenue data. See why FRGMNT has no backend.

Verify the signature

Whatever you build, do this. Stripe signs every webhook with a secret. Without verification, anyone who finds your endpoint URL can post fabricated events — and if your logic reacts to them, that's a real problem.

The check is a few lines:

const sig = request.headers.get("stripe-signature");
const event = stripe.webhooks.constructEvent(rawBody, sig, endpointSecret);

Use the raw request body. Parsing to JSON first changes the bytes and the signature check fails.

Which events to listen for

For revenue notifications:

Event Meaning
invoice.paid A subscription payment succeeded
payment_intent.succeeded A one-off payment succeeded
customer.subscription.created New subscription
customer.subscription.deleted Cancellation
charge.refunded Refund issued

Start with invoice.paid and payment_intent.succeeded — between them they cover most of what you'd want to be told about.

Handle retries

Stripe retries failed deliveries, so your endpoint will occasionally receive the same event twice. Make handling idempotent — key on the event ID — or you'll get duplicate notifications.

Other platforms

Lemon Squeezy and Gumroad both support webhooks with similar patterns. The signature verification mechanism differs; the architecture doesn't.

If you'd rather not build any of this, FRGMNT surfaces a ready-made webhook URL in the Vault to paste into each provider. The CLI and MCP server cover the scripting side.

Frequently asked

Can I receive Stripe webhooks without running a server?

Yes. Serverless platforms such as Cloudflare Workers, Netlify Functions and Vercel Functions give you an HTTPS endpoint with no server to maintain, usually free at low volume.

Do I need to verify Stripe webhook signatures?

Yes. Without signature verification, anyone who discovers your endpoint URL can post fake events to it. Stripe signs every request with a secret you check against.

Read next