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
- Pick a provider (default: Resend) and sign up.
- Add/verify the sending domain (SPF/DKIM/DMARC DNS records).
- 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@.
- Supabase → Authentication → Email Templates: paste the branded HTML (Confirm / Reset / Magic link).
- 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.
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
{{ .ConfirmationURL }},{{ .Token }},{{ .SiteURL }}).Provider comparison — free vs paid
For low-volume transactional (our case). Verify current terms before signup.
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
/reset-passwordpage already handles the recovery flow).Acceptance
Ownership
docs/EMAIL_SETUP.mdchecklist → I can produce these on request.