<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tejas Giri</title>
    <description>The latest articles on DEV Community by Tejas Giri (@tejas_giri_19aa846141b778).</description>
    <link>https://dev.to/tejas_giri_19aa846141b778</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3885464%2Fe1ac176a-4154-41dc-9dc2-62788b877562.png</url>
      <title>DEV Community: Tejas Giri</title>
      <link>https://dev.to/tejas_giri_19aa846141b778</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tejas_giri_19aa846141b778"/>
    <language>en</language>
    <item>
      <title>Why I replaced Stripe with Polar, Prisma with Drizzle, and Clerk with BetterAuth and never looked back</title>
      <dc:creator>Tejas Giri</dc:creator>
      <pubDate>Sun, 19 Apr 2026 10:30:10 +0000</pubDate>
      <link>https://dev.to/tejas_giri_19aa846141b778/why-i-replaced-stripe-with-polar-prisma-with-drizzle-and-clerk-with-betterauth-and-never-looked-f63</link>
      <guid>https://dev.to/tejas_giri_19aa846141b778/why-i-replaced-stripe-with-polar-prisma-with-drizzle-and-clerk-with-betterauth-and-never-looked-f63</guid>
      <description>&lt;p&gt;I want to be upfront about something before you read this.&lt;/p&gt;

&lt;p&gt;I'm not a tech influencer. I'm not being paid by any of these companies. I'm just a developer who spent the last two years building SaaS products and hitting the same walls over and over until I finally stopped and asked myself why am I still using these tools?&lt;/p&gt;

&lt;p&gt;This is that story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment I knew something had to change
&lt;/h2&gt;

&lt;p&gt;I was three days into setting up payments for my latest project. Not building the product. Not writing features. Just trying to get Stripe to accept my account.&lt;/p&gt;

&lt;p&gt;I'm an indie developer. Solo. No registered business. Just me and my laptop trying to build something people would pay for.&lt;/p&gt;

&lt;p&gt;Stripe kept asking for business registration documents. My personal account got flagged for "additional review." Support took four days to respond with a template email that didn't answer my question.&lt;/p&gt;

&lt;p&gt;Meanwhile the idea in my head was getting stale. The momentum was dying. And I hadn't written a single line of actual product code yet.&lt;/p&gt;

&lt;p&gt;That was the moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe → Polar
&lt;/h2&gt;

&lt;p&gt;I want to be fair to Stripe. It's an incredible product. The documentation is some of the best I've ever read. The developer experience for someone with a proper business setup is genuinely excellent.&lt;/p&gt;

&lt;p&gt;But for indie developers especially outside the US and UK it's a nightmare.&lt;/p&gt;

&lt;p&gt;A friend mentioned Polar. I was skeptical. I'd never heard of it and honestly assumed it was some half-baked alternative that would cause more problems than it solved.&lt;/p&gt;

&lt;p&gt;I had it working in three hours.&lt;/p&gt;

&lt;p&gt;Personal account. No business registration. No documents. No four day support wait. Just an API key and a product ID and I was taking real payments.&lt;/p&gt;

&lt;p&gt;But here's what actually surprised me beyond the setup. Polar is Merchant of Record. That means they handle VAT, sales tax, and tax compliance globally. If you've ever tried to figure out EU VAT as a solo developer you know exactly why this matters. With Stripe you're responsible for all of it. With Polar it's just handled.&lt;/p&gt;

&lt;p&gt;The webhook integration is clean. The customer portal is built in no extra code to build a billing management page. The subscription flows just work.&lt;/p&gt;

&lt;p&gt;Lower fees than Stripe. Works globally without a registered business. Built by people who actually understand the indie hacker workflow. I haven't touched Stripe since.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prisma → Drizzle
&lt;/h2&gt;

&lt;p&gt;This one is harder to explain because Prisma is genuinely good. The developer experience is polished. The schema syntax is readable. The migration tooling works.&lt;/p&gt;

&lt;p&gt;The problem for me came when I deployed to Vercel. Cold starts.&lt;/p&gt;

&lt;p&gt;Prisma generates a large binary client. On serverless environments Vercel, Netlify, any edge runtime that binary takes time to initialize. Not seconds. But enough that your first request after inactivity feels sluggish. Enough that users notice.&lt;/p&gt;

&lt;p&gt;I switched to Drizzle and the difference was immediate. No binary client. Tiny bundle. Cold starts essentially disappear. And the TypeScript support isn't just good it's the best type inference I've seen in any ORM.&lt;/p&gt;

