When to use this
Right after signup, before the address earns any trust. Link-based verification suits account flows where the user clicks once and moves on; if your flow needs a short code typed into the app instead, use the OTP template. The difference matters: a link verifies an address, a code verifies a session. Plenty of products need both, at different moments.
Design rules a verification email should follow
One button with an unambiguous label, and the same URL as plain text underneath for the clients that break buttons. A generous expiry stated honestly; hours, not minutes, because unlike a password reset the reader may not be actively waiting. And a calm "didn't create an account?" line. Verification emails routinely land with strangers whose address someone mistyped, and the difference between "you can safely ignore this" and silence is the difference between an ignored email and a spam report against your domain.
The template
Copy-ready, table-based so it renders everywhere, inline styles only. Swap the {{placeholders}} for your values or your template engine's variables.
<!DOCTYPE html>
<html lang="en">
<body style="margin:0;padding:0;background:#f4f5f7;font-family:Arial,Helvetica,sans-serif;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f4f5f7;padding:24px 0;">
<tr><td align="center">
<table role="presentation" width="440" cellpadding="0" cellspacing="0"
style="background:#ffffff;border-radius:8px;padding:32px;">
<tr><td style="font-size:18px;font-weight:bold;color:#111;padding-bottom:8px;">
{{company_name}}
</td></tr>
<tr><td style="font-size:14px;color:#444;line-height:1.5;padding-bottom:20px;">
Confirm that {{user_email}} is yours and your account is good to go.
This link expires in {{expiry_hours}} hours.
</td></tr>
<tr><td align="center" style="padding-bottom:20px;">
<a href="{{verify_url}}"
style="display:inline-block;background:#111;color:#ffffff;text-decoration:none;
font-size:15px;font-weight:bold;border-radius:6px;padding:13px 28px;">
Verify email address
</a>
</td></tr>
<tr><td style="font-size:12px;color:#666;line-height:1.6;padding-bottom:16px;">
Button not working? Paste this link into your browser:<br>
<a href="{{verify_url}}" style="color:#3b6ecc;word-break:break-all;">{{verify_url}}</a>
</td></tr>
<tr><td style="font-size:12px;color:#888;line-height:1.5;">
Didn't create an account? Someone probably typed their address wrong.
You can safely ignore this email and nothing will happen.
</td></tr>
</table>
<table role="presentation" width="440" cellpadding="0" cellspacing="0">
<tr><td style="font-size:11px;color:#999;padding:16px 8px;text-align:center;">
Sent by {{company_name}} · {{company_address}}
</td></tr>
</table>
</td></tr>
</table>
</body>
</html>The list-quality half: why this email pays for itself
Every address that never clicks this button is an address that never enters your marketing list. That's the entire logic of double opt-in, and it's cheap insurance: a typo that bounces here is one quiet hard bounce on a transactional stream, suppressed and forgotten. The same typo waved through to your list bounces in every campaign you send, and campaign bounce rates are what mailbox providers grade you on. Verification is list hygiene applied at the door instead of mopped up later.
The email itself needs to arrive, obviously, and an unauthenticated "click this link" email is textbook spam-filter bait. Keep SPF, DKIM, and DMARC aligned and send verification on your transactional stream. If verification mail is going to spam, your signup funnel is silently leaking; run the free deliverability check before touching the template.
Related
- Welcome template: the email that follows a successful verification
- OTP Verification template: code-based flows
- Double Opt-In: the mechanism this email implements
- List Hygiene: what it protects downstream