BillingWebhookKit

Lemon Squeezy webhook not firing after checkout

When checkout succeeds but the app never grants access, debug delivery before blaming fulfillment code. The safest launch path is to prove environment, endpoint, event, signature, and retry behavior in order.

Open the checkout smoke report

Confirm live/test mode and endpoint URL

Match the checkout environment, store, product, variant, and webhook endpoint. A live checkout will not prove delivery to a test-only endpoint, and a stale tunnel URL can silently make every paid order miss the app.

Check subscribed events before the handler

For one-time products, the route usually needs order_created. For subscriptions, it may also need subscription payment, renewal, cancellation, or failed-payment events. If the event is not selected, the app cannot receive it.

Return 2xx only after signature verification

Read the exact raw request body, verify the x-signature, then parse JSON. Log the event ID, object ID, product or variant ID, and idempotency key, but keep secrets and customer data out of public reports.

Replay the paid event before publishing checkout

Use the signed paid-order fixture to prove duplicate delivery skips fulfillment, download delivery, license generation, and emails after the first successful write.

FAQ

Why did my Lemon Squeezy checkout succeed but no webhook arrived?

Common causes include checking the wrong live/test environment, using a stale endpoint URL, not subscribing to order_created or subscription events, returning a non-2xx response, rejecting the request during signature verification, or mapping only a different product or variant.

Should I expose the public buy link before fixing webhook delivery?

No. Keep the public checkout link disabled until a controlled paid checkout produces a signed webhook event, the route returns 2xx, fulfillment runs once, and duplicate replay is safe.

Turn the failed checkout into release evidence

Use the free sample to inspect fake fixtures and local tests. Use the Pro Kit preview when you need copy-ready handlers, replay tests, review reports, and launch checklists for a real billing route.