Clerk Pricing at 10k MAU: Solo Dev Field Notes on Real Costs

Clerk pricing hits $585/month at 10k MAU on Pro plus add-ons. Real numbers from 7 SaaS apps and the Better Auth alternative I ship in TanStack Ship.

Huifer
Huifer
May 24, 20269 min read
Also available in:Deutsch

Written by Huifer, solo developer and maintainer of TanStack Ship. I have shipped seven SaaS apps on Cloudflare Workers in the last two years. Three are on Clerk today. Two were on Clerk and have been migrated to Better Auth because the monthly bill crossed $400 at sub-5k MAU. This post breaks down what 10k MAU actually costs on Clerk Pro with realistic add-ons — emails, MFA, organizations — and shows production code for the Better Auth alternative I now ship in TanStack Ship. No vendor sponsored this write-up; I pay for every Clerk seat out of pocket. Disclosure: this is an independent review with no affiliate links and no material connection to any vendor mentioned.

Verified sources: Clerk Pricing (official) · Clerk Organizations Pricing FAQ · Clerk Pro Plan Features · Better Auth Documentation · Better Auth Cloudflare Workers Guide · TanStack Start Documentation · TanStack Ship GitHub · Stripe Billing API Last updated: 2026-05-18 · Changelog


TL;DR: Clerk pricing at 10k MAU on the Pro plan lands at $585/month before you count emails, MFA, and the organizations feature. Add the realistic production add-ons and the true monthly bill is $635–$720/month for a B2B SaaS with role-based access. For a solo founder paying out of one Stripe account, that is a salary. The honest alternative is Better Auth + Drizzle + Cloudflare D1, which costs $0/month at the same MAU and ships pre-wired in TanStack Ship. The trade-off is real: Clerk's organizations UI and hosted MFA flows save weeks. If you need them on day one, pay for Clerk. If you can wire Better Auth once, you keep the margin.


What Clerk actually charges at 10k MAU

Before any add-ons, Clerk's public pricing for the Pro plan in 2026 is a flat $25/month for the first 10k MAU, then a per-user fee above that. The catch is that almost no real B2B SaaS stays inside the base Pro tier. You need organizations (for multi-tenant workspaces), MFA (because your enterprise prospects ask for it), and production email delivery (because Clerk's built-in emails are fine for sign-up but not for transactional reliability).

The base Pro plan line item

According to Clerk's pricing page, the Pro plan includes unlimited users up to 10k MAU, then $0.02/MAU above that, plus unlimited authentication methods, basic MFA, and basic organizations. The headline price is $25/month for the first 10k MAU. That is the figure most blog posts quote. It is also the figure that disappears the moment you add anything realistic.

The add-ons that change the math

Here is the production line item for a B2B SaaS with organizations, MFA, and authenticated email volume. Numbers come from Clerk's Organizations pricing FAQ and the Clerk Pro plan features page, cross-checked against Stripe invoices from three of my own apps in April 2026.

Line itemMonthly cost (10k MAU)Source
Clerk Pro base (10k MAU)$25Pricing page
Organizations add-on$100Org FAQ, scales with MAU
Production email (Resend backend)$80Clerk's per-email markup
MFA + WebAuthn$50Pro feature gate
Production seats (3 admin)$90Pro seats over free tier
Frontend API overage$40Sentry trace, real
Subtotal$385/month—
Variance buffer (Stripe fees, support)~$30Stripe invoice history
Realistic total$415–$720/month—

The spread exists because the $720 ceiling assumes every Clerk add-on plus heavy email volume (50k/month). The $415 floor assumes a lean Pro setup with no email overages. The honest midpoint for a B2B SaaS at 10k MAU is $585/month, which I use below.

Where the number moves

Two variables drive the real bill more than any other: email volume and organizations. If your SaaS sends 10 transactional emails per MAU per month, Clerk's email markup is the largest line item. If your SaaS does multi-tenant organizations (one Clerk org per customer company), the organizations add-on alone is $100/month at 10k MAU and scales above that.

For a deeper comparison, see Auth0 vs Clerk vs Roll-Your-Own: SaaS Auth Cost and Control Compared.

How three of my apps actually paid

I keep a production ledger in a private Notion. For three of my apps currently on Clerk, here is the April 2026 Stripe invoice for Clerk alone.

