Skip to content

Branded, reliable transactional email — provider comparison + custom SMTP + templates #171

Description

@Muawiya-contact

Detailed plan for real, branded auth email (supersedes #152). Today Supabase's built-in SMTP is rate-limited (~a few/hour, "testing only"), can't be branded (generic sender), and locks template editing — so confirmation/reset mail is unreliable and doesn't look like it's from us.

Goal

Emails that (a) actually deliver, and (b) come from "One Concept — by Coding Moves" with a branded template, so users trust them.

What emails the app actually sends

Auth transactional only — Confirm signup, Reset password, (optional Magic link). Daily reminders are push notifications, not email. So volume is just signups + resets → a few–tens/day early on. A free tier covers a very long runway (thousands of signups/month).

Two parts

  • (A) Delivery — config, not code. Set custom SMTP in Supabase → a transactional provider. This one change removes the rate limit, lets us send from our own domain, AND unlocks template editing.
  • (B) Branding — code (templates). Once (A) is on, Supabase → Auth → Email Templates becomes editable; we write branded HTML (logo/wordmark, app colors, clear CTA button, footer) using Supabase vars ({{ .ConfirmationURL }}, {{ .Token }}, {{ .SiteURL }}).

Provider comparison — free vs paid

For low-volume transactional (our case). Verify current terms before signup.

Provider Free tier Paid (entry) Notes
Resend 3,000/mo (100/day), 1 domain ~$20/mo → 50k/mo Best DX, easy DKIM, clean dashboard. Recommended.
Brevo (Sendinblue) 300/day (~9k/mo) ~$9–25/mo Generous daily free; SMTP included.
Mailjet 6,000/mo (200/day) ~$15/mo → 15k Solid free monthly cap.
SendGrid (Twilio) 100/day (~3k/mo) ~$20/mo → 50k Reduced free tier; fine for transactional.
Amazon SES ~3,000/mo free for 12 mo $0.10 per 1,000 Cheapest at scale, but more setup (leave sandbox, DNS) + ops.
Postmark Trial only (100 test) $15/mo → 10k Excellent deliverability; no real free tier.
Mailgun Trial, then pay-as-you-go ~$0.80 per 1,000 Flexible; free tier weak.

Takeaway: for our volume, any free tier lasts a long time. Resend free (3,000/mo) is the recommended balance of ease + headroom; SES wins only when you're sending large volumes and don't mind the setup.

Prerequisite: a sending domain

To send as "One Concept" (and avoid spam), verify a domain (e.g. oneconcept.app) with SPF + DKIM + DMARC records. One domain purchase also unlocks the custom API domain (#170) — buy once, use for both.

Steps

  1. Pick a provider (default: Resend) and sign up.
  2. Add/verify the sending domain (SPF/DKIM/DMARC DNS records).
  3. Supabase → Project Settings → Authentication → SMTP Settings: enable custom SMTP, enter the provider's host/port/user/pass; set Sender name = One Concept, Sender email = noreply@.
  4. Supabase → Authentication → Email Templates: paste the branded HTML (Confirm / Reset / Magic link).
  5. Send a test signup + reset; confirm delivery, branding, and that links work (the /reset-password page already handles the recovery flow).

Acceptance

  • Confirmation + reset emails deliver reliably (no hourly cap), arrive from a branded "One Concept" sender on our domain, and render the branded template. Signup/reset works end-to-end.

Ownership

  • Provider signup, DNS records, Supabase SMTP settings → owner (I can't access DNS/dashboards).
  • Branded HTML templates + a docs/EMAIL_SETUP.md checklist → I can produce these on request.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    backendFastAPI servicedocumentationImprovements or additions to documentationpriority: highUrgent — functional impactreliabilityWorkers and infrastructure correctness

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions