Skip to content

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 en docker-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.log registra cada mensaje procesado por Postfix, con status=sent|deferred|bounced.
  • mailq muestra la cola pendiente local; si crece, algo bloquea el envío saliente.
  • Revisar reputación de la IP en talosintelligence.com / mxtoolbox.com mensualmente.

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 →

Manual de usuario HUMAE · Uso interno