Event Architecture

Inbound Stripe lifecycle

Understand how Stripe tenant webhook delivery enters Licenzy, what setup it depends on, and why billing signals arrive asynchronously.

Start free in test mode. Go live when you're ready.

Category: Event Architecture3 sections

Stripe delivers billing signals into Licenzy

In a Licenzy checkout flow, your app does not forward Stripe lifecycle events manually. Stripe calls the tenant-facing Licenzy webhook endpoint directly after checkout, subscription, invoice, refund, and dispute activity occurs.

  • /v1/webhooks/stripe/tenant

Licenzy verifies the Stripe signature, enforces idempotency using stored Stripe event tracking, and turns those billing events into entitlement updates.

Async delivery, retries, and timing

Stripe delivery is asynchronous and retryable. A checkout success page can load before billing finalization has been processed, and the same Stripe event can be delivered more than once.

  • Stripe webhook endpoints are called by Stripe, not by your application.
  • Webhook processing must be idempotent because retries can happen.
  • Access checks should tolerate a short delay while entitlement state is updated.
  • Post-payment screens should poll or refresh backend access state instead of trusting the redirect.

Required tenant Stripe events

Subscribe the tenant webhook to the full event set Licenzy uses to finalize checkout and keep entitlements in sync:

  • checkout.session.completed
  • checkout.session.expired
  • customer.subscription.created
  • customer.subscription.updated
  • customer.subscription.deleted
  • invoice.payment_succeeded
  • invoice.payment_failed
  • charge.refunded
  • charge.dispute.created
  • charge.dispute.closed
  • refund.created
  • refund.updated

For the setup-specific workflow, see tenant webhook setup.