What breaks

Password reset not working: find the cause

The reset email arrives, the link says it has expired or does nothing, and the person is locked out. This page shows how to tell a spent link, a broken link and a browser mismatch apart, and what a simulated visitor can confirm.

5 visitors try to .
First test free with an accountRun it from your coding agent

Why is my password reset not working?

A password reset link usually fails for one of a few reasons: an automated scan spent the one-time token before the person tapped it, the link was cut or built with the wrong host, or the reset page depends on the browser that asked for it. Request a new reset, then read the link text in the email and compare it with your live address and its full length. A simulated visitor with its own account requests a reset, opens the email from its inbox and sets a new password, and the run records each step with a screenshot.

What this looks like in a report

Who
Yasmin, locked out of an invoicing app before a deadline
How they arrived
Opened the invoicing app from a bookmark
Where they stopped
Reset page, after opening the link from her email

“The email came in seconds, but when I tapped the link it said the link had expired. I had only just opened it. I asked for another one, tapped it on my laptop, and got the same message.”

The fix. Check the reset token when the page opens, but use it up only when the new password is submitted, so an automated link check cannot spend it. Then request a reset from a laptop, open the email on a phone, and confirm the new password signs in.

An illustration. Run a test to see your own.See a real sample report

A reset link can fail before the person who asked ever taps it

The user asks for a reset, gets the email within moments, and taps the link. The page says the link is invalid or expired, and a second request gives the same result. Some of these links are opened first by a mail gateway that scans links in incoming mail, and a one-time token can be spent by that scan. Others are cut by an email client that wraps a long address, or built with a staging host the phone cannot reach. An owner who tests from a laptop, in the browser that asked for the reset, usually sees it work.

  • Does the link show as expired within moments of the email arriving, before anyone tapped it?
  • Does the link in the email start with your live address and run to the end without a line break?
  • Does the reset page work in the browser that asked for the reset, and fail in a different one?
  • Does the form reject a new password with a message that names the rule it broke?
  • Does a second request send no email and show a too many attempts message?

A scanner that opens the link first can spend a single-use token

Mail gateways and some security tools open the links in an incoming message to check them. A reset link that is valid for one use is spent on that first visit. When the person taps the link, the page finds a used token and says the link has expired. The server log can show it: a request from an unfamiliar browser or a data center address arrives moments after the email was sent, and the person's own visit comes second and fails.

The fix is to stop spending the token on a page load. Check the token when the page opens, then spend it only when the new password is submitted. A prefetch reads the page and leaves the token alone, and a real tap still works. Test that by opening the link once without submitting, then completing the reset from the same link.

A link cut by the email client or built with the wrong host

A long link can break in the mail client. A line wrap can insert a space, a full stop can attach itself to the token, or a copied link can lose its last characters. The page then receives a token one character short and reports it as invalid, which looks the same as an expired link. Open the email's link text and compare its length and its last characters with the link the app generated.

The host is the other common break. A reset link built from a staging address or localhost opens nothing on a phone, while a link that starts with your live address works. Read the start of the link in the message. It should match the address your users type, with no preview name in front. The setting that builds it is usually a base address in the app's configuration, and that value often differs between environments.

The reset page works in one browser and fails in another

Some apps tie the reset form to a cookie set when the reset was requested. If the link opens in a different browser, such as a phone when the request came from a laptop, the form sees no matching cookie and rejects the submit, sometimes with a message that never mentions cookies. The person then assumes the link is broken. Test both places: request the reset on a laptop, open the email on a phone, and submit the form.

A new password can also fail quietly. A form that checks length, a symbol and repeated characters may show its rule under the field, out of view on a phone. A password manager can generate a password that breaks one rule, and the person sees only a field that will not save. Show each rule beside the field, and name the one that failed.

What you get with Mimiq

  1. 01

    Run it by hand, or on every pull request

    Paste a link and a task in the app and watch the visitors work. Or run them on every preview deploy: the GitHub Action comments on the pull request, any other CI can call the MCP endpoint, and your coding agent can run it too.

  2. 02

    Bugs and usability problems in one report

    The browser records errors and failed or slow requests on the step they happened. The visitors say where the wording or the steps confused them, and where they left.

  3. 03

    Visitors that behave like your audience

    Each visitor is a different profile with a reason to be there, matched to who the page is for, described by you, or built from your own customers.

  4. 04

    A prompt to fix each problem

    Every problem comes with a fix to paste into Cursor, Claude Code, Lovable or any coding agent, and one prompt hands over the top problems at once. Then send the same visitors through again.

  5. 05

    Follow every visitor

    See each visitor's whole path, step by step with screenshots, and what it was thinking at every step. Ask any visitor a question.

The browser records relevant JavaScript errors and failed or slow app requests encountered during the run, attached to the step where they occurred. The visitors are simulated: they find problems, they do not predict how many real people will convert.

A login change or a new email template can break resets again

A changed login rule, a new email template or a move to a different mail service can break resets again, while sign in and signup still work. Rerun the reset from a new account after each change, from a laptop and a phone, and read the link before tapping it. Owners also test a web app behind a site password and check each preview deploy first.

Starter

Try it on one launch

$9 once
120 credits, never expire

About 4 tests of 5 visitors

  • Visitors on your landing page, signup and checkout
  • Where they left and why, with a fix to copy for each problem
  • Run it in the app or on every pull request
  • Ask any visitor a question, included
  • Test accounts and protected previews
Buy 120 credits

Builder

Test every build

$19 a month
500 credits every month

About 20 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Builder

Pro

Test every release, as a team

$49 a month
1,500 credits every month

About 60 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Pro

Scale

Test at scale, every day

$149 a month
6,000 credits every month

About 240 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Priority support
  • Cancel anytime
Choose Scale
$0for your first test, with a free account (Google sign-in, no card). It includes 50 credits, enough for 10 visitors. After that a visitor uses 5 credits, and packs start at $9 for 120 credits.
See a sample report

Questions

Why does the reset email arrive but the link says expired?

The most common cause is an automated link check that opened the link before you did, which spent a one-time token. A cut link can also read as expired. Request a new reset, tap the link straight away, and check the server log for a first visit that came from a scanner.

Can a simulated visitor check the reset from start to finish?

It can, when the visitor has a test account you give it, which takes paid credits. It requests the reset, opens the message from its inbox, sets a new password and signs in again. It cannot tell you how a customer's mail gateway treats the link, so a scanner that spends a token is not something the run can reproduce.

Should reset links expire quickly?

A short expiry limits how long a leaked link works, and a long one gives people time to open it after a delay. Pick a window that suits the product, and pair it with single use so a link cannot be reused. Changing the window is a security choice, so review it with whoever owns the login rules.

Does the test check my reset emails for spam?

It shows whether the reset email reached the visitor's inbox and whether the link opens from it. It cannot tell you how other providers file your messages, or how a mail gateway handles the link before a person opens it.

Keep reading

Send visitors and see what breaks first.

Your first test is free: sign in with Google and it starts right away. Last checked 2026-11-02.

5 visitors try to .