Apariencia
Correos transaccionales
Catálogo de plantillas de correo del MVP. Todas se renderizan con Blade markdown y se envían por SMTP a través del Postfix local del mismo servidor del backend.
Identidad visual
Header uniforme:
┌──────────────────────────────────────┐
│ [Logo HUMAE] │
├──────────────────────────────────────┤
│ │
│ Hola, {{ $user->name }} │
│ │
│ ... contenido específico ... │
│ │
│ [Botón CTA] │
│ │
├──────────────────────────────────────┤
│ Av. Reforma 180, CDMX · MX │
│ Recibiste este correo porque ... │
└──────────────────────────────────────┘Color primario de botones: #314259. Color de texto: #081828.
Plantillas del MVP
1. verify_email.blade.php
Cuándo: tras registro. Subject: "Verifica tu correo para activar tu cuenta HUMAE".
Hola, {{ $user->name }}
Para empezar a usar HUMAE, necesitamos verificar que tu
correo electrónico sea válido.
[Verificar correo →]
El enlace expira en 60 minutos. Si no solicitaste esta cuenta,
ignora este correo.2. welcome.blade.php
Cuándo: tras verificar el correo. Subject: "Bienvenid@ a HUMAE".
¡Qué bueno tenerte, {{ $user->name }}!
Estos son tus próximos pasos:
1. Completa tu perfil profesional
2. Contrata tu membresía (499 MXN / 6 meses)
3. Responde las pruebas psicométricas
[Ir al dashboard →]3. reset_password.blade.php
Cuándo: usuario solicitó recuperar contraseña. Subject: "Restablece tu contraseña HUMAE".
Hola,
Recibimos una solicitud para restablecer tu contraseña.
[Restablecer contraseña →]
Este enlace expira en 60 minutos. Si no solicitaste esto,
ignora el correo — tu contraseña sigue siendo la misma.4. membership_activated.blade.php
Cuándo: Stripe webhook confirma pago. Subject: "Tu membresía HUMAE está activa 🎉".
¡Felicidades, {{ $user->name }}!
Tu membresía está activa hasta el {{ $membership->expires_at->format('d/m/Y') }}.
Ya apareces en nuestro directorio de talento. Un reclutador
puede contactarte en cualquier momento.
[Ver mi perfil →]
Detalles del pago:
• Plan: {{ $plan->name }}
• Monto: ${{ $payment->amount }} MXN
• Fecha: {{ $payment->paid_at->format('d/m/Y H:i') }}
• Referencia: {{ $payment->stripe_payment_intent_id }}5. interview_scheduled.blade.php
Cuándo: recruiter agenda. Destinatarios: candidato + owners/managers de la empresa. Subject: "Nueva entrevista agendada: {vacancy_title}".
Hola, {{ $user->name }}
Se agendó una nueva entrevista:
Puesto: {{ $interview->assignment->vacancy->title }}
Empresa: {{ $interview->assignment->vacancy->company->name }}
📅 {{ $interview->scheduled_at->format('l j F Y, H:i') }}
🕐 Duración: {{ $interview->duration_minutes }} min
🌎 {{ $interview->timezone }}
@if($interview->mode === 'online')
💻 Online · {{ $interview->meeting_provider }}
🔗 {{ $interview->meeting_url }}
@else
🏢 Presencial
📍 {{ $interview->location }}
@endif
[Ver detalle y confirmar →]6. interview_confirmed.blade.php
Cuándo: una de las partes confirma. Subject: "Entrevista confirmada: {title}".
7. interview_rescheduled.blade.php
Cuándo: reprogramación. Subject: "Entrevista reprogramada: {title}".
Hola,
La entrevista para "{{ $vacancy->title }}" ha sido reprogramada.
Fecha anterior: {{ $reschedule->previous_scheduled_at->format('l j F, H:i') }}
Nueva fecha: {{ $reschedule->new_scheduled_at->format('l j F, H:i') }}
Motivo: {{ $reschedule->reason ?: '(sin motivo especificado)' }}
[Ver y confirmar →]8. interview_cancelled.blade.php
Cuándo: cancelación. Subject: "Entrevista cancelada: {title}".
9. assignment_presented.blade.php
Cuándo: recruiter mueve a presented. Destinatario: company_user (owner + manager). Subject: "Nuevo candidato: {candidate.name} para {vacancy.title}".
Hola,
HUMAE te presenta un candidato para "{{ $vacancy->title }}":
Nombre: {{ $candidate->first_name }} {{ $candidate->last_name }}
Headline: {{ $candidate->headline }}
Experiencia: {{ $candidate->years_of_experience }} años
Ubicación: {{ $candidate->city?->name }}, {{ $candidate->state?->name }}
[Ver perfil completo →]10. candidate_hired.blade.php
Cuándo: asignación → hired. Destinatario: candidato + company_user. Subject (candidato): "¡Felicidades! Has sido contratad@ para {vacancy}". Subject (empresa): "Contratación completada: {candidate} para {vacancy}".
Plantillas de sistema (no de negocio)
password_changed.blade.php
Aviso de seguridad: "Tu contraseña fue cambiada". Envía si security.notify_password_change = true.
new_login.blade.php (Fase 2)
Al loguearse desde IP/dispositivo desconocido.
Footers comunes
Todas incluyen:
- Dirección física de HUMAE (requisito legal CAN-SPAM).
- Link de unsubscribe (fase 2, no aplica a transaccionales críticos).
- Enlaces a políticas: Términos, Privacidad.
Sender y reply-to
- From:
MAIL_FROM_ADDRESS(ej.hola@humae.com.mx). - From name:
HUMAE. - Reply-To:
MAIL_REPLY_TO(ej.soporte@humae.com.mx) — para que el usuario pueda responder a humano.
Testing de plantillas
En dev
- MailHog en
localhost:8025(se incluye endocker-compose.yml). MAIL_MAILER=smtp,MAIL_HOST=mailhog,MAIL_PORT=1025.- Todos los correos quedan capturados en MailHog para revisión visual.
En prod
/var/log/mail.logregistra cada mensaje procesado por Postfix, constatus=sent|deferred|bounced.mailqmuestra la cola pendiente local; si crece, algo bloquea el envío saliente.- Revisar reputación de la IP en
talosintelligence.com/mxtoolbox.commensualmente.
Preview desde admin
Ruta: /admin/email-templates/{template}/preview
- Renderiza la plantilla con datos fake.
- Muestra versión HTML + texto plano lado a lado.
- Botón "Enviar prueba a mi email".
Siguiente
Mapa completo de qué evento dispara qué notificación: Catálogo de eventos →

