Proxy Mail QA

Common Firebase sign-up and login problems, and how to fix them

Firebase Authentication rarely errors loudly. A verification email that was never requested, a reset email for an address it won’t confirm exists, a user who verified but still looks unverified: each one looks like nothing happened. Here’s what’s going on and what to change.

Updated

Details below are from Firebase’s documentation on 23 October 2026. Check it for current limits. For the basics, what Firebase sends and how to test it, start with Test Firebase Authentication emails.

The email never arrives

Nothing asked for it. createUserWithEmailAndPassword creates the account and sends no email. Your sign-up code has to call sendEmailVerification for the new user. If it doesn’t, the account sits unverified and the tester waits for nothing.

The address has no account. With email enumeration protection, on by default for projects created on or after 15 September 2023, sendPasswordResetEmail sends only when the address belongs to an account, and returns no error when it doesn’t. A reset test with an address that never signed up passes in your app and receives nothing. Sign up first, then reset.

A daily limit ran out. On the free Spark plan, Firebase sends 5 email-link sign-ins a day, 150 password resets and 1,000 verification emails. Passwordless sign-in stops after the fifth test of the day. Add billing (Blaze) for staging, or test email-link sign-in sparingly.

It’s in spam. By default the emails come from noreply@ your project’s firebaseapp.com address, which some inboxes distrust. Set up your own domain in the console’s email templates. A Proxy Mail QA address receives them either way, so you can tell “not sent” from “sent to spam”.

You’re using the emulator. The Auth emulator doesn’t send email: it prints each verification, reset and sign-in link in the terminal where it runs and in the Emulator Suite’s Logs tab, and offers them on a REST endpoint for tests. Test against a real staging project before launch.

Sign-up fails

Sign-in fails with auth/invalid-credential

With enumeration protection, a wrong password and an unknown address give the same error (INVALID_LOGIN_CREDENTIALS, which the web SDK reports as auth/invalid-credential). Tests that expect auth/user-not-found or auth/wrong-password start failing, and so do apps that show a different message for each. Check for the single error instead.

The User object your app holds keeps the emailVerified value it had when the person signed in. After they click the link in another tab, call user.reload(), and user.getIdToken(true) if your security rules or backend read the email_verified claim. Until then, the app and your rules still see an unverified user.

Email-link sign-in finishes in the browser that asked for the link: your app stores the address there (usually in localStorage) and reads it back when the link opens. Open the link on another device or browser, and Firebase’s own guidance is to ask for the address again, to prevent session fixation. That’s expected. Testers should open the link where they started. In a mobile app, the link also has to open the app, which works differently since Dynamic Links shut down: see Firebase email-link sign-in for mobile apps.

Check them all in one pass

  1. Create a fresh Proxy Mail QA address for each scenario: new user, password reset (on an address you’ve signed up), email-link sign-in.
  2. Go through the flow in your app. The link appears on the address’s row within seconds, or never, which tells you nothing was sent.
  3. Look at the row: a link to localhost is flagged, and the inbox shows each email’s sender and checks. checkEmail with expectHost fails a test whose link leads anywhere but your site.
  4. Open the link in the same browser, then check your app shows the user as verified without signing out and in again.

Built with Antigravity or another AI tool? Problems in vibe-coded sign-up and login covers what generated apps usually get wrong on top of these.

Try it on your next sign-up test

Free plan, no credit card. Create an address and watch the code or link arrive.

Create a free accountOpen the app

Questions

Why didn’t Firebase send a verification email after sign-up?

Creating an account with createUserWithEmailAndPassword sends nothing. Your app has to call sendEmailVerification for the new user, and many sign-up forms never do.

Why does a password reset for an unknown address say it worked?

With email enumeration protection, on by default for projects created since 15 September 2023, Firebase sends a reset email only when the address has an account, and never says when it doesn’t. Test resets with an address you’ve signed up first.

The user clicked the verification link. Why does my app still say they’re unverified?

The signed-in user object keeps the state it had at sign-in. Call reload() on the user, and getIdToken(true) if your security rules read email_verified, or sign in again.

How many emails can a free project send?

On the Spark plan, 1,000 verification emails, 150 password resets and only 5 email-link sign-ins a day. Blaze raises them. The full table is in Test Firebase Authentication emails.

Built your app with an AI tool? Pick yours

Firebase is a trademark of Google LLC. Proxy Mail QA is independent and isn’t affiliated with or endorsed by them.