DEV Community

Cover image for I built a disposable email service that costs $0 to run — here's the stack and the real numbers
zerodrop
zerodrop

Posted on

I built a disposable email service that costs $0 to run — here's the stack and the real numbers

Six weeks ago I was building an auth flow and needed a throwaway inbox to test if the password reset email actually arrived. I opened a temp email site, navigated past three ad banners, got a random address, and waited.

That workflow was broken enough that I built the infrastructure myself instead.

Here's what I built, what it cost, and what happened after.


The problem in one sentence

Every developer testing email flows either mocks the email (wrong), runs a local SMTP server (overkill), or uses a throwaway email site with ads (terrible DX). None of these are good answers.


The stack — chosen for $0 idle cost

Every service in the stack was chosen with one constraint: it must cost nothing at zero traffic and scale automatically when traffic arrives.

Layer Service Free tier
Email interception Cloudflare Email Routing Unlimited
Serverless logic Cloudflare Workers 100k req/day
AI spam filter Cloudflare Workers AI Generous
Database Upstash Redis 10k commands/day
Frontend Next.js on Vercel Generous
Domain (routing) zerodrop-sandbox.online ₹89/year
Domain (brand) zerodrop.dev ₹1,500/year

Total spend to launch: ₹1,589 (~$19)

That's it. No servers, no VMs, no managed databases with minimum monthly fees. The entire thing scales to zero when nobody is using it.


The architecture in plain English

An email arrives at anything@zerodrop-sandbox.online. Cloudflare intercepts it at the MX level and triggers a Worker function. The Worker runs a Llama 3 classification — if it's spam, it gets dropped silently. If it's legitimate, it gets parsed into clean JSON and pushed to Upstash Redis with a 30-minute TTL. The Next.js dashboard polls every 3 seconds and displays it instantly.

The whole thing processes an email in under 500ms from arrival to display.


The two-domain decision

The routing domain (zerodrop-sandbox.online) and the brand domain (zerodrop.dev) are intentionally separate. Disposable email domains get blocklisted. When that happens — and it will — you replace the routing domain for ₹89 and update one DNS record. The brand domain, the dashboard, the npm package, the users' bookmarks — none of it is affected.

This was a $10 architectural decision that prevents a future crisis.


The numbers after launch

These are real, unmanipulated numbers from the first week with zero paid promotion:

  • 338 npm installs of zerodrop-client — organic, from search
  • 1 confirmed organic user — visible in Upstash usage data. Someone found the site, generated an inbox, received a real email, and read it. Before any marketing.
  • 6,300+ Redis commands in the first 72 hours — and climbing
  • $0.00 infrastructure cost
  • ₹1,589 total spend including domains

The 338 npm installs before any promotion is the signal that matters. Developers are actively searching for this solution and finding it through keyword discovery alone.


What's coming next

The free tier works. The next milestone is the Workspace tier — custom domain routing, team seats, API keys, webhook support for CI pipelines. The pricing is $49/month per workspace.

The waitlist is open at zerodrop.dev. When 25-30 signups come from company email addresses, that's when the Workspace tier gets built. Until then the free tier runs itself.


The honest assessment

This is not a finished product. It's a free tier with a waitlist and a hypothesis: that QA teams at companies will pay $49/month for custom domain email testing infrastructure embedded in their CI pipelines.

The hypothesis is unproven. The free tier is real, the organic usage is real, and the npm downloads are real. Everything else is still a bet.

If you're building something similar or have feedback on the architecture — I'm at the @zerodropdev handle on X.


The SDK

npm install zerodrop-client
Enter fullscreen mode Exit fullscreen mode
import { ZeroDrop } from 'zerodrop-client';

const mail = new ZeroDrop();
const inbox = mail.generateInbox();
const email = await mail.waitForLatest(inbox, { timeout: 10000 });
Enter fullscreen mode Exit fullscreen mode

zerodrop.dev

Top comments (0)