{"id":437,"date":"2026-09-24T05:20:23","date_gmt":"2026-09-24T10:50:23","guid":{"rendered":"https:\/\/photonconsole.com\/blog\/?p=437"},"modified":"2026-09-24T11:47:32","modified_gmt":"2026-09-24T17:17:32","slug":"replacing-supabase-and-firebase-default-auth-emails-with-custom-smtp","status":"publish","type":"post","link":"https:\/\/photonconsole.com\/blog\/replacing-supabase-and-firebase-default-auth-emails-with-custom-smtp\/","title":{"rendered":"Replacing Supabase and Firebase Default Auth Emails with Custom SMTP"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Everything works during development. Signups confirm, magic links arrive, password resets land in seconds. Then you launch, twenty people sign up in an hour, and the emails stop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nothing is broken. Both Supabase and Firebase ship a built-in email service intended for development, and both rate limit it aggressively. The messages also come from their domain rather than yours, so the ones that do send often land in spam.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers moving auth emails onto your own SMTP relay: why the defaults cap out, how to configure custom SMTP in each platform, how to take control of the templates, and how to confirm delivery actually improved.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick Answer: How Do You Set Up Custom SMTP?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Supabase:<\/strong> open Project Settings, then Authentication, then SMTP Settings. Enable custom SMTP and enter:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sender email:  noreply@yourdomain.com\nSender name:   Your App\nHost:          smtp.photonrelay.com\nPort:          587\nUsername:      your_project_api_user\nPassword:      your_secret_api_key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Firebase:<\/strong> open Authentication, then Templates, then the SMTP settings section, and enter the same connection details.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both platforms then send through your relay instead of theirs. The step most teams miss comes next: publishing SPF and DKIM records so your sending domain is authorised. Without those, custom SMTP changes who sends the mail but not whether receiving servers trust it. An authenticated relay such as <a href=\"https:\/\/www.photonconsole.com\/\">PhotonConsole<\/a> supplies both the credentials and the DNS records.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why the Built-In Email Services Cap Out<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"577\" src=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM-1024x577.png\" alt=\"Diagram comparing default Supabase and Firebase auth email sending against custom SMTP sending from your own authenticated domain\" class=\"wp-image-439\" style=\"aspect-ratio:1.7777777777777777;width:1200px;height:auto\" srcset=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM-1024x577.png 1024w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM-300x169.png 300w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM-767x432.png 767w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM-1536x865.png 1536w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_07_09-PM.png 1671w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">The default service sends from the platform&#8217;s domain. Custom SMTP sends from yours.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase and Firebase both provide email out of the box so you can build an auth flow without configuring anything. Neither intends that service for production traffic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/supabase.com\/docs\" target=\"_blank\" rel=\"noopener\">Supabase&#8217;s documentation<\/a> is explicit that the built-in service is for testing and development, with a low hourly limit, and recommends custom SMTP before going live. <a href=\"https:\/\/firebase.google.com\/docs\/auth\" target=\"_blank\" rel=\"noopener\">Firebase<\/a> sends from a project subdomain you do not control, which limits what you can do about deliverability.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspect<\/th><th>Built-in service<\/th><th>Custom SMTP<\/th><\/tr><\/thead><tbody><tr><td>Hourly send limit<\/td><td>Low, intended for testing<\/td><td>Set by your relay plan<\/td><\/tr><tr><td>Sender domain<\/td><td>The platform&#8217;s domain<\/td><td>Your own domain<\/td><\/tr><tr><td>SPF and DKIM alignment<\/td><td>Not aligned with your domain<\/td><td>Aligned once DNS is published<\/td><\/tr><tr><td>Delivery logs<\/td><td>Not available to you<\/td><td>Available in the relay dashboard<\/td><\/tr><tr><td>Bounce handling<\/td><td>Not exposed<\/td><td>Webhooks available<\/td><\/tr><tr><td>Suitable for production<\/td><td>No<\/td><td>Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rate limits on both platforms change over time, so check the current figures in their documentation rather than relying on a number quoted in any article, including this one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Auth Emails Fail After Launch<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. The Hourly Limit Is Reached<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A launch, a marketing push, or a batch of test signups can exhaust the built-in allowance quickly. Once the limit is hit, further emails are simply not sent. Your application reports a successful signup because the user record was created \u2014 the email was a separate step that silently failed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Messages Come From a Domain You Do Not Own<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Receiving servers check whether the sending domain authorised the message. When mail arrives from a platform subdomain while claiming to represent your product, there is no alignment with your domain, and filters respond accordingly. This matters more than it used to under <a href=\"https:\/\/support.google.com\/mail\/answer\/81126\" target=\"_blank\" rel=\"noopener\">Google&#8217;s sender guidelines<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Shared Sending Reputation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The default service is shared by many projects on the platform. Poor sending behaviour by other projects affects the reputation of the IPs your mail leaves from, and you have no visibility or control over it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Time-Critical Mail Arrives Late<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Magic links and one-time codes expire. A message delayed by rate limiting or filtering is worthless by the time it arrives, and the user simply cannot sign in.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Custom SMTP Configured Without DNS Records<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most common half-finished migration. The relay is connected, mail sends successfully, and it still lands in spam \u2014 because the sending domain publishes no SPF or DKIM records. Our guide to <a href=\"https:\/\/photonconsole.com\/blog\/spf-dkim-dmarc-explained-simply\/\">SPF, DKIM and DMARC<\/a> explains the records, and the free <a href=\"https:\/\/www.photonconsole.com\/email-deliverability-checker.php\">email deliverability checker<\/a> shows what your domain currently publishes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common Mistake<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Connecting custom SMTP and stopping there. The sender address changes to your domain, which is exactly what receiving servers will now check \u2014 and if that domain has no SPF or DKIM records, alignment fails in a way it did not before. Deliverability can get worse rather than better. Publish the DNS records in the same session you connect the relay, never as a follow-up task.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting Up Custom SMTP in Supabase<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Publish DNS Records First<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>TXT    @                    v=spf1 include:relay.photonconsole.com ~all\nCNAME  photon._domainkey    dkim.photonconsole.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DNS changes are not instant. SPF and DKIM records can take from a few minutes to 24-48 hours to propagate depending on your registrar and TTL settings. Also check you do not already publish a second SPF record \u2014 two separate TXT records starting with <code>v=spf1<\/code> break authentication entirely.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Enter the SMTP Settings<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the Supabase dashboard, open Project Settings, then Authentication, then SMTP Settings. Enable custom SMTP and supply the sender address, host, port and credentials shown in the quick answer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The sender address must be on the domain you authenticated in step one. Using a Gmail or Outlook address here defeats the purpose, because that domain has not authorised your relay to send on its behalf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Raise the Auth Rate Limit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Connecting custom SMTP does not automatically lift Supabase&#8217;s own auth email rate limit. That is a separate setting under Authentication, then Rate Limits. Teams frequently connect a relay, test successfully, then hit the same wall at launch because this step was missed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Customise the Templates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Under Authentication, then Email Templates, Supabase exposes each auth email \u2014 confirm signup, invite, magic link, change email address, reset password and reauthentication.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three things are worth changing from the defaults:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Subject lines.<\/strong> Generic defaults look like phishing. Name your product.<\/li>\n\n\n\n<li><strong>Sender name.<\/strong> Users judge legitimacy in the inbox list before opening anything.<\/li>\n\n\n\n<li><strong>Body content.<\/strong> Include what the email is for and what to do if the user did not request it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Quick Fix<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase Signup Emails Not Arriving<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm custom SMTP is enabled, not just filled in and left unsaved<\/li>\n\n\n\n<li>Check the sender address is on a domain with SPF and DKIM published<\/li>\n\n\n\n<li>Raise the auth rate limit under Authentication, Rate Limits<\/li>\n\n\n\n<li>Check the minimum interval between emails is not throttling repeat requests<\/li>\n\n\n\n<li>Try port 2525 if 587 appears to be blocked<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Setting Up Custom SMTP in Firebase<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Publish the Same DNS Records<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Identical to Supabase. The records authorise your relay to send as your domain, regardless of which platform triggers the message.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Configure SMTP in the Console<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open Authentication, then Templates. The SMTP settings section accepts the same host, port, username and password, along with the sender address and name.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Set the Action URL to Your Domain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, Firebase verification and reset links point at a Firebase-hosted domain. Users clicking a link to a domain they do not recognise is a trust problem, particularly for security-related mail.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change the action URL to a path on your own domain, and add that domain to the authorised domains list so the link continues to work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Customise Each Template<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Firebase exposes templates for email verification, password reset, email address change and SMS. Edit the sender name, subject and body for each, in the same way as Supabase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quick Fix<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Firebase Verification Emails Landing in Spam<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm the sender address uses your domain, not the default project subdomain<\/li>\n\n\n\n<li>Publish SPF and DKIM for that domain and verify propagation<\/li>\n\n\n\n<li>Change the action URL to your own domain so the link matches the sender<\/li>\n\n\n\n<li>Avoid link shorteners in templates \u2014 they resemble phishing patterns<\/li>\n\n\n\n<li>Score a real verification email with a deliverability testing tool<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Port Reference<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Port<\/th><th>Encryption<\/th><th>When to use<\/th><\/tr><\/thead><tbody><tr><td>587<\/td><td>STARTTLS<\/td><td>Recommended default for both platforms<\/td><\/tr><tr><td>465<\/td><td>Implicit SSL<\/td><td>When the platform requires SSL<\/td><\/tr><tr><td>2525<\/td><td>STARTTLS<\/td><td>When 587 appears blocked<\/td><\/tr><tr><td>25<\/td><td>None<\/td><td>Avoid \u2014 blocked almost everywhere<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configuring Both Platforms With PhotonConsole<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same credentials work for Supabase, Firebase, or both at once.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host:          smtp.photonrelay.com\nPort:          587          (465 for SSL, 2525 if 587 is blocked)\nUsername:      your_project_api_user\nPassword:      your_secret_api_key\nSender email:  noreply@yourdomain.com\nSender name:   Your App<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because auth emails are time critical, delivery speed matters more here than for most mail. A magic link that arrives after the token expires is a failed signup, not a late email. Every PhotonConsole account includes 5,000 free emails per month, which covers a small product&#8217;s auth traffic indefinitely and lets a larger one validate the full setup \u2014 DNS, templates and rate limits \u2014 before any spend. Details are on the <a href=\"https:\/\/www.photonconsole.com\/relay.php\">PhotonRelay page<\/a>, and <a href=\"https:\/\/www.photonconsole.com\/pricing.php\">pricing<\/a> has no monthly minimum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are comparing options first, our analysis of <a href=\"https:\/\/photonconsole.com\/blog\/free-smtp-servers\/\">free SMTP servers<\/a> covers where each stops being practical.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verifying the Migration Worked<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM-1024x512.png\" alt=\"Four-step auth email migration checklist covering DNS records, SMTP credentials, rate limits and templates\" class=\"wp-image-440\" style=\"aspect-ratio:1.7777777777777777;width:1200px;height:auto\" srcset=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM-1024x512.png 1024w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM-300x150.png 300w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM-768x384.png 768w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM-1536x768.png 1536w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-24-2026-05_10_36-PM.png 1774w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">All four steps are required. Connecting SMTP alone leaves the migration half finished.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Connecting SMTP successfully is not proof that delivery improved. Check three things before considering the job done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Authentication passes.<\/strong> Trigger a real signup to an address you control and inspect the received message. SPF and DKIM should both show as passing. <a href=\"https:\/\/www.mail-tester.com\/\" target=\"_blank\" rel=\"noopener\">Mail Tester<\/a> scores a real send and reports both, and <a href=\"https:\/\/mxtoolbox.com\/\" target=\"_blank\" rel=\"noopener\">MXToolbox<\/a> confirms your DNS records resolve as intended.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The sender is what users expect.<\/strong> The inbox list should show your product name and your domain, not a platform subdomain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Delivery is fast enough.<\/strong> Time a password reset from request to inbox. Anything beyond a few seconds is worth investigating, because auth mail competes with an expiring token.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Platform Notes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Local Development<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Keep using the built-in service locally, or a mail catcher such as Mailpit. There is no benefit to burning relay volume on test signups, and test sends to invented addresses generate bounces that harm your reputation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Multiple Environments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use separate credentials for staging and production so a misconfigured staging environment cannot affect production sending reputation. Separate credentials can also be revoked independently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Self-Hosted Supabase<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted instances have no built-in email service at all, so SMTP configuration is required from the start rather than being an upgrade.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Firebase Extensions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Trigger Email extension sends application mail from Firestore documents and is configured separately from auth templates. Point it at the same relay so all mail from your product shares one sending identity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pro Tips<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use a subdomain for auth mail.<\/strong> Sending from <code>mail.yourdomain.com<\/code> keeps auth reputation separate from your business email.<\/li>\n\n\n\n<li><strong>Set a monitored reply address.<\/strong> Users reply to security emails. A noreply address that bounces looks untrustworthy.<\/li>\n\n\n\n<li><strong>Never use a personal Gmail as the relay.<\/strong> Google&#8217;s caps are low, automated traffic gets throttled, and account suspension takes your entire auth flow down.<\/li>\n\n\n\n<li><strong>Test every template, not just signup.<\/strong> Password reset and email change are frequently left on defaults and only discovered when a user complains.<\/li>\n\n\n\n<li><strong>Keep the token expiry realistic.<\/strong> Very short expiry windows turn ordinary delivery latency into failed logins.<\/li>\n\n\n\n<li><strong>Re-verify DNS after registrar changes.<\/strong> Moving DNS providers commonly drops TXT records without anyone noticing.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Related Issues You May Hit Next<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/photonconsole.com\/blog\/smtp-authentication-error\/\">SMTP authentication errors<\/a> when credentials are rejected<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/why-emails-go-to-spam-in-gmail\/\">Emails landing in Gmail spam<\/a> despite a successful send<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/emails-delayed\/\">Emails arriving late<\/a> when delivery is slow rather than failing<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/emails-sent-but-not-delivered\/\">Emails sent but not delivered<\/a> when the server reports success<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/smtp-configuration\/\">SMTP configuration<\/a> reference for host, port and encryption settings<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Do I have to set up custom SMTP for Supabase?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For production, yes. Supabase&#8217;s own documentation describes the built-in service as being for testing and development, with a low hourly limit that a real launch will exceed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why do auth emails land in spam even with custom SMTP?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Almost always missing SPF or DKIM records on the sending domain. Once you send from your own domain, receiving servers check that domain&#8217;s records \u2014 and if there are none, alignment fails.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I use Gmail as the SMTP provider?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For local testing only. Google enforces low daily caps, throttles automated traffic, and can suspend the account, which takes password resets and signups down with it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does custom SMTP remove Supabase&#8217;s rate limit?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Not automatically. The auth email rate limit is a separate setting under Authentication, Rate Limits, and needs raising independently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I use the same relay for Supabase and Firebase?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Both accept standard SMTP credentials, and using one relay for both keeps your sending identity and reputation consistent.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why do Firebase links point at a Firebase domain?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">That is the default action URL. Change it to a path on your own domain and add that domain to the authorised domains list, so the link matches the sender.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How fast should auth emails arrive?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Within a few seconds. Magic links and one-time codes expire, so delivery latency directly becomes login failure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supabase and Firebase both give you working auth email on day one, which is exactly what you want while building. Neither is built to carry a live product&#8217;s signup traffic, and both send from a domain you do not control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Moving to custom SMTP is a short configuration change, but it has two halves. Connecting the relay changes who sends the mail. Publishing SPF and DKIM is what makes receiving servers trust it. Doing only the first can leave deliverability worse than before, because the domain being checked is now yours and it has nothing published.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once both are done, auth email stops being a source of support tickets. A dedicated <a href=\"https:\/\/www.photonconsole.com\/relay.php\">transactional email solution<\/a> handles the authentication, routing and sending reputation, and works with both platforms from the same credentials. Developers building on other stacks may also want our guides to <a href=\"https:\/\/photonconsole.com\/blog\/how-to-send-emails-in-node-js-with-nodemailer-a-production-setup-guide\/\">sending email in Node.js<\/a> and <a href=\"https:\/\/photonconsole.com\/blog\/sending-email-in-python-smtplib-vs-an-email-api-with-working-code\/\">sending email in Python<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Read More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.photonconsole.com\/email-deliverability-checker.php\">Free Email Deliverability Checker<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/spf-dkim-dmarc-explained-simply\/\">SPF, DKIM and DMARC Explained Simply<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/improve-email-deliverability\/\">How to Improve Email Deliverability<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/transactional-email-latency-explained-for-saas-applications\/\">Transactional Email Latency Explained<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/smtp-configuration\/\">SMTP Configuration: Complete Setup Reference<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.photonconsole.com\/relay.php\">PhotonRelay: SMTP Relay Service<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.photonconsole.com\/pricing.php\">PhotonConsole Pricing<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Everything works during development. Signups confirm, magic links arrive, password resets land in seconds. Then you launch, twenty people sign up in an hour, and the emails stop. Nothing is broken. Both Supabase and Firebase ship a built-in email service intended for development, and both rate limit it aggressively. The messages also come from their [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":438,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[541,542],"class_list":["post-437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-smpt-relay-service","tag-auth-emails-hitting-rate-limits-or-landing-in-spam-move-supabase-and-firebase-onto-your-own-smtp-relay","tag-with-the-dns-step-most-teams-skip"],"_links":{"self":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/comments?post=437"}],"version-history":[{"count":1,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/437\/revisions"}],"predecessor-version":[{"id":441,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/437\/revisions\/441"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/media\/438"}],"wp:attachment":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/media?parent=437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/categories?post=437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/tags?post=437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}