Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
Overview
Versioning
Changelog
Upgrade your API version
Upgrade your SDK version
Essentials
SDKs
API
Testing
Stripe CLI
Sample projects
Tools
Stripe Dashboard
Workbench
Developers Dashboard
Stripe Shell
Stripe for Visual Studio Code
Features
Workflows
Event destinations
    Integrate with events
    Amazon EventBridge
    Webhook endpoint
      Webhook builder
      Handle payment events
      Webhook versioning
      Migrate to thin events
      Resolve webhook signature verification errors
      Process undelivered events
      Handle irrecoverable webhook events
      Manage webhooks with event notification handlers
Stripe health alertsFile uploads
AI solutions
Agent toolkit
Model Context ProtocolBuild agentic AI SaaS Billing workflows
Security and privacy
Security
Stripebot web crawler
Privacy
Extend Stripe
Build Stripe apps
Use apps from Stripe
Partners
Partner ecosystem
Partner certification
United States
English (United States)
HomeDeveloper resourcesEvent destinationsWebhook endpoint

Process incoming webhooks with event notification handlersPublic preview

Public preview

Event notification handlers are available in public preview.

This feature doesn’t support event destinations that use EventBridge in public preview.

In each of our SDKs, we’ve created a specialized class that encapsulates the mechanics of parsing and validating a Stripe webhook. Event notification handlers take care of validating, parsing, and routing incoming webhooks to your business logic.

To use this feature, you must write a function for each event type you want to handle. After you register these functions on the handler, Stripe will call them when you receive the corresponding event notification.

Before you begin

You must use the following SDK version (or higher) to use event notification handlers.

  • Java: v31.2.0-beta.1
  • Python: v14.2.0b1
  • Ruby: v18.2.0-beta.1
  • PHP: v19.2.0-beta.1
  • Go: v84.2.0-beta.1
  • Node: v20.2.0-beta.1
  • .NET: v50.2.0-beta.1

Write a fallback callback

Write a function that runs whenever a dedicated callback hasn’t been registered for a specific event type. It will receive the EventNotification, plus a StripeClient and additional information about the event.

This function might log the fact that you received an unexpected event or throw an error to alert you to the unexpected state. You can also add business logic in this function if you’re handling events that your SDK doesn’t have types for.

Python
Java
Ruby
PHP
Go
Node
.NET
No results
def fallback_callback(notif: EventNotification, client: StripeClient, details: UnhandledNotificationDetails): print(f'Got an unhandled event of type {notif.type}!')

As part of your migration, consider moving all of your webhook endpoint code into this function. Then, you can migrate individual event types to their own functions.

Initialize your handler

In your webhook endpoint, initialize an EventNotificationHandler, passing it your fallback callback. There’s a convenience method on StripeClient to simplify this step.

Python
Java
Ruby
PHP
Go
Node
.NET
No results
client = StripeClient(api_key) handler = client.notification_handler(webhook_secret, fallback_callback)

Write & register a callback

Next, write a function responsible for handling a specific event type. It uses the event types released with the Clover API version in September 2025.

Your callback will receive the event notification cast to the correct class. You’ll also get a StripeClient, bound to the context of the notification, which makes it easy to make additional API calls without juggling account ids.

Python
Java
Ruby
PHP
Go
Node
.NET
No results
# can be anywhere in your codebase @handler.on_v1_billing_meter_error_report_triggered def handle_meter_error( notif: V1BillingMeterErrorReportTriggeredEventNotification, client: StripeClient, ): event = notif.fetch_event() print(f"Err! No meter found: {event.data.developer_message_summary}")

You can register zero or more callbacks. If you don’t register any, all events will be routed to your fallback callback.

Process events

Send incoming POST bodies into the handler. This replaces most of the original code in your webhook endpoint.

Python
Java
Ruby
PHP
Go
Node
.NET
No results
@app.route("/webhook", methods=["POST"]) def webhook(): webhook_body = request.data sig_header = request.headers.get("Stripe-Signature") try: handler.handle(webhook_body, sig_header) return jsonify(success=True), 200 except Exception as e: return jsonify(error=str(e)), 500

See also

  • Using thin events
  • Receive Stripe events in your webhook endpoint
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc