The password reset email is the one message where you have no room to be clever. Someone is locked out of your product right now. They are stressed, probably on a phone, and they clicked "forgot password"because they need back in. The email that follows has exactly one job: get them a working link, fast, and get out of the way. This guide covers the subject line, where the link goes, how to state the expiry, what to say when the user did not request the reset, why the plain-text version is not optional, and why a spike in reset requests is a product signal worth reading.
A password reset email has exactly one job.
Most transactional emails can carry a small amount of secondary content without harm. A receipt can confirm what a plan includes; a welcome email can point to a first step. The reset email is different. The recipient is not curious or open to a nudge. They are shut out, mildly annoyed, and want the problem gone. Anything that delays the link, even a friendly sentence about your mission, works against the reader.
This is also among the highest-attention emails you will ever send. The user requested it seconds ago and is watching their inbox for it, which is why reset emails are opened at rates no marketing campaign approaches. That attention is not an invitation to sell. It is a reason to be fast, plain, and correct, because a reset email that fails leaves a paying user unable to log in, and that is not a recoverable moment. For how this email fits the wider picture, see our guide to transactional email best practices for SaaS.
The subject line should say exactly what it is.
Name the action and the product: "Reset your Northwind password." A locked-out user scans their inbox under time pressure, and a subject line that reads like a description helps them spot the email in a second. The moment you optimize the subject for engagement, with something like "One step away from getting back in," you make it look like marketing and slow the recognition that is the whole point. Keep it short so it survives truncation on a narrow screen, and never bury the word "password" that the user is literally searching for.
Lead with the link, right after the greeting.
The reset link is the email. Put it first, before any explanation, reassurance, or brand voice. A stressed reader should see the greeting, then the button, and nothing in between. Word the button as the action it performs, "Reset your password," not a generic "Continue" that leaves any doubt about where it goes. If your design system wants a line of context, put it under the button, not above it. The rule is simple: no one should have to scroll to find the thing they clicked send to get.
State the expiry window in plain words.
If the link expires, tell the user when, in words, right next to the button. "This link works for the next 60 minutes" answers the question before it is asked. A window of roughly 15 to 60 minutes is common: long enough for a distracted user to finish, short enough to limit exposure if the email is forwarded. The exact number matters less than stating it.
Then design the expired case, because a meaningful share of users will click after the window closes. A dead link should not land on a blank error. It should land on a page that says the link expired and offers a single tap to send a fresh one. That one screen removes a large slice of reset-related support volume, and it is the difference between a minor delay and an abandoned login.
Tell the user what to do if they did not request this.
Every reset email reaches some people who never asked for it: a mistyped address that happens to be real, a shared family inbox, or someone poking at your login form. Those recipients need one calm sentence, and its framing is a security decision. Say plainly that if they did not request the reset they can ignore the email, their current password still works, and nothing has changed. That is true, because requesting a reset does not change anything until the link is used, and saying it defuses the panic an unexpected reset email can cause.
Give a path for the one case that genuinely warrants concern: repeated unrequested resets, which can indicate someone testing the account. Invite those users to reply or contact you so you can look into it. What you must avoid is the opposite failure, implying that a single stray request means the account is already compromised. That overstatement generates support tickets and erodes trust for a situation that is almost always harmless.
Good and bad reset email copy, in full.
The gap between a weak reset email and a strong one is easy to see side by side. The weak version leads with brand voice, buries the link, never states the expiry, and tacks on a promotional line. The strong version is shorter, faster to act on, and covers the not-me case.
Weak version
Subject: You are one step away from getting back in
Hi there,
We are thrilled to have you in the Northwind community. Our mission is to help teams do their best work, and staying connected matters to us. If you ever run into trouble, we are here for you.
Ready to continue? Tap the button below.
[ Get back in ]
While you are here, have you seen our new integrations? Read the blog for tips and product news.
Strong version
Subject: Reset your Northwind password
Hi Sam,
Use this link to choose a new password:
[ Reset your password ]
The link works for the next 60 minutes. After that, request a new one from the sign-in page.
If you did not ask for this, you can ignore this email. Your current password still works and nothing has changed. If these keep arriving and they are not from you, reply and let us know.
Northwind, [your mailing address]
This is the one email that must never miss the inbox.
A marketing email that lands in spam is a lost impression. A password reset that lands in spam is a paying customer who cannot log in. That is why reset email deliverability deserves more care than anything else you send. Authenticate the sending domain properly with SPF, DKIM, and DMARC, keep transactional mail off any domain you also use for promotional blasts, and watch bounce and complaint rates on the reset stream specifically. If a marketing campaign ever damages your sending reputation, you do not want it to take your resets down with it.
The plain-text version is not optional.
Send the email as multipart, with a real plain-text part alongside the HTML. Some corporate gateways strip HTML, some clients render text only, and the text part is more reliable for screen readers. Put the full reset URL in the text part as visible characters the user can copy, not hidden behind a button that does not exist in plain text.
There is a production failure mode here that catches many teams: security gateways and link scanners often pre-fetch every URL in an inbound email to check it for malware. If your reset token is single-use and consumed on a GET request, the scanner "clicks" the link before the human does and the user arrives at an already-spent token. The fix is to make the emailed link land on a page that requires a human action, a form the user submits, before the token is consumed, rather than resetting state on the initial GET. The same delivery and rendering rules apply if you move to passwordless sign-in; see magic link email best practices for the token-handling details. For the full authentication walkthrough, see our guide to email deliverability for SaaS.
A spike in password resets is a product signal.
Here is the part most teams miss. A password reset request is not only an auth event; it is a behavioral event, and read the right way it tells you something about your product. When a long-dormant user suddenly requests a reset, that is often a returning customer who forgot their password precisely because they had not needed it in months. That is a re-activation moment, and it is worth treating like one rather than letting the reset email be the only contact you make.
A cluster of resets is worth reading differently. A sudden rise across active users right after you shipped a login change is usually a UX regression, not a coincidence: a confusing SSO-versus-password choice, an email mismatch, or a broken remembered-session. Resets are one of the few places where an email your engineers built and a product decision your team made show up in the same number. If you capture "password_reset_requested"as a product event on the customer profile, next to last-seen and activation data, both of these patterns become visible instead of hiding inside your auth provider's logs.
This is where the email layer and the analytics layer stop being separate systems. GetFluxly records the reset trigger as an event on the profile, which lets you spot the dormant user who just came back and the reset spike that followed a release, and route sending through the ESP you already trust, whether that is Resend, AWS SES, or another SMTP relay. The reset email still does its one job. The event it generates does a second one.
Password reset email best practices, answered.
What should a password reset email say?
A password reset email should say what it is in the subject line, put the reset link as the first thing after the greeting, and state exactly how long the link is valid. It should also tell the user what to do if they did not request the reset, which is usually to ignore the email because nothing has changed. Everything else, including product news and feature mentions, is out of place in this email. The user is locked out and stressed, so the email has one job and should do only that.
How long should a password reset link be valid?
A common window is 15 to 60 minutes, long enough for a distracted user to finish but short enough to limit the risk if the email is forwarded or intercepted. The exact number matters less than stating it clearly in the email. Whatever you choose, say it in plain words: 'This link works for the next 60 minutes.' If the link has already expired by the time the user clicks, the landing page should offer a one-tap way to request a fresh one rather than showing a dead end.
What is the best subject line for a password reset email?
The most useful subject line names the action and your product, for example 'Reset your Northwind password.' Recognition beats cleverness here because the user is scanning their inbox under time pressure and needs to find this specific email fast. Avoid vague or promotional phrasing like 'One step away from getting back in,' which reads like marketing and slows recognition. Keep it short so it does not get truncated on a phone.
Should a password reset email include a plain-text version?
Yes. Send the email as multipart with both an HTML part and a plain-text part. Some corporate mail gateways strip or rewrite HTML, some users read in plain-text clients, and screen readers handle a clean text part more reliably. The plain-text version should carry the full reset URL as visible text, not hidden behind a button, so the user can copy it if the HTML fails to render.
What should the email say if the user did not request a password reset?
It should reassure them plainly: if you did not ask to reset your password, you can ignore this email, your current password still works, and nothing has changed. This framing matters because an unexpected reset email can read as a sign of a breach and cause panic. Give a next step for the case that worries people, which is repeated unrequested resets: invite them to contact you so you can look into it. Never imply the account is already compromised when a single stray request is almost always harmless.
Do password reset emails need an unsubscribe link?
No. A password reset is a transactional message triggered by the user's own action, so it is exempt from the opt-out requirement under CAN-SPAM and similar rules, and an unsubscribe link would be actively harmful because users must always be able to receive it. What you should still include is a real sending identity and a way to reach you. For the broader rules on where the transactional line sits, see our guide to transactional email best practices for SaaS.
A password reset email is the plainest email you will ever write, and that is the point. Say what it is, lead with the link, state the expiry, cover the not-me case, and make sure it reaches the inbox every single time. Do that and you have built the most reliable email in your product. Then read the reset requests as the product signal they are, and you have turned your least glamorous email into one of your most useful.