stack / 01 — updated may 2026

Build a SaaS for $100/mo

A reference stack for shipping a real SaaS on a single Stripe-team-seat budget. Auth, database, transactional email, cache, error tracking, analytics — everything wired, dated, and built on tools we have running in production right now.

We rounded nothing. The $87 figure is the listed monthly cost at each provider's stated May 2026 tier.

cap$100/mo
actual$87/mo
updatedMay 2026
services7 · 1 free
stack.txt — receipts/saas-100.mdmonthly
SERVICENOTESUSD
DigitalOcean App Platformhosting$5
CloudflareDNS + CDN + DDoSfree
Supabase Propostgres + auth$25
Postmarktransactional email$15
Upstashcache + rate limit$10
Sentry Teamerror tracking$26
Plausibleprivacy analytics$6
SUBTOTAL · monthly7 services · 1 free tier$87/mo
>cheapstack — runs in production. jump to setup →
why / the picks

Why this stack

These seven tools cover the entire surface area of a real SaaS — hosting, CDN, auth, data, email, cache, errors, analytics — without any single line item crossing $26. Nothing here is exotic. The point is that boring works, and boring is cheap.

DigitalOcean App Platform and Supabase do the heavy lifting. Together they’re $30/mo and cover hosting, Postgres, auth, file storage, and zero-downtime deploys. Unlike Vercel Hobby, commercial use is explicit; unlike a custom VPS, you’re not on the hook for TLS rotation or auto-restart on crash. That’s a stack five years ago that would have run you $400 a month and a weekend of YAML.

Cloudflare in front is the line item we feel strongest about. Free DNS, free CDN, free TLS, free DDoS protection — there’s no good reason to skip it on any stack at any price. The four supporting services — Postmark, Upstash, Sentry, Plausible — exist because the first time something breaks in production at 2am, you’ll wish you had them. They’re the difference between “we have an outage” and “we know exactly which user, on which page, saw which error”. Skipping them is the most common $0-this-month, $2,000-next-month mistake in postmortems.

The honest tradeoff: this stack assumes you’re comfortable in SQL and TypeScript. If you’d rather pay for a no-code wrapper around all of this, the same functional surface area runs around $300–400/mo on the usual platforms. That’s not a worse choice — it’s just not the guide we’re writing.

services / 7 picks

Per-service deep dives

01

DigitalOcean App Platform

$5/mo Updated May 2026
What it does

Hosts the Next.js app as a managed container, auto-deploys from GitHub on every push.

Why we picked it

$5/mo is the floor — and it stays $5 whether you have one user or ten thousand. Commercial use is explicit (no Hobby-tier ToS gotchas). App Platform handles TLS, zero-downtime rollouts, and basic autoscale without locking you into a serverless runtime. If you ever outgrow it, the same Dockerfile runs on any cloud — no rewrite tax.

Where it might bite you
  • The $5 plan is single-instance and suspends after a quiet stretch — first request after idle is slow. The $12 'Basic' tier removes the suspension; pay it the day a real user complains.
  • Build minutes are capped (a few hundred per month). On a heavy Next.js build with frequent pushes, you'll burn through it — wire a self-hosted GitHub Actions runner if it bites.
  • Their built-in CDN is fine, not great. Pair with Cloudflare in front (free, next line) for serious global latency wins.
02

Cloudflare

free Updated May 2026
What it does

Sits in front of the app: DNS, caches static assets at 300+ edge POPs, blocks bots, free TLS.

Why we picked it

There's no good reason to skip Cloudflare. The free tier covers everything an indie SaaS needs — unlimited bandwidth, free TLS, Page Rules, Workers (limited free), and DDoS mitigation that's the industry leader. Pointing your domain at Cloudflare also unlocks every other Cloudflare product (R2, Pages, Workers, Stream) without a second account.

Where it might bite you
  • Default cache TTLs are aggressive. Ship a deploy without a purge step and users see the old build for up to 4 hours — wire 'purge on deploy' into your CI.
  • WAF rules on the free plan are limited. Geographic blocking, rate limiting, and the full Page Rules library require Pro at $20/mo.
  • If you proxy through Cloudflare and your origin is misconfigured, you'll get a Cloudflare error page — and the Cloudflare branding on it makes users think your site is broken, not theirs.
03

Supabase Pro

$25/mo Updated May 2026
What it does

Postgres database, row-level security, and the auth provider for the app.

Why we picked it

Pro at $25 gets you 8GB of storage, daily backups, and — the part most comparisons skip — a connection pool that doesn't fall over the first time a serverless function fans out. Auth is bundled, so there's no Clerk per-MAU pricing on top. SQL access is real, which means the query language is the one you already know.

