Paddle vs Polar.sh for AI subscriptions and usage based billing
So, I built this little SaaS called GrandpaCAD. The idea is simple: my grandpa loves 3D printing but hates complex modeling software. With GrandpaCAD, you just describe what you want, and an AI spits out a 3D model. Simple.
To charge for this, I needed subscriptions plus usage-based billing for the AI credits. Easy, right? Wrong.
Why not just use Stripe?
Everyone asks this. Look, I'm from Slovenia. Here, every single invoice has to be "fiscally verified." This means integrating with a government API that's documented in a 119-page PDF. No, I'm not kidding. It's a bureaucratic nightmare of certificates, custom signatures, and pain.
To dodge that bullet, I needed a "Merchant of Record" (MoR). They handle all the tax and invoicing bullshit for you. Paddle is the big name I'd heard of for years, so I started there.
My 5-day trip to hell with Paddle
I'll give Paddle this: their documentation is fantastic. Their "Setup checklist" and "Go-live checklist" are genuinely useful. It felt like I was in good hands.
But then I tried to implement usage-based billing.
I spent 4-5 days wrestling with their system, and I just couldn't make it work sanely. The webhooks were a complex mess. But the real deal-breaker was something much worse.
Paddle's usage-based billing is fundamentally broken.
Here's the problem: when a user cancels their subscription, Paddle just... forgives all the usage they've racked up. Poof. Gone.
Their docs suggest a "solution": when a user clicks your "cancel" button, you first trigger an immediate charge for their usage, and then you cancel the subscription.
Okay, but what about the customer portal? Paddle gives customers a portal they can access via email to manage their subscription. If they cancel there, you have no control. You can't inject your "charge them first" logic.
So, any user could:
- Sign up.
- Use a ton of expensive AI credits.
- Cancel via the customer portal just before the billing date.
- Pay nothing for the usage.
- Repeat.
This isn't a small bug; it's a business-destroying exploit waiting to happen. For an AI SaaS where usage costs real money, this was a non-starter.
Enter Polar.sh
Frustrated and out of time, I searched for alternatives and stumbled upon polar.sh. It's a newer player, and I was a bit skeptical. But man, what a difference.
Here's a quick rundown of my experience:
- Simplicity: With Polar, I handled all subscription logic with a single
onSubscriptionUpdated
webhook. It was clean and simple. Paddle felt like it needed a whole constellation of webhooks to do the same thing. - Usage-Based Billing: It just works on Polar. No weird loopholes. You report usage, they bill for it. The end. It's exactly what you'd expect.
- Developer Experience: Polar has integrations for different frameworks. I'm using
better-auth
, and they had a helper library for it that made things even easier. - Cost: Polar.sh is 20% cheaper than Paddle. That's not nothing.
The Downsides of a Newcomer
It's not all sunshine and rainbows. You can tell polar.sh is the new kid on the block. I ran into a few weird bugs.
The good news? Their team is insanely responsive on Discord. The bad news? Their team is insanely responsive on Discord. This means when I googled my bugs, I found nothing. The solutions were buried in Discord conversations. I'd much rather find answers in public docs than have to ask on a chat server, but hey, at least I got my answers quickly.
The Verdict
After wasting a week with Paddle, I got Polar.sh integrated and working in a day.
Paddle might be a mature platform with great docs, but for my use case—usage-based billing for an AI SaaS—it has a fatal flaw. Their system allows users to easily avoid paying for metered usage, which is simply unacceptable.
Polar.sh, despite its youth and occasional rough edges, gets the fundamentals right. Their implementation of usage-based billing is solid, the developer experience is better, and it's cheaper.
If you're building a SaaS with usage-based billing, save yourself the headache. Give polar.sh a serious look. It's not perfect, but it works where it counts.