DEV Community

Ahmed Hassan Yaseen
Ahmed Hassan Yaseen

Posted on Originally published at stacksmesh.com AI-assisted

Supabase "email rate limit exceeded"? Turn on custom SMTP, then raise the limit

Sign-ups worked yesterday. Today new users never get the confirmation email, and the sign-up or reset call comes back with one of these:

email rate limit exceeded
over_email_send_rate_limit
429 Too Many Requests
Email address not authorized
email_address_not_authorized
Enter fullscreen mode Exit fullscreen mode

Supabase's built-in email provider sends at most 2 emails an hour for the whole project, and only to members of your team. Connect your own SMTP provider and Supabase sends to every address, starting at 30 emails an hour, which you can raise.

I see this a lot in Lovable and Bolt apps on Supabase right when the first real users arrive.

Why it happens

  1. The default email service is still on. It refuses addresses outside the project team (email_address_not_authorized) and sends 2 emails an hour for the whole project, across every sign-up, reset, magic link and invite. Supabase describes it as best effort and not meant for production.
  2. Too many emails to one address. Repeated sign-up or reset attempts trip over_email_send_rate_limit (HTTP 429) for that address. By default the same user waits 60 seconds before another confirmation or reset email.
  3. The custom SMTP limit is still the starting value. After you add custom SMTP, Supabase starts at 30 emails an hour to protect your new sender's reputation, until you change it.

Find the cause

  1. Read the error code returned by the sign-up or reset call. over_email_send_rate_limit and email_address_not_authorized need different fixes.
  2. In the Supabase dashboard, open Authentication > SMTP settings and check whether custom SMTP is enabled.
  3. Open Authentication > Rate Limits and read the limit for emails sent.

Fix 1: connect a real email provider

  1. Create an SMTP account with a transactional email provider and verify your sending domain there.
  2. In Authentication > SMTP settings, enter the host, port, username, password, a From address such as no-reply@yourdomain.com, and a sender name.
  3. Save. From then on, Supabase sends auth emails to every address, not only your team.

Fix 2: raise the limit to fit real traffic

Set the limit for emails sent in Authentication > Rate Limits to cover your busiest hour of sign-ups and resets. Or do it from a script with the Management API:

# Access token from https://supabase.com/dashboard/account/tokens
export SUPABASE_ACCESS_TOKEN="your-access-token"
export PROJECT_REF="your-project-ref"

# Read the current limit
curl -X GET "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
  -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" | jq '.rate_limit_email_sent'

# Set it to your busiest hour of auth emails (replace <emails-per-hour>)
curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
  -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "rate_limit_email_sent": <emails-per-hour> }'
Enter fullscreen mode Exit fullscreen mode

Keep the per-user wait between emails, so one person can't flood their own inbox.

Check the fix worked

  • Sign up with an address outside your team: the confirmation arrives from your domain.
  • Request three password resets in an hour from different addresses: all of them arrive.

Stop it coming back

  • Switch to custom SMTP before you invite any real users.
  • Add the sending domain's SPF, DKIM and DMARC records at your provider so the emails reach inboxes.

Quick answers

Is the built-in service fine for launch? No. Supabase describes it as best effort, for testing and non-critical projects, with no delivery guarantee.

Does this affect magic links and invites too? Yes. Every auth email, including one-time codes, magic links and invites, goes through the same sender.

Sources: Supabase rate limits, Send emails with custom SMTP, Auth error codes.

Full write-up with the same steps: Supabase "email rate limit exceeded": the fix. Before launch, the free Launch Check looks over your live app for exposed keys, missing security headers and broken basics.

I wrote this with AI assistance and reviewed it myself.

Top comments (1)

Collapse
 
officialmailkr profile image
오피셜메일 •

팀 외부 주소로 가입과 비밀번호 재설정을 각각 시험하는 확인 절차가 실용적이네요. 점검 결과는 인증 API 요청 성공, 발송 공급자 접수, 실제 수신함 도착을 나눠 남기면 어느 구간이 막혔는지 더 쉽게 볼 수 있겠습니다. 한도를 올릴 때도 대시보드에 표시된 현재 값과 공급자 쪽 제한을 함께 확인하고, 사용자별 재요청 간격은 별도로 유지하는 기준이 좋다고 생각합니다.