Where it might bite you
  • The pooled connection limit is around 200 concurrent. With Vercel serverless that adds up faster than you'd expect — keep transactions short and use the pooler URL for app code.
  • Email-based auth without a custom SMTP gets rate-limited on the free SMTP relay. Wire Postmark in as custom SMTP for auth emails too, not just product email.
  • RLS bugs are silent by default. A policy that's slightly wrong returns zero rows instead of erroring; budget time for writing tests against your policies.
04

Postmark

$15/mo Updated May 2026
What it does

Sends every transactional email — auth, receipts, password resets, the lot.

Why we picked it

Postmark is the deliverability gold standard for transactional. They publicly publish their inbox-rate numbers and average around 99.5%+, which sounds like marketing copy until you see what it does for password-reset complaints (none). $15 covers 10k emails/mo with full headers, real audit trail, and a separate-IP architecture that keeps marketing email far away from your transactional stream.

Where it might bite you
  • Marketing email is forbidden on Postmark. A single broadcast 'Hey check out our new feature' send and they will lock the account first, ask questions later. Use Beehiiv or MailerLite for that.
  • $15 is for 10k. Past that, the next jump is $50/mo for 50k — not gentle. Forecast before you ship.
  • DKIM/SPF/DMARC verification is stricter than most ESPs. Their docs are excellent but plan an hour the first time.
05

Upstash

$10/mo Updated May 2026
What it does

Serverless Redis for caching, sessions, and rate limiting.

Why we picked it

Pay-per-request pricing is the right shape for a SaaS that doesn't run flat-line. $10 covers ~3M commands a month — past that, you're in runaway-cron territory. The Vercel integration is one click, the SDK is small, and the rate-limit primitives are widely considered good enough to skip writing your own.

Where it might bite you
  • Pay-per-request can surprise you if a hot code path forgets to cache. Set a soft monthly cap in their dashboard — the alert is free, the overage isn't.
  • Eventual consistency between regions is real. Anything that has to be strictly counted (not just rate-limited) should live in Postgres, not Redis.
06

Sentry Team

$26/mo Updated May 2026
What it does

Captures errors and performance traces from the app, with source maps and release tracking.

Why we picked it

The Team plan at $26 covers 50k errors and 100k performance events a month, with unlimited members. Cheaper alternatives exist (Bugsnag, Highlight, self-hosted GlitchTip), but Sentry's breadcrumbs pay for themselves the first time a customer sees a 500 — they shave hours off a triage.

Where it might bite you
  • Quotas are easy to blow if you don't sample. Set tracesSampleRate to around 0.1 in production from day one.
  • Source map uploads need to actually run in CI. A surprising number of teams ship for months with un-symbolicated stack traces and don't notice.
  • $26 is a lower bound. Add another seat or hit a noisy release and you'll see the bill drift — keep an eye on the monthly view.
07

Plausible

$6/mo Updated May 2026
What it does

Privacy-friendly, cookie-free page analytics and goal tracking.

Why we picked it

$6 buys 10k pageviews a month, no cookie banner, and a dashboard a non-engineer can read. You don't need session replay; you need to know which pages convert. The script is 1KB-ish and doesn't dent Lighthouse.

Where it might bite you
  • 10k pageviews is genuinely small. A single Hacker News appearance burns through the monthly cap in an afternoon — set up overage email alerts.
  • There's no funnel analysis on the entry tier. If you need that, Plausible Business at $19 is still cheaper than the alternatives.
setup / ~30 minutes

Setup in 30 minutes

