Mailerflow Start free
Blog › Transactional Email & Developer Tools › Transactional Email Templates

Password Reset Email Templates and Best Practices

Published October 18, 2026 · Updated October 18, 2026 · 10 min read

Illustration for Password Reset Email Templates and Best Practices

A password reset email template has one job: get the right person to a single-use link, quickly, without making them wonder whether the message is real. Everything else — the greeting, the device line, the footer — supports that. If you are building system email for a product, this guide gives you four copy-ready templates, the variables that are actually worth inserting, subject line and preview text pairs, and the security details that separate a reset flow that works from one that leaks accounts.

What a password reset email has to do

Every reset email must communicate three things, in this order:

  1. What happened — someone requested a password reset for this account.
  2. What to do — click the link, or ignore the message.
  3. How long it lasts — the link expires, and the user should know when.

The "if you didn't request this" line is not optional. It is the only signal a user has that their account may be under attack, and it is the sentence that turns a confusing email into a security notification. Without it, a user who did not request a reset either ignores the message (missing a real compromise) or panics.

Reset emails belong to the account emails cluster, alongside verification emails, magic link and passwordless sign-in, new device and security alerts, and account deletion notices.

One structural decision matters before you write a word of copy: reset mail should travel on a transactional lane, not through your campaign stream. If a user unsubscribes from your newsletter, they must still receive a reset link. Keeping the two streams separate also protects reset latency when a large campaign is sending.

If you are still deciding where to send from, see the Best Email Marketing Platforms compared side by side, with prices checked daily on each provider's own pricing page.

When to use these password reset email template

The trigger determines the template. There are four cases worth distinguishing, and using one generic reset email for all of them is a common source of confusion.

User-initiated reset. The user clicked "Forgot password" and expects the email. Speed and clarity matter most; the tone can be neutral and brief.

Admin-initiated reset. A support agent or workspace owner triggered a reset for a managed account. The recipient did not ask for it, so the email has to explain who initiated it and why, and give them a path to question it.

Security-triggered reset. Your system detected suspicious activity — a login from an unusual location, a credential-stuffing pattern, a leaked credential match. This email carries more weight: it should state the reason, and it should assume the user may not have access to the account right now.

Invite or first password set. The account exists but has no password yet. This is technically not a reset, but it uses the same mechanics and the same template skeleton. Label it as "set your password," not "reset," or new users will wonder what they forgot.

A note on temporary passwords: avoid them unless your system forces it. A temporary password sent by email is a shared secret sitting in an inbox, and it usually comes with a forced change on first login, which is a worse experience than a single-use link. Use a link with a short expiry instead.

Where the email is sent from matters here. A transactional lane keeps reset mail out of the campaign stream and out of unsubscribe state. Mailerflow's transactional email API runs on a high-priority lane with templates and variables, which is one way to keep reset traffic isolated from marketing sends.

The templates (copy and adapt)

All four templates use the same skeleton: greeting, action sentence, button, raw URL fallback, expiry line, context line, "didn't request this" line, signature. The raw URL belongs under the button as selectable text, because some clients strip or rewrite links, and some users copy the URL into a different browser.

Placeholders are written as {{variable}} so they are easy to map to your templating layer.

1. Standard user-initiated reset

Subject: Reset your {{product_name}} password Preview text: The link works for {{expires_in}}. If you didn't ask for this, ignore it.

Hi {{first_name}},

We got a request to reset the password for your {{product_name}} account.

Reset your password:
{{reset_url}}

This link expires in {{expires_in}} and can only be used once.

Requested {{request_time}} from {{device}} near {{ip_city}}.

If you didn't request this, you can ignore this email — your password
won't change. If you're worried, reply to this message and we'll help.

— The {{product_name}} team

Adapt when: this is your default. Keep it short. If your product has a support address, use it in the last line instead of a no-reply address.

2. Admin-initiated reset for a managed account

Subject: {{admin_name}} started a password reset for your account Preview text: You'll need to set a new password before your next sign-in.

