Apariencia
Catálogo de eventos
Tabla exhaustiva de qué dispara cada notificación, a quién llega y por qué canales.
Eventos de autenticación
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Registro | Candidato creado | Candidato | VerifyEmail (Laravel default) | |
| Email verificado | Click en link | Candidato | WelcomeNotification | |
| Reset de contraseña solicitado | POST /auth/forgot-password | Candidato | ResetPasswordNotification | |
| Contraseña cambiada | Nuevo hash guardado | email (opt-in) | Usuario | PasswordChangedNotification |
| Login desde IP nueva (Fase 2) | Detección de IP | Usuario | NewLoginFromUnknownIpNotification |
Eventos de membresía
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Pago iniciado | POST /me/membership/checkout | — | — | (sin notificación) |
| Pago completado | Webhook Stripe checkout.session.completed | email + in-app | Candidato | MembershipActivatedNotification |
| Pago fallido | Webhook payment_intent.payment_failed | email (Fase 2) | Candidato | PaymentFailedNotification |
| Membresía expira en 15 días (Fase 2) | Cron diario | email + in-app | Candidato | MembershipExpiringNotification |
| Membresía expirada | Cron diario (ExpireMembershipsJob) | email (Fase 2) | Candidato | MembershipExpiredNotification |
| Membresía cancelada | Admin cancel | email (Fase 2) | Candidato | MembershipCancelledNotification |
Eventos de perfil
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Cambio de estado del candidato | Pipeline progress | in-app | Candidato | CandidateStateChangedNotification |
| Perfil aprobado | Admin aprueba manualmente | email + in-app | Candidato | ProfileApprovedNotification |
| Foto actualizada | POST /avatar | — | — | (silencioso) |
Eventos de pipeline
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Nueva asignación (sourced) | Recruiter asigna | in-app | Candidato (opt-in) | NewAssignmentNotification |
| Asignación presentada | stage → presented | email + in-app | company_user (owner+manager) | AssignmentPresentedNotification |
| Asignación en entrevista | stage → interviewing | — | — | (sustituido por InterviewScheduled) |
| Candidato finalista | stage → finalist | email + in-app | company_user | CandidateFinalistNotification |
| Candidato contratado | stage → hired | email + in-app | Candidato + company_user + admin | CandidateHiredNotification |
| Candidato rechazado | stage → rejected | email (opt-in) | Candidato | AssignmentRejectedNotification |
| Candidato retirado | stage → withdrawn | — | — | (silencioso) |
| Company escribió nota | POST /notes (visibility=company) | in-app | Recruiter asignado | CompanyAddedNoteNotification |
Eventos de entrevista
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Entrevista agendada | POST /interviews | email + in-app | Candidato + company_user | InterviewScheduledNotification |
| Entrevista confirmada | POST /interviews/{id}/confirm | email + in-app | Todas las otras partes | InterviewConfirmedNotification |
| Entrevista reprogramada | POST /reschedule | email + in-app | Todas las partes | InterviewRescheduledNotification |
| Entrevista cancelada | POST /cancel | email + in-app | Todas las partes | InterviewCancelledNotification |
| Entrevista realizada | POST /complete | — | — | (silencioso — feedback privado) |
| No asistió | POST /no-show | email + in-app | Candidato | InterviewNoShowNotification |
| Recordatorio 24h antes (Fase 2) | Cron — ver cronjobs | Todas las partes | InterviewReminderNotification | |
| Recordatorio 1h antes (Fase 2) | Cron — ver cronjobs | email + push | Todas las partes | InterviewImminentNotification |
Eventos de vacante
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Vacante publicada | POST /vacancies/{id}/publish | in-app | Todos los recruiters HUMAE | VacancyPublishedNotification |
| Vacante asignada a recruiter | PATCH assigned_recruiter_id | email + in-app | Recruiter asignado | VacancyAssignedToYouNotification |
| Vacante cubierta | stage hired | in-app | Recruiters + admin | VacancyFilledNotification |
| Vacante cancelada | POST /cancel | email + in-app | Recruiter asignado + company_user | VacancyCancelledNotification |
| Vacante próxima a expirar (Fase 2) | Cron | in-app | Company_user + admin | VacancyExpiringNotification |
Eventos de empresa
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Invitación a company_user | Admin invita | Invitado | CompanyInvitationNotification | |
| Nuevo miembro agregado | POST /company/{id}/members | in-app | Owners + managers | CompanyMemberAddedNotification |
| Miembro removido | DELETE | Removido | CompanyMemberRemovedNotification |
Eventos administrativos
| Evento | Trigger | Canal | Destinatario | Clase |
|---|---|---|---|---|
| Ticket de contacto | POST /contact | Admin support | NewContactSubmissionNotification | |
| Reporte de abuso (Fase 2) | POST /report | Admin | AbuseReportNotification | |
| Usuario suspendido | Admin suspende | Usuario afectado | AccountSuspendedNotification | |
| Usuario reactivado | Admin reactiva | Usuario afectado | AccountReactivatedNotification |
Resumen por destinatario
Candidato
- Registro: bienvenida, verificación, reset password
- Membresía: activación, expiración
- Pipeline: asignaciones (opcional), contratación
- Entrevistas: todas las transiciones
- Admin: suspensión/reactivación
Company user (owner/manager)
- Onboarding: invitación
- Pipeline: candidatos presentados, finalistas, contrataciones
- Entrevistas: todas las transiciones
- Vacantes: cancelación, próxima a expirar
Recruiter HUMAE
- Pipeline: nuevas notas de empresa, vacantes asignadas
- Vacantes: publicadas, canceladas, cubiertas
- Entrevistas: confirmaciones (copia)
Admin
- Soporte: tickets, reportes de abuso
- Sistema: webhooks fallidos, errores críticos
- Financiero: resumen diario (Fase 2)
Cómo silenciar o habilitar
MVP
- Silenciar/habilitar por categoría global via
settings.notifications.{event}. - No hay opt-out individual.
Fase 2
- Página
/me/preferenciascon toggles por categoría y canal. - Endpoint
PATCH /me/notification-preferences. - Respetado en cada
Notification::via().
Siguiente
Cómo se integra con proveedores externos: Stripe →