AppMAUClerk invoiceClerk features enabled
InvoiceFlow4,200$214Pro + Organizations + MFA
ShipNotes7,800$396Pro + Organizations + MFA + Frontend API Pro
TeamBoard12,400$612Pro + Organizations + MFA + emails + seats

TeamBoard is the only one currently above 10k MAU. The $612 invoice includes the $0.02/MAU overage for the 2,400 users above 10k, per Clerk's pricing page. ShipNotes hurt the most: at 7,800 MAU I was paying nearly $400/month for a feature set I could replicate with open-source libraries on a weekend.

The line I could not defend

At ShipNotes' 7,800 MAU, the per-MAU cost was 5.1 cents. At InvoiceFlow's 4,200 MAU, the per-MAU cost was 5.1 cents again. That is not a coincidence; it is the structure of Clerk's pricing — base $25 + organizations + MFA is roughly 5 cents per MAU regardless of volume until 10k. The 10k MAU threshold is the cliff. After it, the per-MAU cost roughly doubles because of the $0.02/MAU overage.

This matters if you are scaling a B2C product where 10k MAU is plausible by month six. For a B2B SaaS where 10k MAU is a year-two milestone, the question is not "can I afford Clerk now" but "will I be able to afford Clerk at the milestone I am building toward".

What Better Auth costs at the same MAU

Better Auth is an open-source TypeScript auth framework with first-class Cloudflare Workers support. According to the Better Auth documentation, it ships its own session management, MFA, organizations, magic links, OAuth providers, and admin plugin. The runtime cost at 10k MAU is whatever your database and email provider charge you, because Better Auth has no per-MAU fee.

For a typical Workers + D1 + Resend stack at 10k MAU:

Line itemMonthly costSource
Better Auth (self-hosted)$0Open-source MIT
Cloudflare D1 (sessions table)$5D1 included in Workers paid plan
Resend email (50k/month)$20Resend Pro tier
Cloudflare Workers requests$5Bundled in paid plan
Subtotal$30/month—

The honest framing: $30/month is the floor, not the average. Add transactional email reliability, a session-management cron, and a backup of the user table, and you land at $60/month. That is one-tenth of the Clerk midpoint.

The trade-off you are paying

You give up three things with Better Auth. You build the MFA UI yourself; Clerk's hosted MFA flow takes five minutes. You build the organizations UI yourself; Clerk's <OrganizationSwitcher /> is genuinely good. You own email deliverability; Clerk runs its own backend with retry and bounce handling. If you skip Resend and send auth emails from a Worker, your bounce rate will haunt you within a quarter.

If you cannot build those three things in a week, Clerk is cheaper in developer time. If you can, Better Auth is cheaper in dollars every month.

Production code: wiring Better Auth in TanStack Start

The TanStack Ship starter ships Better Auth pre-wired. Here is the auth.ts, lightly redacted. This replaces the Clerk <ClerkProvider /> wrapper in TanStack Start.

typescript
// src/lib/auth.ts — TanStack Ship starter
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { admin, organization, magicLink } from "better-auth/plugins";
import { db } from "./db";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    provider: "sqlite",
    schema: {
      user: "user",
      session: "session",
      account: "account",
      verification: "verification",
      organization: "organization",
      member: "member",
      invitation: "invitation",
    },
  }),
  emailAndPassword: {
    enabled: true,
    requireEmailVerification: true,
    sendResetPassword: async ({ user, url }) => {
      await sendEmail({
        to: user.email,
        template: "reset-password",
        data: { url },
      });
    },
  },
  plugins: [
    admin(),
    organization({
      allowUserToCreateOrganization: false,
      organizationLimit: 1,
    }),
    magicLink({
      sendMagicLink: async ({ email, url }) => {
        await sendEmail({ to: email, template: "magic-link", data: { url } });
      },
    }),
  ],
  trustedOrigins: ["https://tanstackship.com", "http://localhost:3000"],
});

The matching route handler is one file, and the React provider is <AuthProvider /> from better-auth/react. Wiring time on the TanStack Ship starter is roughly 15 minutes. The equivalent Clerk wiring is also 15 minutes, but you also have to configure the dashboard, set up webhooks, and verify the production domain — none of which is captured in the "15 minutes" number.

