One wrapper around your Stripe webhook handler. Full visibility into what actually happened.
// Stripe webhook handler
export async function POST(req) {
const event = await stripe.webhooks.constructEvent(...);
// Vercel times out at 10s
// Stripe marks it "delivered"
// Customer charged, order missing
await provisionAccess(event);
return new Response('OK');
} import { withHookRelay } from '@hookrelay/next';
export const POST = withHookRelay(async (event) => {
// ✓ See which payments failed
// ✓ Replay missed events safely
// ✓ Know customer + amount affected
await provisionAccess(event);
}); When a payment webhook fails, you'll know exactly which customer, which amount, and can replay it instantly.
See full integration guideBuilt for teams who can't afford to miss Stripe payments
See which Stripe events never reached your app. No more guessing why a customer was charged but never got access.
One click to replay a missed payment webhook. Your handler runs exactly once—no double charges, no duplicate orders.
Prove whether Stripe or your infrastructure failed. When customers complain, you have the evidence.
Know exactly which customer and amount was affected. Stop digging through Stripe logs to reconcile missing orders.
One wrapper around your existing Stripe handler. Works with Next.js, Vercel, and anywhere you handle webhooks.
Stop manually fixing "I paid but didn't get access" issues. Catch and recover failed payments before customers notice.
Three steps from missed payments to recovered revenue
Point your Stripe webhook URL to HookRelay. We receive and persist every payment event before forwarding.
Did your handler succeed? Time out? Throw an error? We know—and show you exactly which customer was affected.
Missed a payment? One click to replay. Your handler runs exactly once—customer gets access, you keep the revenue.
Free tier · No credit card · 5 minute setup
Everything you need to know about HookRelay
Stripe marks a webhook as "delivered" when your server returns 200—even if your code didn't finish running. Vercel has a 10-second timeout. Database connections drop. Deploys happen mid-request. Stripe thinks the payment webhook succeeded, but your customer never got access. HookRelay tracks what actually happened.
Minimal changes. Wrap your existing webhook handler with withHookRelay() and update your webhook URL in Stripe's dashboard to point to HookRelay. Your handler logic stays the same.
Stripe automatically retries failed webhook deliveries for up to 3 days. If HookRelay experiences downtime, Stripe will retry and we'll process events once we're back online. You can also replay missed events from the dashboard.
Stripe shows you webhook delivery attempts and their HTTP status codes. It doesn't show you whether your code actually ran to completion. A 200 response doesn't mean the order was created or access was provisioned. HookRelay tracks actual execution outcomes—so you know the difference between "delivered" and "processed."
Most teams don't know until they look. A 0.1% webhook failure rate at $100 average order value across 10,000 orders is $1,000/month in lost revenue—plus support costs and angry customers. HookRelay's free tier handles 2,500 events/month. Start there and see what you find.
Start free, scale as you grow. No hidden fees.
Try webhook recovery
Unlimited replay for peace of mind
Need more? Contact us for custom plans with higher limits.