Hi {{first_name}},

{{admin_name}} from {{workspace_name}} started a password reset for your
account. This usually happens when someone on your team needs to hand
over access or when a sign-in problem needs a clean start.

Set a new password:
{{reset_url}}

This link expires in {{expires_in}} and can only be used once.

Requested {{request_time}} by {{admin_name}} ({{admin_email}}).

If you weren't expecting this, don't use the link. Contact
{{admin_name}} or reply to this email and we'll look into it.

— The {{product_name}} team

Adapt when: your product has shared workspaces, agencies managing client accounts, or IT-managed seats. Naming the admin is the trust signal; without it the email reads like a phishing attempt.

3. Security-triggered reset

Subject: We've locked your {{product_name}} account — reset your password Preview text: We saw unusual sign-in activity. Reset your password to regain access.

Hi {{first_name}},

We detected unusual sign-in activity on your {{product_name}} account
and locked it as a precaution.

Reset your password to regain access:
{{reset_url}}

This link expires in {{expires_in}} and can only be used once.

What we saw: a sign-in attempt from {{device}} near {{ip_city}} at
{{request_time}}.

If this was you, reset your password and you're back in. If it wasn't,
reset your password first, then review your active sessions and
connected apps.

— The {{product_name}} team

Adapt when: you have a security incident, a credential leak, or an automated risk rule. Do not soften the language — users need to understand this is not routine.

4. Invite / first password set

Subject: Set your {{product_name}} password Preview text: One step left — choose a password and you're in.

Hi {{first_name}},

{{inviter_name}} invited you to {{workspace_name}} on {{product_name}}.
Set a password to finish setting up your account:

{{reset_url}}

This link expires in {{expires_in}} and can only be used once.

If you weren't expecting an invitation, you can ignore this email and
nothing will happen.

— The {{product_name}} team

Adapt when: invited seats, beta access, or any account created on someone else's behalf. The inviter's name is the trust signal here, not yours.

How to personalize them

The variables that help are the ones that answer "is this really about me?" — not the ones that sell.

  • {{first_name}} — greeting. Always have a fallback so the sentence reads naturally when the field is empty. "Hi ," is worse than "Hi there,".
  • {{product_name}} — the product the user knows, not the internal service name.
  • {{request_time}} — in the user's timezone. A timestamp in UTC makes a 9 a.m. request look like a 2 a.m. one.
  • {{device}} and {{ip_city}} — approximate location and device family. Approximate beats a full IP address for most products: it is readable, less alarming, and still enough for a user to spot a foreign request.
  • {{expires_in}} — the window, in plain language ("30 minutes"), not a timestamp the user has to compare against their clock.

What not to personalize: no marketing segments, no product recommendations, no engagement-based content. A security email is not a channel for anything else, and mixing the two trains users to skim.

If you are generating the layout rather than the copy, Mailerflow's AI email builder takes a description and returns a responsive design with subject lines and preview text, which is useful when the same reset template has to match an existing brand system. The developer docs cover the API side if you are wiring the template into your own service.

Subject lines and preview text to pair with them

Template Subject line Preview text What it's doing
Standard reset Reset your {{product_name}} password The link works for {{expires_in}}. If you didn't ask for this, ignore it. Names the action, sets the window
Admin-initiated {{admin_name}} started a password reset for your account You'll need to set a new password before your next sign-in. Names the human, removes surprise
Security-triggered We've locked your {{product_name}} account — reset your password We saw unusual sign-in activity. Reset your password to regain access. States the consequence, stays factual
Invite / first set Set your {{product_name}} password One step left — choose a password and you're in. Removes "reset" framing

Rules that hold across all four:

  • Name the action. "Reset your password" beats "Password reset request notification" because the user knows what to do before opening.
  • Avoid "Urgent!!!" and stacked exclamation marks. Real security mail is calm.
  • Keep the subject short — many mobile clients truncate around 60 characters — so the useful part stays visible.
  • Never let the preview text repeat the subject. The preview is the second half of the sentence, not a summary of the first.