Migrating an existing Clerk app

If you already have a Clerk app and the invoice is the reason you are reading this, the migration path is:

  1. Export users from Clerk via the Clerk Backend API — GET /v1/users paginated.
  2. Hash passwords with bcrypt cost 10 (Clerk stores them in a compatible format).
  3. Insert into your Better Auth user table with the same email as primary key.
  4. Run a migration window where both providers accept the same email, and force a one-time password reset on first Better Auth login.

Steps 1–3 took me about a day for ShipNotes' 7,800 users. Step 4 is the part most blogs skip; without it, every user resets on the same day.

Here is the migration script that does steps 1–3:

typescript
// scripts/migrate-clerk-to-better-auth.ts
import { createClerkClient } from "@clerk/backend";
import { db } from "../src/lib/db";
import { users } from "../src/lib/schema";
import bcrypt from "bcrypt";

const clerk = createClerkClient({ secretKey: process.env.CLERK_SECRET_KEY! });

async function migrateUsers() {
  let offset = 0;
  const limit = 100;
  let total = 0;

  while (true) {
    const batch = await clerk.users.getUserList({ limit, offset });
    if (batch.data.length === 0) break;

    for (const u of batch.data) {
      const email = u.emailAddresses[0]?.emailAddress;
      if (!email) continue;

      await db.insert(users).values({
        id: u.id,
        email,
        name: `${u.firstName ?? ""} ${u.lastName ?? ""}`.trim(),
        emailVerified: u.emailAddresses[0]?.verification?.status === "verified",
        createdAt: new Date(u.createdAt),
      }).onConflictDoNothing();
      total++;
    }

    offset += limit;
    console.log(`Migrated ${total} users...`);
  }

  console.log(`Done. ${total} users migrated.`);
}

migrateUsers().catch(console.error);

The script handles batched export (Clerk paginates at 100), de-duplication via onConflictDoNothing, and a verification flag that maps to Better Auth's email-verified column. The full script with password hashing and rollback is in the TanStack Ship starter.

For the alternative path, see TanStack Ship features for the clerk-bridge module in the v2 starter.

When Clerk is still the right call

Clerk wins when any of these describe your SaaS, and I will not pretend otherwise:

  1. You ship enterprise features in week one. Clerk's organizations UI, SSO, and SCIM provisioning are real weeks of work to replicate. If your buyer expects SAML on day one, Clerk saves a quarter.
  2. You are a 2-person team with no frontend bandwidth. Clerk's hosted MFA, password reset, and email templates are not magic, but they are done. Better Auth's UI is on you.
  3. You need SCIM provisioning across 50+ IdPs. Clerk's directory sync handles this; Better Auth does not.
  4. You have a non-engineering founder who manages users. Clerk's dashboard is non-technical-friendly; Better Auth has no hosted dashboard.

If your co-founder handles onboarding, a hosted admin dashboard is worth $400/month in their time. Mine does not, which is why I migrated. Yours might.

What I ship in TanStack Ship today

TanStack Ship ships with Better Auth as the default plus a clerk-bridge adapter if the list above matches your situation. The bridge is one config file change; the schema stays the same. No vendor lock-in.

At 10k MAU the saved $555/month is roughly 30 hours of founder time per year. That buys a week of shipping every year forever. For other comparisons, see TanStack Ship vs ShipFast and TanStack Ship vs Makerkit.

Frequently asked questions

Is Clerk pricing per user or per MAU? Per MAU, a unique authenticated user in a 30-day window. Source: Clerk pricing FAQ.

Does Better Auth support SAML SSO? Yes, via the sso plugin. Less polished than Clerk's hosted UI.

What happens to my Clerk session if I migrate mid-month? Run both providers for a transition window. Clerk sessions live in JWT cookies; Better Auth sessions live in your D1 table. Set both providers' cookies on the same domain and force re-auth on the one you keep.

Is Clerk pricing negotiable? Yes. Clerk's startup plan offers a 6-month discount for companies under $1M ARR; it is not published, you have to ask. I got 50% off for 4 months on one app.

Can I use Better Auth with TanStack Start? Yes — TanStack Start's server functions integrate with Better Auth's auth.api handlers via createServerFileRoute. See the TanStack Start auth guide.