Order matters. Doing these in sequence avoids the two-hour rabbit hole of trying to wire Postmark before you have a verified Supabase project.

  1. Bootstrap the Next.js app and ship to DigitalOcean App Platform

    npx create-next-app@latest with the App Router, push to a GitHub repo, then create a new app on App Platform from that repo. Pick the $5 Basic plan, set the build command to npm run build and the run command to npm start. Auto-deploys on every push to main land in about 90 seconds.

  2. Point your domain at Cloudflare (free) and proxy through it

    Add the domain to Cloudflare, switch the nameservers at your registrar, then point an A/CNAME record at the App Platform host. Turn on the orange-cloud proxy. You instantly get free TLS, DDoS protection, and a global CDN.

  3. Spin up Supabase and wire Postgres + auth

    Create a project on supabase.com, copy the pooler URL and anon key into App Platform’s environment variables, run supabase init locally for migrations. Use the @supabase/ssrpackage — it’s the only path that survives the App Router cleanly.

  4. Wire Postmark for auth + transactional email

    Create a Postmark server, verify your sending domain (SPF, DKIM, DMARC — Postmark’s dashboard walks you through), then point Supabase auth’s custom SMTP at Postmark. Use their template editor for receipts and password resets — it supports test sends with live data preview.

  5. Add Upstash for cache and rate limiting

    Create a Redis database on upstash.com. Use @upstash/ratelimit in middleware to protect login and signup routes — the defaults are sensible. Add the REST URL/token to App Platform env vars.

  6. Drop in Sentry with source maps in CI

    npx @sentry/wizard covers most of it. Set tracesSampleRate: 0.1, confirm source maps upload from your build step, and ship a deliberate test error before you forget.

  7. Install Plausible and define the conversion goals

    Add the script tag to your root layout, register the domain in Plausible, and create custom events for the two or three things you actually care about: signup, paid conversion, and whatever activation event matters for this product.

  8. Set monthly caps and alerts everywhere

    Upstash, Postmark, Plausible, Sentry — every one of them lets you set a soft cap and an email alert. Cloudflare and DigitalOcean both have billing alerts in the dashboard. Five minutes now saves a panicked Saturday later.

thresholds / numeric

When this stack runs out

Every line item below is a real number, not a vibe. When you cross one, the stack stops being the cheap option for your situation — that’s the whole signal.

~10k MAU
Supabase Pro’s pooled connection limit (around 200 concurrent) starts to hurt under fan-out. Move to Neon Scale or self-hosted Postgres + PgBouncer.
First paying user complains about cold start
DigitalOcean App Platform’s $5 tier suspends after a quiet stretch. Move to the $12 Basic tier the day someone notices — total stack stays under $100.
~10k transactional emails/mo
Postmark’s $15 tier covers 10k. Past that, the jump is to $50/mo for 50k. If you’re dispatching auth + receipts + password resets to a busy product, the math gets non-trivial. Some teams split: Postmark for high-deliverability transactional, AWS SES for bulk lower-priority.
~100k pageviews/mo
Plausible’s $6 tier covers 10k. The next jump is $19/mo for 100k. Beyond that, self-hosted Umami or Fathom usually beats it on cost-per-view.
Serious DDoS or geographic blocking needed
Cloudflare’s free tier handles ordinary attack volumes fine, but rate-limiting rules, geographic blocking, and the full Page Rules set live on Pro at $20/mo. Pay it the first time it’s needed — total stack still under $110.
~3M Redis cmds/mo
Upstash’s pay-per-request pricing is great until a hot path forgets to cache. Around 10M commands a month, fixed-price Redis on Render or DragonflyDB usually wins.
gotchas / from production

Common gotchas

Bugs that surface in production stacks like this one, footguns this combination loads. None of these will stop you shipping; all of them will cost you an afternoon if you don’t know about them.

  • auth

    Supabase email rate limits without custom SMTP

    The free SMTP relay caps you at around 4 emails per hour per address. Wire Resend in as custom SMTP before launch, not after the first user emails you that the password-reset link never arrived.

  • rls

    Row-level security policies fail silently

    A policy that’s slightly wrong returns zero rows instead of erroring. Write integration tests against the anon and authenticated clients, not just the service-role client.

  • cache

    Cloudflare cache vs deploy: stale builds for hours

    Cloudflare aggressively caches static assets at edge. Ship a deploy without a purge step and users see the old _next/static bundles for up to 4 hours. Add a cf-cache-purge action to your CI, or set a Page Rule to bypass cache on /_next/*.

  • sentry

    Forgetting to set tracesSampleRate

    The default is 0, then you turn it on, and at 1.0 you blow through the performance event quota in a week. Start at 0.1 and tune from there.

  • billing

    Stripe webhook signature drift in dev

    The Stripe CLI signs with a different secret than your live webhook endpoint. Keep STRIPE_WEBHOOK_SECRET separate per environment or your local handler silently rejects everything.

  • deploy

    DigitalOcean App Platform build minutes

    The free build-minute pool is small. A heavy Next.js app with multiple deploys/day can hit the cap mid-month and your next push will sit queued. If it bites, wire a self-hosted GitHub Actions runner or pre-build the Docker image and push to DOCR.

  • email

    Postmark locks accounts for marketing email

    One broadcast send (“Hey check out this feature!”) to your full user list and Postmark will lock the account. Their ToS is strict: transactional only. Use Beehiiv or MailerLite for any marketing email and keep the streams completely separate.