Security and deliverability details that matter

These are the rules that keep a reset flow from becoming an incident.

  • Single-use tokens. Invalidate the token after use and after a new request. If a user requests a second reset before using the first, the first link must stop working.
  • Expiry. A common rule of thumb is 15–60 minutes; pick based on risk. Shorter for security-triggered resets, longer for invites.
  • Rate-limit reset requests per account and per IP. Without it, your reset endpoint is a free enumeration and mail-bombing tool.
  • Never include the password, a partial password, or the old password. No exceptions.
  • Don't leak account existence in the API response. Return the same neutral confirmation whether or not the email exists, and send the email only when it does.
  • Authenticate the sending domain with SPF, DKIM and DMARC. Reset mail that lands in spam is a support ticket. Mailerflow's guided DKIM, SPF and DMARC setup with automatic verification, plus automatic suppression of bounces and complaints, covers this side if you would rather not manage DNS records by hand.
  • Keep reset traffic on its own sending stream, separate from campaigns, so a large campaign send does not delay a reset.
  • Log reset requests for audit, but never store tokens in plaintext logs.

Mistakes to avoid

  • No expiry stated. The user has no idea whether the link is still good, so they either rush or give up.
  • A link that expires before the user opens the email. For invites, a 15-minute window is usually too tight — give users more time to open the email.
  • A reset link that also logs the user in. Reset the password, then require a fresh sign-in. Auto-login on a reset link is a session fixation risk.
  • "Click here" as the only link text. Screen readers and users scanning the email both lose the context.
  • No plain-text version. Some clients and some corporate gateways strip HTML.
  • No "didn't request this" guidance. The user has no next step and no way to report it.
  • Sending from a no-reply address with no help path. If the user is worried, they need somewhere to go.
  • Burying the button under a long explanation. The button goes above the fold, in the first screen of the email.
  • Using the same template for reset and account verification. They are different actions with different expectations.
  • Not handling a second reset request before the first is used. Decide the behavior explicitly and tell the user which link is valid.
  • Forgetting mobile. The button must be tappable at thumb size, and the raw URL must wrap instead of overflowing.

FAQ

How long should a password reset link be valid? A common rule of thumb is 15–60 minutes; pick based on risk. Use the shorter end for security-triggered resets and the longer end for invites, where the user may not open the email immediately.

Should the reset email say whether the account exists? No. Return the same neutral confirmation page whether or not the address is registered, and only send the email when it is. This prevents account enumeration.

Can I use a temporary password instead of a link? You can, but a link is better. A temporary password sits in an inbox as a shared secret and usually forces a change on first login, which is more friction, not less.

Should the reset email be plain text or HTML? Send both. HTML for the button and layout, plain text as the fallback for clients and gateways that strip HTML.

How do I stop reset emails going to spam? Authenticate your domain with SPF, DKIM and DMARC, send from a consistent subdomain, and keep reset traffic separate from campaigns. Suppress bounces and complaints automatically so your sending reputation stays clean.

Do I need a separate template for mobile? No. Use one responsive template with a tappable button and a wrapping raw URL. A separate mobile template doubles the maintenance for no gain.

Where this fits in the account emails cluster

Other system messages you will need alongside the reset flow:

  • Email verification templates — confirming a new address, with resend handling and expiry.
  • Magic link and passwordless sign-in — link-based auth where the link is the credential, not a reset.
  • Security alert and new device notification emails — the messages that fire after a sign-in, not before.
  • Welcome and onboarding emails — the first messages after account creation.
  • Account deletion and data export emails — confirming destructive or data-related actions.

Pick the template that matches your trigger, replace the placeholders, and test the expiry path — request a reset, wait past the window, and confirm the link fails cleanly with a useful error page. That last test catches more bugs than any copy review.

When you are ready to wire the reset flow into your service, the Mailerflow transactional email API gives you scoped keys, idempotency keys, an OpenAPI spec, code samples and a JS SDK, so a retried request does not send a second reset email.