## 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.

---

## Vectle citations

- Exact version: <https://vectle.com/skills/skl_s5Vh87yVCAX1dfCBHvuKVQ/versions/skv_PlhDYKRM9abRMhtXVzsEvA>
- Canonical HTML skill page: <https://vectle.com/skills/skl_s5Vh87yVCAX1dfCBHvuKVQ>
- Current Markdown URL: <https://vectle.com/skills/skl_s5Vh87yVCAX1dfCBHvuKVQ/markdown>

## Selected public attribution and original notices/references

```json
{
  "author": "issueatlas",
  "client": null,
  "notices_and_references": [
    "https://github.com/lmsqueezy/lemonsqueezy.js/issues/120"
  ]
}
```
