DEV Community

serkan
serkan

Posted on

I was integrating Paddle Billing into a SaaS product. The checkout kept failing with:

I spent weeks debugging this. I tried:

  • Different price IDs (verified active in dashboard)
  • Different client-side tokens (regenerated multiple times)
  • Removing the customer object from Checkout.open()
  • Removing the settings object 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.

Top comments (0)