Oolvay uses transactional email for magic links, email verification, password recovery, billing notifications, and other system messages.
Three email providers are supported out of the box:
| Provider | Recommended for |
|---|---|
| Resend | Fastest setup and developer experience |
| Postmark | Deliverability-focused transactional email |
| AWS SES | Lowest cost at scale |
If you want the fastest setup experience, use Resend. If email deliverability is your primary concern, consider Postmark. If you are already running infrastructure on AWS, SES is usually the most cost-effective option, at least on higher volumes.
| Provider | Setup guide |
|---|---|
| Resend | This page |
| Postmark | This page |
| AWS SES | Infrastructure guide |
Magic links and email verification will not work until an email provider has been configured.
Resend is the recommended provider for most projects because it is quick to configure and requires minimal infrastructure.
0 / 2,000 characters
Create an account at Resend.
Go to the API Keys section in your Resend dashboard and create a new API key.
Add the API key to .env.local.
RESEND_API_KEY=provider to resend in config/emails.ts.Start the development server:
bun devDuring development, Resend allows you to send emails from
onboarding@resend.dev to your own account email address without verifying a
domain. For production, verify a sending domain in the Resend dashboard and
update the sender addresses in config/emails.ts.
Postmark is a transactional email service focused on reliable delivery and detailed message tracking.
Create an account at Postmark.
Create a server in the Postmark dashboard and copy the Server API Token.
Add the token to .env.local.
POSTMARK_SERVER_TOKEN=provider to postmark in config/emails.ts.Start the development server:
bun devFor production deployments, verify your sending domain in Postmark and update
the sender addresses in config/emails.ts.
New Postmark accounts start in test mode. Unlike Resend, which provides a
pre-verified onboarding@resend.dev address for local testing, Postmark has
no equivalent sandbox address. Emails will not deliver to any inbox until you
verify your domain by adding the DKIM and Return-Path DNS records from your
Postmark dashboard to your domain registrar, then clicking Request Approval in
Postmark to exit test mode.
Amazon SES is fully supported by Oolvay.
Because SES is typically deployed alongside S3, CloudFront, and other AWS resources, the recommended setup path is through the Infrastructure guide.
If you plan to host your application entirely on AWS, SES is usually the most cost-effective provider.
Oolvay ships with React Email templates for common transactional and dunning scenarios. Dunning emails are automated follow-ups sent when a payment fails, prompting the user to update their billing details before their subscription is interrupted.
All templates live in the emails/ directory and are built with React Email.
| Template | File | Trigger |
|---|---|---|
| Welcome | emails/welcome.tsx | New account created |
| Magic link | emails/magic-link.tsx | Magic link authentication requested |
| Access revoked | emails/access-revoked.tsx | Account suspended or access removed |
| Contact auto-reply | emails/contact-auto-reply.tsx | User submits the contact form |
| Contact notification | emails/contact-notification.tsx | Contact form submission received by the team |
| Docs feedback notification | emails/docs-feedback-notification.tsx | Docs feedback submitted |
| License delivery | emails/license-delivery.tsx | License key issued after purchase |
| License regenerated | emails/license-regenerated.tsx | License key regenerated |
| Payment failed | emails/payment-failed.tsx | Payment attempt fails (dunning) |
| Post notification | emails/post-notification-email.tsx | New blog post published |
| Subscription created | emails/subscription-created.tsx | Subscription successfully activated |
Each template exports a render function that returns an HTML string. Pass the result directly to your email provider’s send method.
import { renderWelcomeEmail } from "@/emails/welcome"
const html = await renderWelcomeEmail({ name: user.name })Before going live, review the welcome, payment failed, license delivery, and subscription created templates. These are the most customer-facing and should reflect your product’s tone and branding.
Templates reference siteConfig.brand.name, siteConfig.brand.url, and
siteConfig.emails.support.email automatically. Updating those values in
config/site.ts is sufficient for most customizations.
After configuring a provider, verify that email delivery works correctly.
Start the development server:
bun devOpen the login page.
http://localhost:3000/loginYou can also trigger the login modal directly from the Log in button in the navigation bar.
Request a magic link. Note that during development, delivery restrictions apply depending on your provider: Resend only delivers to the email address on your Resend account, and SES only delivers to addresses you have verified in your SES dashboard. These restrictions lift once you configure a custom sending domain.
Confirm that the email arrives successfully and that all links function correctly.
Magic Links allow users to authenticate without a password.
Once an email provider has been configured, Magic Links are available automatically.
Before enabling Magic Links in production, verify that your sending domain is properly configured and that authentication emails are reaching inboxes consistently.
Verify that:
Verify that: