over_email_send_rate_limit), then wire Resend or Postmark via Authentication → Emails → SMTP Settings — verified domain + SPF/DKIM/DMARC or 30-40% will spam-folder.Why your signup, magic link, or password reset emails are silently failing — and the exact steps to get them flowing again.
2 emails per hour for projects using the default Supabase email service. In 2026 this is still the #1 cause. Fix: Dashboard → Authentication → Rate Limits, or (better) configure custom SMTP.msg:"email" or error_code. You'll see over_email_send_rate_limit, email_provider_disabled, or SMTP handshake errors immediately. This saves hours of guessing.Site URL or Redirect URLs don't match, or if a template variable like {{ .ConfirmationURL }} is malformed. Check Authentication → URL Configuration and Email Templates.Before touching config, confirm what the server is actually doing.
over_email_send_rate_limit (429)This is non-optional for production in 2026.
Magic links expire in 1 hour by default — users who click a link the next morning get "invalid token." Bump the TTL in Auth settings or switch to OTP codes for higher conversion.
Email confirmation disabled but you still expect emails? If enable_confirmations is off, Supabase won't send a signup email at all. This catches people migrating from Firebase constantly.
Local dev using Supabase CLI — emails go to Inbucket at localhost:54324, not your real inbox. Totally normal, but confusing on day one.
Edge Functions calling admin.inviteUserByEmail — uses a separate rate bucket and separate template. If invites work but signups don't (or vice versa), you've got a template or SMTP scoping issue.
Dashboard → Authentication → Emails → enable Custom SMTP. Paste host (e.g. smtp.resend.com), port 465 (SSL) or 587 (TLS), user, pass/API key, and a sender on a domain you control. Verify SPF/DKIM/DMARC or expect 30-40% spam-folder delivery. Save and trigger a test signup — Auth Logs will show the handshake.
In Resend: API key with "sending access" + verify domain. In Supabase: host smtp.resend.com, port 465, user resend, pass = your Resend API key, sender on the verified domain. Free tier = 3k/month. Under 10 min if DNS is set.
{{ .ConfirmationURL }} template variable broken?Go template syntax — case-sensitive, leading dot required. Common mistakes: {{ ConfirmationURL }} (missing dot), {{.confirmationurl}} (wrong case), or using it in an SMS template (it's email-only). Valid names: .ConfirmationURL, .Token, .TokenHash, .SiteURL, .Email.
1 hour by default in 2026. Users who click the next morning get "invalid token". Bump the TTL in Authentication → Sign In/Up → Email link expiry (max 24h), or switch to OTP codes — higher conversion, longer-feeling 1-hour window.
RLS doesn't block auth.users inserts directly — auth runs privileged. But RLS on a public.profiles table with a trigger from auth.users can fail silently and roll back the whole signup transaction, making it look like email never sent. Check your handle_new_user trigger has SECURITY DEFINER, or use service_role for the insert.
Local San Diego dev, direct line, no account managers. I'll screenshare, pull your Supabase logs, and fix your email flow today. $100/hr, billed only for time that produces results.
Text 858-461-8054 Call NowDon't see what you were looking for?
Text PJ a sentence about what you actually need — I'll build you a free custom shareable on the house. No email, no funnel, no SOW.
📲 Text PJ — free shareable