Every email your app sends, tested.

Not just signup. The invite, the receipt, the failed payment. Your AI finds every email your app sends and tests each one with throwaway users. Flowproof grades what arrives, then deletes every test account, with a receipt.

Watch the 30-second tour

For apps built by prompting or by typing. No test code. No junk accounts in your inbox.

claude code · session s7k2ab · trailhead-staging
  1. › get_email_map()
    38 emails · 13 tested · 25 never tested
  2. › start_session("team invite")
    session s7k2ab open · addresses th.s7k2ab.*@flowproof.dev
  3. › new_address(local="owner")
    th.s7k2ab.owner@flowproof.dev
  4. › new_address(local="teammate")
    th.s7k2ab.teammate@flowproof.dev
  5. › mark_step("owner invited teammate")
  6. › wait_for_email(teammate, map_key="team-invite")
    arrived in 2.9s · accept link resolves 200
    warning: the invitation doesn’t say when it expires
  7. › end_session(teardown=true)
    removed 2 Supabase users, 1 Stripe customer
    report: B+ · 1 fix · map: 14 of 38 tested

Works with your AI

  • claude.ai
  • ChatGPT
  • Claude Code
  • Cursor
  • Windsurf
  • VS Code
  • Codex
  • Claude Desktop
  • Replit
  • and any MCP client
Setup for each →

Start from where your app is

In claude.ai, Claude Desktop or ChatGPT, add a custom connector, sign in and press Allow. No API key. Claude Code, Cursor and Codex take one snippet. Then paste the prompt for your door. Your agent learns the rules from Flowproof itself: never a real inbox, a session before any user, every link used, cleanup at the end.

Connector addresshttps://mcp.flowproof.dev/mcp

No browser in the chat? You do the clicking. Your typing isn’t counted against your app’s email speed.

Map every email, test each one with throwaway users, grade what arrives, then clean up. Sound on.

One loop, whichever door you came in.

Temp inboxes exist. Nobody owned the whole loop, from the list of emails to the last test user deleted.

  1. 01 · Map

    Every email, on one list

    Your agent reads your code, or plans with you, and lists every email and who gets it.

  2. 02 · Test

    Throwaway users, real emails

    It signs up with throwaway addresses, triggers each email and uses the link or code inside. Each person in a flow gets their own address.

  3. 03 · Grade

    A report on every email

    Flowproof checks what arrived and what never did, then lists the fixes, worst first. Your agent can read it. So can you.

  4. 04 · Clean up

    The test users, deleted

    Every test account comes out of WordPress, Supabase, Stripe or anything behind a webhook, with an itemized receipt. On every plan.

Signup is the email everyone tests. This checks the rest.

Every email gets the basics. Then each kind is held to what it must say. A check without evidence says so and never lowers the grade. In claude.ai the result is a card in the chat, and each step to a better grade has a Do this button.

EmailWhat it checks
Every emailArrival time; SPF, DKIM and DMARC; broken, http and staging links; leaked merge tags like “Hi ,”; a missing plain-text part; duplicates.
Sign-up, reset, magic links and codesLinks that work once and then expire, a wrong code refused, and the “your password was changed” notice every reset owes.
InvitesWho invited them to what, a link to accept, and when it expires. Checked in the invitee’s inbox, not yours.
Notifications and digestsA link to the exact item, not the home page. A way to turn them off. Never an empty digest.
Receipts, invoices and failed paymentsThe amount and currency, a receipt to download, the due date, and a button to update the card.
Trials and security noticesWhen the trial ends and what happens next; times with a timezone; what to do if it wasn’t them.
Your auth provider’s stock emailsSupabase, Firebase, Cognito and WordPress defaults that never name your product. The report includes replacements, written for that provider’s template settings.

Flowproof · drawright · run xmr7wr

A+100 / 100

2 emails with nothing to fix; 2 checks carried forward from earlier runs.

Get to A+

Already A+. Nothing left to do for the top grade.

Top fixes

No fixes needed. Nothing we tested failed.

Proven

  • ✓ Reset link expiry
  • ✓ Verify link works
  • ✓ Verify link reuse
  • ✓ Password reset completes (earlier run)
  • ✓ Reset link reuse (earlier run)

Cleanup receipt

Run xmr7wr

DrawRight

Deleted from DrawRight: 1 user, 1 profile

Every test account this run made is gone.2 removed
What claude.ai shows when a run ends. Share makes a public link to the grade and the fixes: never the test addresses, email contents or project name.

Our own app, DrawRight, in one week

F56 / 100First run

A+100 / 100A week later

What changed: branded emails. Every link proven to work once and refused the second time. The reset link refused after an hour. Test users deleted, with a receipt.

Every email your app can send, on one list

Your agent reads your code for every place mail leaves the app: your email provider, your auth provider’s templates, Stripe’s receipts, the scheduled job behind the weekly digest. Each goes on the project’s email map, with who gets it.

Each run marks what it tested. The map shows every email as planned, built, tested or failed, and “14 of 38 tested” tells you what nobody has checked. Only a finished run can mark an email tested, so the number means something.

When one person’s action emails another, each gets a test address: the invite is checked in the invitee’s inbox, the approval in the owner’s. All of them are cleaned up.

How the email map works →

Email map · Trailhead

14 of 38 tested · 6 planned, 18 built, 14 tested

