Transactional Email
Transactional email is triggered by a user action. It is expected, often time-sensitive,
and carries higher deliverability expectations than marketing email because it is directly
tied to product functionality. A password reset landing in spam is a product failure.
Related skills: authentication/SKILL.md (dedicated subdomain auth setup),
content/SKILL.md (HTML structure, plain-text requirements),
compliance/SKILL.md (transactional exemptions and their limits)
What Counts as Transactional
Transactional email is triggered by a specific user action and contains information the
user needs as a result of that action. It is not initiated by the sender for commercial
purposes.
Clearly transactional:
- Email/account verification at signup
- Password reset links
- OTP / 2FA codes
- Order confirmations
- Receipts and invoices
- Shipping notifications and tracking updates
- Account alerts (login from new device, password changed, payment failed)
- Subscription renewal confirmations
- Waitlist or reservation confirmations
Gray area (transactional with commercial risk):
- Welcome emails (often have a transactional trigger but are used for onboarding/upsell)
- Trial expiry warnings (triggered by an event but primarily commercial in intent)
- Inactivity reminders (user-data-triggered but sender-initiated in purpose)
When in doubt: if removing the email would break a user's experience of the product,
it is transactional. If it primarily exists to drive revenue or retention, it is marketing.
Why the distinction matters:
- Transactional email is exempt from certain consent requirements (CAN-SPAM, GDPR)
- Mixing promotional content into transactional email can void the exemption
- Transactional and marketing must be on separate sending streams (different subdomains
or IPs) so a spam complaint on marketing never affects transactional delivery
Infrastructure for Transactional Email
Dedicated Sending Stream
- Use a separate subdomain for transactional:
tx.yourdomain.com, mail.yourdomain.com
- Separate from your marketing subdomain:
em.yourdomain.com, news.yourdomain.com
- Configure separate SPF and DKIM records for each subdomain
- If using a shared IP from an ESP, confirm transactional and marketing traffic is
separated at the IP or pool level
Delivery Priority
- Configure your ESP or SMTP relay to prioritize transactional sends
- Use a dedicated API endpoint or separate subaccount for transactional if your provider
supports it
- Do not batch transactional emails, send immediately on trigger
No Rate Limiting for Time-Sensitive Emails
- OTPs, password resets, and login links must send with no delay
- Apply rate limiting at the product level (limit how many resets a user can request per
hour) not at the sending level
- Queue management for transactional: FIFO with highest priority, no batching
OTP and 2FA Emails
One-time passwords sent by email are security-critical. The email must arrive within
seconds and the code must be clearly readable.
Content Structure
- The code, prominently. Large font, centered, easy to copy. Do not bury it.
- Context. What is this code for? Which product, which action.
- Expiry. State clearly: "This code expires in 10 minutes."
- Security note. "If you didn't request this, you can safely ignore this email.
Your account has not been accessed."
- Support link. If the user is confused, how do they get help?
Code Requirements
- Expire codes after 10 minutes maximum. 5 minutes is better for high-security contexts.
- Use cryptographically random codes, not sequential or time-based patterns that are
guessable.
- 6 digits is the standard. 8 digits for higher security contexts.
- Do not put the code in the email subject line. Subject lines are logged in many systems
and visible in notification previews without opening the email.
- Invalidate the code after first use.
- Implement a rate limit: no more than 3-5 OTP requests per hour per account.
Template Example Structure
Subject: Your [Product] verification code
[Product Logo]
Your verification code
[ 123456 ] ← Large, centered, easy to copy
This code expires in 10 minutes.
Enter this code in [Product] to [complete login / verify your email / etc.].
Didn't request this? You can safely ignore this email.
Your account remains secure.
[Contact Support]
Plain-Text Version
Your [Product] verification code: 123456
This code expires in 10 minutes.
Enter this code in [Product] to [action].
Didn't request this? You can safely ignore this email.
Support: https://yourdomain.com/support
Password Reset Emails
Content Requirements
- The reset link, immediately visible. Do not make the user scroll.
- Expiry time. State clearly in the email body: "This link expires in 60 minutes."
- Security acknowledgment. "If you didn't request this, no action is needed. Your
password has not been changed."
- Single-use. The link must be invalidated after use.
- IP or device hint (optional but adds trust). "This was requested from IP 203.x.x.x"
Link Expiry
- Password reset links: 60 minutes maximum
- For sensitive actions (account deletion, payment method change): 15-30 minutes
- State the expiry in the email, if a user comes back 2 hours later and the link is
expired, they should have been warned
Do Not Log Tokens in Subject Lines
The subject line "Here is your password reset link: https://..." exposes the token
in email logs, preview notifications, and push notification systems. Keep the token
in the body only.
Template Example Structure
Subject: Reset your [Product] password
[Product Logo]
Reset your password
Someone requested a password reset for your [Product] account.
[Reset Password] ← Prominent button
This link expires in 60 minutes.
If you didn't request this, you can safely ignore this email.
Your password will not change.
If you're having trouble with the button, copy and paste this link:
https://yourdomain.com/reset?token=[token]
[Contact Support]
Email Verification
Sent when a new user signs up or when they update their email address. This is the
clearest case of a fully transactional email.
Content Requirements
- Clear purpose. "Verify your email address to activate your account."
- Single, prominent CTA. One button. No distractions.
- Fallback link. Always include the URL below the button for clients that block HTML.
- No promotional content. Do not use this email for onboarding upsell.
- Expiry. Verification links should expire after 24-48 hours.
If Verification Is Not Completed
- Send one reminder after 24 hours if the link has not been clicked
- Do not send additional marketing or onboarding email until verification is complete
- After 72 hours of no verification, the account can be flagged as unverified
Order Confirmations and Receipts
Required Information
Every order confirmation must include:
- Order ID or reference number
- Summary of what was ordered (item names, quantities)
- Unit prices and total
- Billing address (or confirmation it matches the account)
- Shipping address (if physical goods)
- Estimated delivery date or timeframe
- Link to order status or tracking
- Customer support contact
Receipts (Digital Products / Services)
- Invoice number
- Billing period (for subscriptions)
- Line items with amounts
- Total charged
- Payment method (last 4 digits only, never full card number)
- Link to download the receipt as PDF if needed for business expenses
Subject Line Patterns That Work
- "Your order #12345 is confirmed"
- "Receipt for $49 - [Product Name]"
- "Order confirmed, ships Thursday"
Do Not Include Promotional Content Above the Fold
A receipt is the highest-trust transactional email you send. Cluttering it with upsell
above the order details breaks trust and may void the transactional exemption if the
promotional content is substantial.
A subtle product recommendation below the order details is acceptable. A prominent
banner above the receipt content is not.
Shipping and Delivery Notifications
Trigger Points
Send a notification at each of these events (based on what your fulfillment system supports):
- Order received and processing
- Order shipped (include tracking number and carrier)
- Out for delivery (if carrier data supports it)
- Delivered
- Delivery exception (delay, failed delivery attempt). This one is often skipped but
has the highest value to customers
Content for Each Stage
Shipped:
- Carrier name and tracking number
- Direct tracking link (deep link into carrier tracking, not just the carrier homepage)
- Estimated delivery date
- Items in this shipment (especially if split shipments)
Delivered:
- Confirmation of delivery time
- Link to order details in case there is a problem
- Clear path to report an issue (damaged, missing item)
Subject Lines
- "Your order has shipped - arrives Thursday"
- "Delivered: Order #12345"
- "Heads up: your delivery was attempted today"
Account and Security Alerts
These are the most important transactional emails for user trust. They must always reach
the inbox.
When to Send
- New login from an unrecognized device or location
- Password successfully changed
- Email address changed (send to both old and new address)
- Payment method added or changed
- Subscription plan changed
- Account deletion requested (with cancellation link)
- Failed payment attempt
Content Requirements
- State what happened, clearly and immediately.
- Include relevant context: device type, location, time, IP (where applicable).
- Provide a clear action if the user did not authorize the change: "If this wasn't you,
[secure your account]."
- Link to account security settings.
- Do not require login to read the email, the security alert is useful even if the
user's account has been compromised.
Tone
- Factual, not alarming. "A new device signed into your account" not
"SECURITY ALERT: Your account may be compromised."
- Alarming subject lines increase stress and, ironically, increase spam complaints
from users who mistake the email for a phishing attempt.
- Match your brand voice but stay matter-of-fact on security alerts.
Billing and Subscription Emails
Upcoming Renewal Notice
- Send 7 days before renewal for monthly plans; 30 days for annual plans.
- Include: renewal date, amount, payment method on file.
- Link to manage subscription or payment method.
- If the plan includes a price change, this must be disclosed clearly and with adequate
notice (30+ days; check local regulations).
Payment Failed
- Send immediately on payment failure.
- Include: what failed, which card was charged, the amount.
- Clear CTA to update payment method.
- State the retry schedule: "We'll try again in 3 days."
- Follow up before service suspension: "Your account will be paused in 24 hours."
Subscription Cancelled
- Confirmation of cancellation.
- Effective date (especially for billing-period-end cancellations).
- What the user retains access to and until when.
- A single, non-pushy option to reactivate.
Promotional Content in Transactional Email
Adding promotional content to transactional email is a gray area with legal and
deliverability implications.
When It Is Acceptable
- Below the fold, clearly separated from the transactional content
- Minor and clearly secondary to the transactional purpose
- Does not change the primary nature of the email
- Example: a receipt with a small "You might also like" section at the bottom
When It Is Not Acceptable
- Promotional content is above the fold or visually dominant
- The transactional content is minimal and the promotion is the real purpose
- The email is sent to contacts who have unsubscribed from marketing
- Example: an "order confirmed" email with a large promotional banner above the order
details, or a minimal "your account is ready" email that is primarily an upsell
The Compliance Risk
If the promotional content is the primary purpose of the email, regulators may classify
the email as commercial rather than transactional, applying full consent and opt-out
requirements. Keep promotions genuinely incidental.
Transactional Email Checklist
Before deploying a transactional email flow:
1---2name: transactional3description: Best practices for designing, writing, and sending transactional email. Always use this skill for transactional email tasks; a password reset or OTP landing in spam is a product failure, not just a deliverability problem, so these emails deserve special care. Use it for: OTP and 2FA emails, password reset flows, email verification, order confirmations, receipts, shipping notifications, account and security alerts, billing emails, subscription events, or any user-triggered notification. Also load it when asked to diagnose why a transactional email is going to spam, or when deciding whether to add promotional content to a system-triggered email.4---56# Transactional Email78Transactional email is triggered by a user action. It is expected, often time-sensitive,9and carries higher deliverability expectations than marketing email because it is directly10tied to product functionality. A password reset landing in spam is a product failure.1112> Related skills: `authentication/SKILL.md` (dedicated subdomain auth setup),13> `content/SKILL.md` (HTML structure, plain-text requirements),14> `compliance/SKILL.md` (transactional exemptions and their limits)1516---1718## What Counts as Transactional1920Transactional email is triggered by a specific user action and contains information the21user needs as a result of that action. It is not initiated by the sender for commercial22purposes.2324**Clearly transactional:**2526- Email/account verification at signup27- Password reset links28- OTP / 2FA codes29- Order confirmations30- Receipts and invoices31- Shipping notifications and tracking updates32- Account alerts (login from new device, password changed, payment failed)33- Subscription renewal confirmations34- Waitlist or reservation confirmations3536**Gray area (transactional with commercial risk):**3738- Welcome emails (often have a transactional trigger but are used for onboarding/upsell)39- Trial expiry warnings (triggered by an event but primarily commercial in intent)40- Inactivity reminders (user-data-triggered but sender-initiated in purpose)4142When in doubt: if removing the email would break a user's experience of the product,43it is transactional. If it primarily exists to drive revenue or retention, it is marketing.4445**Why the distinction matters:**4647- Transactional email is exempt from certain consent requirements (CAN-SPAM, GDPR)48- Mixing promotional content into transactional email can void the exemption49- Transactional and marketing must be on separate sending streams (different subdomains50 or IPs) so a spam complaint on marketing never affects transactional delivery5152---5354## Infrastructure for Transactional Email5556### Dedicated Sending Stream5758- Use a separate subdomain for transactional: `tx.yourdomain.com`, `mail.yourdomain.com`59- Separate from your marketing subdomain: `em.yourdomain.com`, `news.yourdomain.com`60- Configure separate SPF and DKIM records for each subdomain61- If using a shared IP from an ESP, confirm transactional and marketing traffic is62 separated at the IP or pool level6364### Delivery Priority6566- Configure your ESP or SMTP relay to prioritize transactional sends67- Use a dedicated API endpoint or separate subaccount for transactional if your provider68 supports it69- Do not batch transactional emails, send immediately on trigger7071### No Rate Limiting for Time-Sensitive Emails7273- OTPs, password resets, and login links must send with no delay74- Apply rate limiting at the product level (limit how many resets a user can request per75 hour) not at the sending level76- Queue management for transactional: FIFO with highest priority, no batching7778---7980## OTP and 2FA Emails8182One-time passwords sent by email are security-critical. The email must arrive within83seconds and the code must be clearly readable.8485### Content Structure86871. **The code, prominently.** Large font, centered, easy to copy. Do not bury it.882. **Context.** What is this code for? Which product, which action.893. **Expiry.** State clearly: "This code expires in 10 minutes."904. **Security note.** "If you didn't request this, you can safely ignore this email.91 Your account has not been accessed."925. **Support link.** If the user is confused, how do they get help?9394### Code Requirements9596- Expire codes after **10 minutes** maximum. 5 minutes is better for high-security contexts.97- Use cryptographically random codes, not sequential or time-based patterns that are98 guessable.99- **6 digits** is the standard. 8 digits for higher security contexts.100- Do not put the code in the email subject line. Subject lines are logged in many systems101 and visible in notification previews without opening the email.102- Invalidate the code after first use.103- Implement a rate limit: no more than 3-5 OTP requests per hour per account.104105### Template Example Structure106107```108Subject: Your [Product] verification code109110[Product Logo]111112Your verification code113114[ 123456 ] ← Large, centered, easy to copy115116This code expires in 10 minutes.117118Enter this code in [Product] to [complete login / verify your email / etc.].119120Didn't request this? You can safely ignore this email.121Your account remains secure.122123[Contact Support]124```125126### Plain-Text Version127128```129Your [Product] verification code: 123456130131This code expires in 10 minutes.132133Enter this code in [Product] to [action].134135Didn't request this? You can safely ignore this email.136137Support: https://yourdomain.com/support138```139140---141142## Password Reset Emails143144### Content Requirements1451461. **The reset link, immediately visible.** Do not make the user scroll.1472. **Expiry time.** State clearly in the email body: "This link expires in 60 minutes."1483. **Security acknowledgment.** "If you didn't request this, no action is needed. Your149 password has not been changed."1504. **Single-use.** The link must be invalidated after use.1515. **IP or device hint (optional but adds trust).** "This was requested from IP 203.x.x.x"152153### Link Expiry154155- Password reset links: **60 minutes** maximum156- For sensitive actions (account deletion, payment method change): **15-30 minutes**157- State the expiry in the email, if a user comes back 2 hours later and the link is158 expired, they should have been warned159160### Do Not Log Tokens in Subject Lines161162The subject line `"Here is your password reset link: https://..."` exposes the token163in email logs, preview notifications, and push notification systems. Keep the token164in the body only.165166### Template Example Structure167168```169Subject: Reset your [Product] password170171[Product Logo]172173Reset your password174175Someone requested a password reset for your [Product] account.176177[Reset Password] ← Prominent button178179This link expires in 60 minutes.180181If you didn't request this, you can safely ignore this email.182Your password will not change.183184If you're having trouble with the button, copy and paste this link:185https://yourdomain.com/reset?token=[token]186187[Contact Support]188```189190---191192## Email Verification193194Sent when a new user signs up or when they update their email address. This is the195clearest case of a fully transactional email.196197### Content Requirements1981991. **Clear purpose.** "Verify your email address to activate your account."2002. **Single, prominent CTA.** One button. No distractions.2013. **Fallback link.** Always include the URL below the button for clients that block HTML.2024. **No promotional content.** Do not use this email for onboarding upsell.2035. **Expiry.** Verification links should expire after 24-48 hours.204205### If Verification Is Not Completed206207- Send one reminder after 24 hours if the link has not been clicked208- Do not send additional marketing or onboarding email until verification is complete209- After 72 hours of no verification, the account can be flagged as unverified210211---212213## Order Confirmations and Receipts214215### Required Information216217Every order confirmation must include:218219- Order ID or reference number220- Summary of what was ordered (item names, quantities)221- Unit prices and total222- Billing address (or confirmation it matches the account)223- Shipping address (if physical goods)224- Estimated delivery date or timeframe225- Link to order status or tracking226- Customer support contact227228### Receipts (Digital Products / Services)229230- Invoice number231- Billing period (for subscriptions)232- Line items with amounts233- Total charged234- Payment method (last 4 digits only, never full card number)235- Link to download the receipt as PDF if needed for business expenses236237### Subject Line Patterns That Work238239- "Your order #12345 is confirmed"240- "Receipt for $49 - [Product Name]"241- "Order confirmed, ships Thursday"242243### Do Not Include Promotional Content Above the Fold244245A receipt is the highest-trust transactional email you send. Cluttering it with upsell246above the order details breaks trust and may void the transactional exemption if the247promotional content is substantial.248249A subtle product recommendation below the order details is acceptable. A prominent250banner above the receipt content is not.251252---253254## Shipping and Delivery Notifications255256### Trigger Points257258Send a notification at each of these events (based on what your fulfillment system supports):2592601. Order received and processing2612. Order shipped (include tracking number and carrier)2623. Out for delivery (if carrier data supports it)2634. Delivered2645. Delivery exception (delay, failed delivery attempt). This one is often skipped but265 has the highest value to customers266267### Content for Each Stage268269**Shipped:**270271- Carrier name and tracking number272- Direct tracking link (deep link into carrier tracking, not just the carrier homepage)273- Estimated delivery date274- Items in this shipment (especially if split shipments)275276**Delivered:**277278- Confirmation of delivery time279- Link to order details in case there is a problem280- Clear path to report an issue (damaged, missing item)281282### Subject Lines283284- "Your order has shipped - arrives Thursday"285- "Delivered: Order #12345"286- "Heads up: your delivery was attempted today"287288---289290## Account and Security Alerts291292These are the most important transactional emails for user trust. They must always reach293the inbox.294295### When to Send296297- New login from an unrecognized device or location298- Password successfully changed299- Email address changed (send to both old and new address)300- Payment method added or changed301- Subscription plan changed302- Account deletion requested (with cancellation link)303- Failed payment attempt304305### Content Requirements306307- State what happened, clearly and immediately.308- Include relevant context: device type, location, time, IP (where applicable).309- Provide a clear action if the user did not authorize the change: "If this wasn't you,310 [secure your account]."311- Link to account security settings.312- Do not require login to read the email, the security alert is useful even if the313 user's account has been compromised.314315### Tone316317- Factual, not alarming. "A new device signed into your account" not318 "SECURITY ALERT: Your account may be compromised."319- Alarming subject lines increase stress and, ironically, increase spam complaints320 from users who mistake the email for a phishing attempt.321- Match your brand voice but stay matter-of-fact on security alerts.322323---324325## Billing and Subscription Emails326327### Upcoming Renewal Notice328329- Send 7 days before renewal for monthly plans; 30 days for annual plans.330- Include: renewal date, amount, payment method on file.331- Link to manage subscription or payment method.332- If the plan includes a price change, this must be disclosed clearly and with adequate333 notice (30+ days; check local regulations).334335### Payment Failed336337- Send immediately on payment failure.338- Include: what failed, which card was charged, the amount.339- Clear CTA to update payment method.340- State the retry schedule: "We'll try again in 3 days."341- Follow up before service suspension: "Your account will be paused in 24 hours."342343### Subscription Cancelled344345- Confirmation of cancellation.346- Effective date (especially for billing-period-end cancellations).347- What the user retains access to and until when.348- A single, non-pushy option to reactivate.349350---351352## Promotional Content in Transactional Email353354Adding promotional content to transactional email is a gray area with legal and355deliverability implications.356357### When It Is Acceptable358359- Below the fold, clearly separated from the transactional content360- Minor and clearly secondary to the transactional purpose361- Does not change the primary nature of the email362- Example: a receipt with a small "You might also like" section at the bottom363364### When It Is Not Acceptable365366- Promotional content is above the fold or visually dominant367- The transactional content is minimal and the promotion is the real purpose368- The email is sent to contacts who have unsubscribed from marketing369- Example: an "order confirmed" email with a large promotional banner above the order370 details, or a minimal "your account is ready" email that is primarily an upsell371372### The Compliance Risk373374If the promotional content is the primary purpose of the email, regulators may classify375the email as commercial rather than transactional, applying full consent and opt-out376requirements. Keep promotions genuinely incidental.377378---379380## Transactional Email Checklist381382Before deploying a transactional email flow:383384- [ ] Sending from a dedicated subdomain separate from marketing385- [ ] SPF and DKIM configured for the transactional subdomain386- [ ] Send triggered immediately on user action (no batch delay)387- [ ] OTP codes expire within 10 minutes; reset links within 60 minutes388- [ ] Tokens and codes are not in the subject line389- [ ] Plain-text version included alongside HTML390- [ ] All links are full HTTPS URLs (no shorteners)391- [ ] "If you didn't request this" message included on security emails392- [ ] No promotional content above the fold393- [ ] Support contact or link included394- [ ] Tested in Gmail, Outlook, and Apple Mail395- [ ] Spam score checked (mail-tester.com) before deployment