# Códigos de error: Motivos de envío (reason_code)

> Clase de un fallo de envío (`SendReasonCode` en `src/channels/send/channel-send.contracts.ts`). Viaja como `reason_code` junto al `code` concreto en toda respuesta de error del envío, para que el front y la IA sepan QUÉ HACER sin conocer cada código. Algunos también son el `code` de una respuesta.

**Cómo se detecta (toda la familia):** En la respuesta de error del envío (`reason_code`) y en `channel_messages.error_json` de un mensaje fallido.

**Qué hacer (toda la familia):** Decide por el motivo: `WINDOW_CLOSED` → plantilla; `*_RATE_LIMITED` → esperar `retry_after_seconds` (o `retry_at`); `CHANNEL_NOT_SENDABLE` → reconectar o configurar la cuenta; `INVALID_COMMAND` → el mensaje está mal armado; `PROVIDER_REJECTED` → leer el `code` de Meta.

Lo que un código no dice lo hereda de la familia.

## `CHANNEL_ACCOUNT_FORBIDDEN`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La persona o el workflow no tiene permitido usar esa cuenta de canal (número o página).

## `CHANNEL_NOT_SENDABLE`

- **Tipo:** HTTP, motivo · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** La cuenta de canal no puede enviar ahora: apagada, sin token, sin configurar o la salida no es de Boost.

## `CONTACT_RATE_LIMITED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Tope de envíos automáticos a un mismo contacto. Hoy nace en modo observar (`would_deny`, el mensaje sale); corta solo con `CHANNELS_SEND_CONTACT_CAP_MODE=enforce`.

## `HUMAN_AGENT_NOT_ALLOWED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La etiqueta `HUMAN_AGENT` (responder hasta 7 días en Messenger/Instagram) solo la puede usar una persona, no una automatización.

## `INVALID_COMMAND`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El pedido de envío está mal armado (falta un campo, contenido no soportado, límite excedido): reintentar igual no sirve.

## `MEDIA_NOT_AVAILABLE`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El archivo a enviar no se pudo obtener (no existe, está vacío o es demasiado grande para el canal).

## `NOT_IN_SCOPE`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El envío no le toca a este camino (otra cuenta, otro chat, un hilo que la salida directa no creó).

## `PROVIDER_RATE_LIMITED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Meta (o SES) está limitando: esperar el tiempo que dice `retry_after_seconds`. Reintentar antes no adelanta nada.

## `PROVIDER_REJECTED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Meta o SES rechazó el mensaje: el `code` concreto (`CHANNEL_SEND_META_<n>`, `EMAIL_PROVIDER_REJECTED`) dice por qué.

## `RECIPIENT_SUPPRESSED`

- **Tipo:** interno, detalle, motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El destinatario no quiere recibir (se dio de baja de marketing en WhatsApp, o su correo rebotó o se quejó): no se le vuelve a escribir.

## `TEMPLATE_RATE_LIMITED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Tope de plantillas por contacto o por tiempo: hay que esperar antes de mandar otra.

## `UNKNOWN_DELIVERY`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** No se sabe si el mensaje salió: Meta no respondió a tiempo. Es un resultado de entrega, no una negación: no se reintenta solo para no duplicar.
- **Cómo detectarlo:** Render: `channel_send_unknown_delivery`. Base: `channel_messages` con este `error_code`.
- **Qué hacer:** Revisar el chat en WhatsApp o esperar el estado de Meta antes de reenviar a mano.

## `WINDOW_CLOSED`

- **Tipo:** motivo · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La ventana de 24 h de WhatsApp está cerrada: solo se puede mandar una plantilla aprobada.
