From d46a9c43fdc6b954ba4e03a9de858cd62a8b1efb Mon Sep 17 00:00:00 2001 From: Chris Stockton <180184+cstockton@users.noreply.github.com> Date: Thu, 25 Jun 2026 08:20:01 -0700 Subject: [PATCH] feat(Auth/EmailTemplates): Add SiteURL variable for notifications (#46393) This will make email templates more consistent and may be merged after https://github.com/supabase/auth/pull/2532 is deployed. ## Summary by CodeRabbit * **New Features** * Authentication notification emails now include access to site URL references. This enhancement applies to multiple notification types: password change alerts, email change confirmations, phone number change notifications, identity linking and unlinking events, and multi-factor authentication enrollment and unenrollment notifications. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/supabase/supabase/pull/46393?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) Co-authored-by: Chris Stockton --- .../AuthTemplatesValidation.tsx | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/AuthTemplatesValidation.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/AuthTemplatesValidation.tsx index cccd998524b..f5fa434afa3 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/AuthTemplatesValidation.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/AuthTemplatesValidation.tsx @@ -256,7 +256,7 @@ const PASSWORD_CHANGED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_PASSWORD_CHANGED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_PASSWORD_CHANGED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.Data], + variables: [TemplateVariables.Email, TemplateVariables.Data, TemplateVariables.SiteURL], validationSchema: z.object({ MAILER_SUBJECTS_PASSWORD_CHANGED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }), @@ -274,7 +274,12 @@ const EMAIL_CHANGED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_EMAIL_CHANGED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_EMAIL_CHANGED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.OldEmail, TemplateVariables.Data], + variables: [ + TemplateVariables.Email, + TemplateVariables.OldEmail, + TemplateVariables.Data, + TemplateVariables.SiteURL, + ], validationSchema: z.object({ MAILER_SUBJECTS_EMAIL_CHANGED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }), @@ -297,6 +302,7 @@ const PHONE_CHANGED_NOTIFICATION: AuthTemplate = { TemplateVariables.Phone, TemplateVariables.OldPhone, TemplateVariables.Data, + TemplateVariables.SiteURL, ], validationSchema: z.object({ MAILER_SUBJECTS_PHONE_CHANGED_NOTIFICATION: z.string().min(1, 'Subject is required.'), @@ -315,7 +321,12 @@ const IDENTITY_LINKED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_IDENTITY_LINKED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_IDENTITY_LINKED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.Provider, TemplateVariables.Data], + variables: [ + TemplateVariables.Email, + TemplateVariables.Provider, + TemplateVariables.Data, + TemplateVariables.SiteURL, + ], validationSchema: z.object({ MAILER_SUBJECTS_IDENTITY_LINKED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }), @@ -333,7 +344,12 @@ const IDENTITY_UNLINKED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_IDENTITY_UNLINKED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_IDENTITY_UNLINKED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.Provider, TemplateVariables.Data], + variables: [ + TemplateVariables.Email, + TemplateVariables.Provider, + TemplateVariables.Data, + TemplateVariables.SiteURL, + ], validationSchema: z.object({ MAILER_SUBJECTS_IDENTITY_UNLINKED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }), @@ -351,7 +367,12 @@ const MFA_FACTOR_ENROLLED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_MFA_FACTOR_ENROLLED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_MFA_FACTOR_ENROLLED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.FactorType, TemplateVariables.Data], + variables: [ + TemplateVariables.Email, + TemplateVariables.FactorType, + TemplateVariables.Data, + TemplateVariables.SiteURL, + ], validationSchema: z.object({ MAILER_SUBJECTS_MFA_FACTOR_ENROLLED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }), @@ -369,7 +390,12 @@ const MFA_FACTOR_UNENROLLED_NOTIFICATION: AuthTemplate = { MAILER_SUBJECTS_MFA_FACTOR_UNENROLLED_NOTIFICATION: { title: 'Subject', type: 'string' }, MAILER_TEMPLATES_MFA_FACTOR_UNENROLLED_NOTIFICATION_CONTENT: { title: 'Body', type: 'code' }, }, - variables: [TemplateVariables.Email, TemplateVariables.FactorType, TemplateVariables.Data], + variables: [ + TemplateVariables.Email, + TemplateVariables.FactorType, + TemplateVariables.Data, + TemplateVariables.SiteURL, + ], validationSchema: z.object({ MAILER_SUBJECTS_MFA_FACTOR_UNENROLLED_NOTIFICATION: z.string().min(1, 'Subject is required.'), }),