Skip to main content

Emails

Many screens are reached from an email link rather than from another screen. Hover an email name for a preview of the email; hover a route for the screen it lands on. Subscription Platform emails are out of scope, except two that land on an accounts screen.

Templates: libs/accounts/email-renderer/src/templates/. Links are built by libs/accounts/email-renderer/src/renderer/email-link-builder.ts.

Map

Emails by landing screen

Landing routeEmailsSent when
/verify_emailverify, verifyPrimary, verificationReminderFirst, verificationReminderSecond, verificationReminderFinalLink-based account or primary-email confirmation, and reminders at 1, 5, and 15 days. Current sign-up uses codes.
/complete_signinverifyLoginConfirm a sign-in from a new device by link.
/report_signinunblockCodeCustoms blocked a sign-in; the code unblocks, the link reports.
/complete_reset_passwordrecoveryLink-based password reset. Current reset uses a code.
/reset_passwordpasswordChanged, passwordReset, postChangeRecoveryPhone, postRemoveRecoveryPhonePassword or recovery phone changed; "wasn't you?" link.
/settings/change_passwordpasswordChangeRequiredSuspicious activity; password change is mandatory.
/settings/two_step_authentication/replace_codeslowRecoveryCodesFew backup codes left.
/settingsnewDeviceLoginSign-in from a new device.
/settingspostAddTwoStepAuthentication, postChangeTwoStepAuthentication, postRemoveTwoStepAuthentication, postNewRecoveryCodes, postConsumeRecoveryCodeTwo-step authentication and backup code changes.
/settingspostAddRecoveryPhone, postSigninRecoveryPhone, postSigninRecoveryCodeRecovery phone added or used; backup code used.
/settingspostAddAccountRecovery, postChangeAccountRecovery, postRemoveAccountRecovery, passwordResetAccountRecovery, passwordResetWithRecoveryKeyPrompt, passwordResetRecoveryPhoneAccount recovery key created, changed, removed, or used.
/settingspostAddPasskey, postRemovePasskey, postAddLinkedAccountPasskey registered or removed; Google or Apple account linked.
/settingspostChangePrimary, postVerifySecondary, postRemoveSecondaryPrimary or secondary email changes.
/settingsinactiveAccountFirstWarning, inactiveAccountSecondWarning, inactiveAccountFinalWarningAccount scheduled for deletion due to inactivity.
/connect_another_devicepostVerify, cadReminderFirst, cadReminderSecondWelcome after confirmation; nudges to set up a second device.
/post_verify/finish_account_setup/set_passwordsubscriptionAccountReminderFirst, subscriptionAccountReminderSecondAccount created by a subscription purchase has no password yet.
none, code typed on the current screenverifyShortCode, verifyLoginCode, passwordForgotOtp, verifySecondaryCode, verifyAccountChange, passwordlessSigninOtp, passwordlessSignupOtpOne-time codes.
noneadminResetAccountsAdmin-initiated bulk password reset notice.
Query parameters on email links
  • /verify_email and /complete_signin: code, uid, optionally service, redirectTo, resume. Reminders add reminder=first|second|final.
  • /complete_reset_password: uid, token, code, email, resume, emailToHashWith, optionally service and redirectTo.
  • /reset_password, /settings/change_password: email.
  • /settings and its fragments: email, uid.
  • /settings/two_step_authentication/replace_codes: low_recovery_codes=true, email, uid.
  • /report_signin: uid, unblockCode.
  • /post_verify/finish_account_setup/set_password: email, product_name, token, product_id, flowId, flowBeginTime, deviceId.
  • Every link gets utm_medium=email, utm_campaign, utm_content unless the account opted out of metrics.
Known oddities
  • /verify_primary_email and /verify_secondary_email are still derived in auth-server config, but no current email links to them.
  • /settings/account_recovery has a link builder in the legacy mailer, but no current template renders it.
  • verifyShortCode and verifyLoginCode carry their link only in an X-Link mail header, not in the body.