Skip to main content
Nozle processes payment webhooks for each connected Stripe account and for each connected Razorpay account. The sections below describe Stripe first, then Razorpay. How it works:
  1. You connect a Stripe account to a Nozle organization.
  2. Nozle registers a Stripe webhook endpoint for that Stripe account.
  3. Stripe sends payment events to your public Nozle API URL.
  4. Nozle verifies the Stripe-Signature header using the webhook secret returned by Stripe. It subscribes to the eight events below only, and it does not de-duplicate Stripe events by event ID: replays are safe because handlers act on the current state.
  5. Nozle updates invoice payment status and resolves any payment-gated subscription activation.
Key events processed: Setup: Nozle registers the Stripe webhook automatically in a background job right after you connect Stripe. The target is:
Your Stripe account must allow webhook endpoint creation, and your public Nozle API URL must be reachable by Stripe. Registration is retried (up to 6 attempts) when Stripe rate-limits or is briefly unavailable. When Stripe refuses it (a key without permission, the limit of 16 test-mode endpoints, or a URL that is not public), Nozle sends a payment_provider.error webhook with Stripe’s message. Check your Stripe dashboard for the endpoint to confirm registration. See the Stripe integration for the events, recovery and limits.

Razorpay

Nozle does not register the Razorpay webhook. You add it in the Razorpay dashboard, with the webhook secret you entered on the Nozle connection. The target is the Webhook URL shown on the connection:
Nozle verifies the X-Razorpay-Signature header, an HMAC-SHA256 of the raw request body with the webhook secret, and de-duplicates on the X-Razorpay-Event-Id header. A valid request returns 200. A request returns 400 when the provider ID is unknown or not a UUID, the signature is not lowercase hexadecimal or does not match, the event ID is missing or longer than 255 bytes, the body is not valid JSON, or an event ID that Nozle already received arrives with a different body (webhook_event_payload_conflict). See the Razorpay integration for setup and the checkout flow.