Wrap your existing webhook handler with HookRelay. That's it.
// Risky: No guarantees
export async function POST(req) {
const event = await req.json();
// What if this runs twice?
// What if Vercel times out?
// Did this actually execute?
await handleStripeEvent(event);
return new Response('OK');
} import { withHookRelay } from '@hookrelay/next';
export const POST = withHookRelay(async (event) => {
// Guaranteed:
// ✓ Runs exactly once
// ✓ Safe retries on timeout
// ✓ Full execution visibility
await handleStripeEvent(event);
}); No queue setup. No workflow configs. No infrastructure knowledge required.
See full integration guideBuilt for Next.js developers who want webhooks that just work—no infra expertise required
Even if a provider retries the same webhook three times, your handler executes exactly once. No duplicate side effects.
Vercel timeouts won't break your webhooks. We receive, persist, and retry until your handler succeeds.
"Delivered" doesn't mean your code ran. We track actual execution outcomes—success, failure, or timeout.
Missed a subscription renewal? Replay the webhook safely from the dashboard. No database surgery or support tickets.
One line of code. Works with Stripe, GitHub, Shopify, Clerk, and anything that sends webhooks to your Next.js app.
Deploy on Friday without fear. We catch webhook failures before they become angry customer emails or refund requests.
Three simple steps between webhook chaos and reliable execution
Stripe, GitHub, or any provider sends a webhook to your HookRelay URL instead of directly to your app.
HookRelay receives, persists, and forwards to your handler with exactly-once guarantees and safe retries.
Your Next.js handler executes exactly once, even if Vercel times out or the provider retries.
Free tier · No credit card · 5 minute setup
Everything you need to know about HookRelay
You can—and most teams try. The problem isn't building a webhook handler. It's correctly handling serverless retries, partial failures, timeouts, duplicate deliveries, and idempotency edge cases. These failures are rare, subtle, and expensive. HookRelay exists so you don't have to rediscover them in production.
Minimal changes. Wrap your existing webhook handler with withHookRelay() and update your webhook URL in your provider's dashboard (Stripe, GitHub, etc.) to point to HookRelay. Your handler logic stays the same.
Webhook providers (like Stripe) automatically retry failed deliveries for up to 3 days. If HookRelay experiences downtime, providers will retry and we'll process events once we're back online. You can also replay missed events from the dashboard.
Queues solve async processing, not webhook correctness. Webhook problems happen before your job runs: Was the event received? Was it processed more than once? Did the handler actually succeed? HookRelay handles the request path. You can still enqueue work after HookRelay safely forwards the event.
It depends on what the webhook does. If it touches payments, subscriptions, entitlements, or user state, correctness matters immediately. A single duplicate charge or missed subscription renewal costs more in customer trust and support time than a year of HookRelay Pro. Start free, upgrade when you're charging money.
Start free, scale as you grow. No hidden fees.
It works
I'm charging money now
This would be a real incident
Need more events? $8 per additional 100,000 events/month