&lt;p&gt;The syntax takes a few days to get used to if you're coming from Prisma. But once it clicks, writing database queries feels like writing TypeScript rather than fighting a query builder.&lt;/p&gt;

&lt;p&gt;The other thing I didn't expect migrations are plain SQL files. You can read them. You know exactly what's running against your database. With Prisma I always had this slight anxiety about what the migration was actually doing. With Drizzle it's just SQL. No magic. No surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clerk → BetterAuth
&lt;/h2&gt;

&lt;p&gt;Okay. This is the one I feel most strongly about.&lt;/p&gt;

&lt;p&gt;I used Clerk for two projects. The onboarding experience is genuinely beautiful. You're up and running in 20 minutes. The prebuilt components look great. Everything just works. Until you get your first bill.&lt;/p&gt;

&lt;p&gt;Clerk's free tier is generous. But the moment you start growing real users, real traffic the pricing jumps fast. I've talked to developers paying $200-400 a month in Clerk fees before their product was even profitable.&lt;/p&gt;

&lt;p&gt;But the money isn't even the main reason I left. It's the data ownership problem.&lt;/p&gt;

&lt;p&gt;With Clerk your users live in Clerk's infrastructure. Not your database. If Clerk has an outage your auth is down. If Clerk changes their pricing dramatically you're stuck because migration is painful. If you need custom user fields or complex role logic you're working around Clerk's opinions about how auth should work.&lt;/p&gt;

&lt;p&gt;I want my users in my database. Full stop.&lt;/p&gt;

&lt;p&gt;BetterAuth is a library. It runs in your app. Your users are in your Postgres database from day one. No external service. No dependency on someone else's infrastructure. No surprise bills at scale.&lt;/p&gt;

&lt;p&gt;The TypeScript support is first class better than NextAuth v5 which has been in beta for what feels like forever. The plugin system is genuinely well designed. Adding OAuth providers, magic links, two factor auth, admin features it's all plugins that compose cleanly instead of fighting each other.&lt;/p&gt;

&lt;p&gt;And the Polar plugin means your auth and payments are integrated out of the box. User signs up, Polar customer is created automatically. Subscription webhook fires, user plan updates in your database. It's the kind of integration that would take you a day to wire up manually just there.&lt;/p&gt;

&lt;p&gt;I haven't missed Clerk once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this stack actually looks like
&lt;/h2&gt;

&lt;p&gt;After going through all of this I ended up with a stack I'm genuinely happy with for the first time. Next.js 15 for the framework. BetterAuth for auth. Polar for payments. Drizzle ORM on Neon serverless Postgres for the database. Resend for emails. Shadcn/ui and Tailwind v4 for UI.&lt;/p&gt;

&lt;p&gt;Every piece of this was chosen because I hit a real problem with the alternative. Not because of a YouTube tutorial. Not because of a Twitter thread. Because I used the other thing and it hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I didn't expect
&lt;/h2&gt;

&lt;p&gt;When I finally had this stack working together really working, not just a demo but production traffic I realized something. I had rebuilt the same foundation for the fourth time in two years. Auth. Payments. Email. Admin panel. Webhooks. Protected routes. Plan-based feature gates. Every project. Same setup. Different bugs.&lt;/p&gt;

&lt;p&gt;So I packaged it. Cleaned up the code, documented every decision, wrote a setup guide, and turned it into a boilerplate that other developers can use instead of going through the same three weeks of infrastructure work I keep going through.&lt;/p&gt;

&lt;p&gt;If you're starting a new project and you want this stack without the research and debugging it's available. Demo is live so you can see it before deciding. Everything I described in this article is wired together and working.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs-better-auth-polar-neon-boil.vercel.app/auth/sign-in" rel="noopener noreferrer"&gt;demo link&lt;/a&gt; — &lt;a href="mailto:admin@yopmail.com"&gt;admin@yopmail.com&lt;/a&gt; / Password123!&lt;br&gt;
&lt;a href="https://9928452025183.gumroad.com/l/nextjs-saas-boilerplate" rel="noopener noreferrer"&gt;gumroad link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If you take nothing else from this
&lt;/h2&gt;

&lt;p&gt;Try Polar if you're struggling with Stripe account approval or global payment complexity. Try Drizzle if cold starts or bundle size matter to your deployment. Try BetterAuth if you're tired of paying for auth at scale or want your user data in your own database.&lt;/p&gt;

&lt;p&gt;None of these are perfect. But for indie developers building SaaS products solo they're the best combination I've found. And I've tried a lot of combinations.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>stripe</category>
      <category>polar</category>
      <category>clerk</category>
    </item>
  </channel>
</rss>