EmailGoes toStatus
Confirm your emailGoes to new userTested
Password resetGoes to account ownerTested
Your password was changedGoes to account ownerFailed never sent
You’re invited to TrailheadGoes to invited teammateTested
Payment failedGoes to account ownerBuilt, not tested yet
Your trial ends in 3 daysGoes to account ownerBuilt, not tested yet
Weekly digestGoes to each memberPlanned

…and 31 more, grouped by kind on the project’s page.

Still building? Start with the emails.

Most apps launch with signup, a reset and whatever their auth provider sends by default. Tell your agent what the app does before it writes any email. Flowproof plans the rest and holds each one to the bar the report grades on.

  1. Plan the emails

    Tell your agent what the app does: accounts, teams, billing, trials. plan_emails turns that into the emails it needs, who gets each, what sends it and what it must say. They go on the map as planned.

  2. Set up the sender

    check_sender_domain reads your domain’s DNS and gives the exact SPF, DKIM and DMARC records to add for Resend, Postmark, SendGrid, SES, Mailgun or Brevo.

  3. Write them from templates

    Drafts for 17 kinds of email, from the welcome to the failed payment, as HTML with a text part or as React Email. Each is written to pass its own checks.

  4. Add the rules

    A short block for CLAUDE.md, AGENTS.md or your editor’s rules, so your agent builds every new email the same way and tests it before calling the task done.

  5. Test each one as it’s built

    The map moves from planned to built to tested. Emails that wait on a clock, like a trial-ending notice, can be sent now for one test user through a test hook.

claude code · sender check · acme.com
check_sender_domain   domain "acme.com", provider "resend"

2 of 4 ready: add DKIM and DMARC.

SPF          ready     SPF at send.acme.com authorises your provider (include:amazonses.com).
DKIM         missing   add  TXT  resend._domainkey.acme.com  p=<the public key Resend shows>
DMARC        missing   add  TXT  _dmarc.acme.com  v=DMARC1; p=none; rua=mailto:dmarc-reports@acme.com
Return path  ready     send.acme.com sends bounces back to Resend.

The cleanup nobody does

Every test user is born on a Flowproof address, and adapters get the exact list the session minted. They act on those and nothing else. No pattern deletes, no wildcards. Always a dry run first, and an itemized receipt.

AdapterWhat it does on teardown
WordPress / WooCommerceThe companion plugin flags test users, hides them from admin lists and Woo reports, and deletes their users, orders and meta.
Supabase / PostgresA small Edge Function in your project (or a connection string) deletes the run’s rows from the tables you name, then from auth.users.
StripeDeletes the run’s customers, which ends their subscriptions, in test mode or live. Never refunds a payment.
Generic webhookWe POST the session's addresses to your endpoint. You send back a receipt. Covers anything custom.

Coming next: Clerk, Auth0, Firebase Auth, MailerLite, Mailchimp, Kit, HubSpot, Resend, Postmark.

Teardown receipt · s7k2ab
wordpress · users
3
wordpress · orders
2
stripe · customers
3
stripe · subscriptions
1
supabase · auth.users
3
records outside session
0 touched

Completed 2026-09-19 14:02 · dry run reviewed by agent first

12 removed

After you ship, it keeps checking

Email breaks quietly. An API key expires, a DNS record changes, a plugin update drops the verification email. These catch it.

We needed it for our own clients’ sites

We’re The Sky Floor, a small web agency: Alan and Joel Miller, twin brothers who have built and looked after sites and web apps for clients since 2008. Their signup, verification and password-reset emails kept breaking without anyone noticing: a plugin update, a DNS or SMTP change, an expired API key. Checking them by hand meant fake accounts piling up in our clients’ databases. So we built a tool our AI coding agent could use to test those flows and clean up after itself. On its first real run, on a client’s staging site, it found a password reset that never told the account owner their password had changed.

Alan & Joel MillerThe Sky Floor, LLC · Michigan · since 2008theskyfloor.com

Pay for the sprint, not the subscription

You test hard for a few weeks, then you ship. The pricing matches that.

Cleanup is included on every plan, including free. Every test account a run creates is removed from the systems you connect, with an itemized receipt. No plan limit stops a run once it starts, or its cleanup.

PlanPriceWhat you getChoose a plan

Free

no card

Enough to test a real project properly. No card, no trial clock.

$0
  • 1 project
  • 10 test runs a month
  • Cleanup after every run, always included
  • AI wording review on your first 3 runs
  • 7-day report history
  • Email map, templates and sender check
  • Email Flow Grader, unlimited
Create a free account

Flow Pass

no auto-renew

Pay once while you build. We won't charge you again unless you ask.

$29once · 30 days
  • Unlimited test runs (fair use: 200 per pass)
  • 50 AI wording reviews per pass
  • 3 projects
  • 30-day history
  • Extend 30 more days for $19
Get a Flow Pass

Flow Watch

Your flows pass. We keep checking them after launch.

$15/ month
  • 3 flows re-run on a schedule
  • Alerts when a flow breaks or slows down
  • Run-to-run comparison
  • Pull request checks on preview deploys
  • 1-year history
  • Flow Pass run limits included while active
  • Cancel any time
Start Flow Watch

Agency

One caught broken signup on a client site pays for the year.

$99/ month
  • 10 projects
  • 30 watched flows, with pull request checks
  • Test checkout for paid signups
  • Unlimited runs and AI reviews (fair use)
  • 2-year history
Start Agency

Flow Watch and Agency can also be billed yearly, with two months free: $150 and $990 a year.

Stop checking your app’s emails by hand.

Create a free account, connect your AI, and ask it to test every email your app sends. Or grade your emails first, no account needed.