Verge Kit sends transactional email through @vergekit/core/email. React Email templates live in src/email.
Available providers are console, Cloudflare Email, Resend, and Mailgun. Use console for local development without delivery.
Send transactional email
Use sendEmail in Worker or Astro server code:
import { env } from 'cloudflare:workers';
import { sendEmail } from '@vergekit/core/email';
try {
const result = await sendEmail(env, {
to: { email: 'customer@example.com', name: 'Customer Name' },
from: { email: 'noreply@example.com', name: 'VK' },
subject: 'Your VK receipt',
html: '<p>Thanks for your order.</p>',
text: 'Thanks for your order.',
replyTo: 'support@example.com',
});
console.info('sent email', result.provider, result.id);
} catch (error) {
console.error('Email send failed', error);
}toaccepts one address, one named address, or an array of addresses.- Include both
htmlandtextcontent. - Include
fromfor direct sends.sendEmaildoes not readEMAIL_FROMautomatically. - Catch provider errors at the route or job boundary. Do not return provider response bodies to users.
Configure a provider
EMAIL_PROVIDER selects the provider. If this value is missing, Verge Kit uses console.
Put non-secret values in wrangler.jsonc:
{
"vars": {
"EMAIL_PROVIDER": "resend",
"EMAIL_FROM": "VK <noreply@example.com>",
"EMAIL_REPLY_TO": "support@example.com",
},
}For Cloudflare Email, add the binding to wrangler.jsonc:
{
"send_email": [{ "name": "EMAIL" }]
}See the Cloudflare Email setup guide for domain onboarding.
Store local provider secrets in .dev.vars:
RESEND_API_KEY=your-local-resend-key
MAILGUN_API_KEY=your-local-mailgun-keyUse Wrangler for deployed secrets:
npx wrangler secret put RESEND_API_KEY
npx wrangler secret put MAILGUN_API_KEYAdd only the secret for the selected provider.
React Email templates
Templates use React Email components and render to HTML and plain text. The starter includes these authentication templates:
src/email/auth/verify-email.tsxsrc/email/auth/reset-password.tsx
Configure their sender defaults and render functions in src/config/auth-email.ts. Better Auth uses this configuration for verification and password-reset email.
Add custom .tsx templates under src/email. Render each template to HTML and plain text before you pass it to sendEmail.
Preview all templates locally:
npm run emailSee the React Email documentation for components and custom templates.