Paste a Stripe webhook event (checkout.session.completed, payment_intent.succeeded, etc.) and get a Zod schema you can run inside your handler to validate the payload at runtime, not just at compile time.
Stripe signs every webhook payload, but signature verification only proves the bytes came from Stripe — it doesn't prove the bytes match the shape your handler expects. If Stripe ships a new field, removes one, or you handle multiple event types from the same endpoint, your handler can crash on a perfectly authentic webhook. A Zod schema generated from a real event payload turns the inner data.object into a runtime-checked shape: parse the body, narrow on event.type, then run the per-type schema's parse and you have a strongly typed Session (or Subscription, or Invoice) with no ambient unknowns.
Generated schemas pair naturally with Stripe's @stripe/stripe-node types — Stripe's types describe the SDK surface, the Zod schema describes the bytes you actually received. That difference matters when you proxy events through a queue (Inngest, Hatchet, your own SQS), persist them to Postgres, replay them in tests, or hand them to a non-Node consumer. Pasting a real event from your Stripe Dashboard's webhook log gives you a copy-paste-ready z.object schema, with optional fields marked .optional() and nullable values typed as a union.