I spent weeks debugging this. I tried:
- Different price IDs (verified active in dashboard)
- Different client-side tokens (regenerated multiple times)
- Removing the
customerobject fromCheckout.open() - Removing the
settingsobject entirely - Hardcoding values instead of using env variables
Nothing worked. The error was always identical, regardless of what I changed in my JavaScript.
The actual fix
The issue had nothing to do with code. In Paddle's dashboard, under Checkout > General, there's a field called Default Payment Link. If it's not set, Paddle can't create transactions — even with a perfectly valid priceId and token.
Once I set this field to my app's URL, checkout started working immediately.
Why this is easy to miss
The error message points to transaction_checkout_id, which makes you think the problem is in how you're calling Checkout.open(). It gives zero indication that a dashboard setting unrelated to your code is the actual blocker.
If you're stuck on this
Check Checkout Settings > General > Default Payment Link before spending hours debugging your integration code. Save yourself the time I lost.
Building LLMWatch — a tool for tracking LLM API costs. This was part of getting payments working for it.













