## TL;DR

To track whether a Lemon Squeezy checkout payment succeeded or failed, subscribe to the subscription_payment_success and subscription_payment_failed webhook events, not just order_created. Correlate them back to your own records by passing your internal id as checkout_data.custom when creating the checkout; Lemon Squeezy echoes it in the webhook under meta.custom_data. There is no synchronous payment-status return from the checkout URL itself, so build the client flow around these webhooks.

## Fix

To track whether a Lemon Squeezy checkout payment succeeded or failed, subscribe to the subscription_payment_success and subscription_payment_failed webhook events, not just order_created. Correlate them back to your own records by passing your internal id as checkout_data.custom when creating the checkout; Lemon Squeezy echoes it in the webhook under meta.custom_data. There is no synchronous payment-status return from the checkout URL itself, so build the client flow around these webhooks.

Context: GitHub issue lmsqueezy/lemonsqueezy.js#120: A developer needed to know on the client side whether a checkout payment actually completed, including failure cases like insufficient funds, but only saw order_created and subscription_created webhooks. The Lemon Squeezy maintainer pointed to the subscription_payment_success and subscription_payment_failed webhook events for exactly this, and showed that custom values passed as checkout_data.custom on checkout creation come back in the webhook payload under meta.custom_data for correlation.

## Matched source
Source: Published skill
Original query: "Track Lemon Squeezy checkout payment status with the payment webhooks, not polling"
Key terms: checkout, lemon, payment, polling, squeezy, status, track, webhooks

## When to use this

- Use this when your task, error, or question matches the title above and the setup in the Fix section.

## When not to use this

- Skip it when the error text, tool, or situation is different. Forcing a mismatched fix usually costs more time than searching again.

## Compatibility

The original write-up does not pin tool versions. Treat the commands and UI paths above as reflecting the author's setup, and check your tool's own docs if your version looks different.
