Features
Email (Resend)
Templates en React Email, envío transaccional con Resend.
VibeFast manda emails transaccionales con Resend y
templates escritos en React Email. Todo el copy y el
remitente salen de web/config.js.
Activar
- Crea una cuenta en resend.com y saca un API key.
- En
web/.env.localpon:TerminalRESEND_API_KEY=re_... - En
web/config.jsdejafeatures.resend: true(default). - (Opcional pero recomendado) verifica tu dominio en Resend y cambia
config.email.froma un correo de ese dominio. En desarrollo puedes enviar desdeonboarding@resend.deva tu propio correo.
Si features.resend está en false o falta RESEND_API_KEY, los envíos
hacen no-op silencioso: la app sigue funcionando, simplemente no manda
correos. Útil mientras no configuras Resend.
Cómo está implementado
web/lib/resend/client.js— cliente único, devuelvenullsi email está off.web/lib/resend/templates/— componentes React Email:WaitlistConfirm— confirma el alta al waitlist (Sem 1).Welcome— bienvenida en el primer login.
web/lib/resend/send.js— helperssendWaitlistConfirm(to)ysendWelcome(to, name). Devuelven{ ok, skipped?, error? }.
Los envíos se disparan con after() de Next (después de responder), así que
nunca bloquean la UI:
/api/waitlist→ mandaWaitlistConfirmal anotarse./auth/callback→ mandaWelcomesolo en el primer login.
Agregar un template nuevo
- Crea
web/lib/resend/templates/MiTemplate.js(copia uno existente). - Agrega un helper en
web/lib/resend/send.js:JavaScriptimport MiTemplate from "@/lib/resend/templates/MiTemplate" export async function sendMiTemplate(to, props) { const resend = getResend() if (!resend) return { ok: false, skipped: true } const { error } = await resend.emails.send({ from: config.email.from, to, subject: "Asunto", react: <MiTemplate {...props} />, }) return error ? { ok: false, error: error.message } : { ok: true } } - Llámalo donde lo necesites (idealmente con
after()).
Webhook de eventos (opcional)
Un webhook es una URL de tu app que otro servicio llama automáticamente
cuando pasa algo. En este caso, /api/webhooks/resend recibe eventos de
Resend (delivered, bounced…). Resend los firma con Svix:
- En Resend → Webhooks, apunta a
https://TU-DOMINIO/api/webhooks/resend. Aquí tienes que cambiarTU-DOMINIOpor la URL donde vive tu app: tu URL de Vercel (ej.tu-producto.vercel.app) o tu dominio propio. - Copia el signing secret a
web/.env.local(como cualquier otra variable de entorno):TerminalRESEND_WEBHOOK_SECRET=whsec_...
Sin el secret, en desarrollo el webhook acepta el payload sin verificar (con warning). En producción siempre configura el secret.
Errores comunes
- No llega el correo: revisa que
RESEND_API_KEYesté enweb/.env.localy queconfig.email.fromuse un dominio verificado (oonboarding@resend.devenviando a tu propio correo). reactno renderiza: ya viene@react-email/components. No mezcles HTML crudo con componentes de React Email en el mismo template.