> ## Documentation Index
> Fetch the complete documentation index at: https://internal.softcrum.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Messaging — modelo de datos

> Las 19 tablas del schema messaging, cada una con su forma, su objetivo y el feature spec que la crea. Es infraestructura de notificación para toda la suite, no un módulo de producto aislado.

Schema `messaging`. Depende de `core`; **nunca** referencia tablas de `loyalty` ni de `crm`
(`standards/data.md` §1). Los demás módulos no envían nada: emiten eventos que este consume.

La columna **Forma** es la de [ADR-024](/adr/adr-024-table-naming-and-base-structure): **A** dominio
con alcance de tenant · **B** append-only · **C** catálogo paramétrico.

## Configuración de canales

Cuatro niveles de configuración que la cascada resuelve en orden
([ADR-019](/adr/adr-019-notification-cascade)). Están en tablas separadas porque cada nivel lo
administra alguien distinto.

| Tabla                     | Forma | De qué es dueña                                                                  | Spec        |
| ------------------------- | ----- | -------------------------------------------------------------------------------- | ----------- |
| `platform_channel_status` | C     | Nivel 0 — qué canales tiene habilitados la plataforma. Lo administramos nosotros | FS-MSG-0001 |
| `tenant_channel_setting`  | A     | Nivel 1 — qué canales habilitó el tenant y con qué credenciales                  | FS-MSG-0001 |
| `module_channel_setting`  | A     | Nivel 2 — qué canales usa cada módulo del tenant                                 | FS-MSG-0001 |
| `event_channel_routing`   | A     | Nivel 3 — a qué canal va cada tipo de evento. El nivel más específico gana       | FS-MSG-0001 |

## Plantillas y envíos

| Tabla                 | Forma | De qué es dueña                                                                                                                                                                                       | Spec        |
| --------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `message_template`    | A     | La plantilla por canal y por idioma, versionada. El tenant aporta el texto por locale                                                                                                                 | FS-MSG-0002 |
| `send`                | **B** | Cada mensaje despachado. **Alto volumen, particionada mensual** por `sent_at`. Append-only: un envío ocurrió o no ocurrió                                                                             | FS-MSG-0003 |
| `send_status_history` | **B** | Cada cambio de estado de un envío: aceptado, entregado, rebotado, marcado como spam. Particionada mensual. Separada de `send` porque un envío tiene muchos estados y llegan por webhook, desordenados | FS-MSG-0003 |
| `send_status`         | C     | Los estados posibles de un envío. No extensible: gobiernan una máquina de estados                                                                                                                     | FS-MSG-0003 |

## Consentimiento de envío

| Tabla                | Forma | De qué es dueña                                                                                                                                                              | Spec        |
| -------------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `suppression`        | A     | A quién no se le envía y por qué: rebote duro, queja de spam, baja manual. **Una supresión pesa más que cualquier configuración**: es la última compuerta antes de despachar | FS-MSG-0004 |
| `preference_setting` | A     | Las preferencias del destinatario por canal y por categoría — el centro de preferencias. Distinta de la supresión: acá el destinatario elige, allá el sistema decide         | FS-MSG-0004 |

## Despacho

| Tabla                 | Forma | De qué es dueña                                                                                                                                                                                                                                                                             | Spec        |
| --------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `rate_limit_bucket`   | A     | El estado del límite de tasa por carril y por tenant. Existe por un hallazgo concreto: el límite de Resend es **por equipo** y se comparte entre todos los tenants, así que el envío masivo de uno puede dejar sin correo transaccional a todos ([ADR-015](/adr/adr-015-dual-rail-sending)) | FS-MSG-0005 |
| `in_app_notification` | A     | La notificación in-app y su estado de lectura. Es el único canal cuyo mensaje vive en nuestra base en vez de salir hacia un proveedor                                                                                                                                                       | FS-MSG-0006 |
| `webhook_endpoint`    | A     | El endpoint del tenant que recibe nuestros webhooks, con su secreto de firma HMAC                                                                                                                                                                                                           | FS-MSG-0006 |

## Campañas

| Tabla              | Forma | De qué es dueña                                                                                                                                                      | Spec        |
| ------------------ | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `campaign`         | A     | La campaña con su audiencia, su plantilla y su ventana                                                                                                               | FS-MSG-0007 |
| `campaign_trigger` | A     | Qué dispara la campaña: una fecha, un evento, un cumpleaños, un aniversario                                                                                          | FS-MSG-0007 |
| `campaign_run`     | **B** | Cada ejecución de una campaña: a cuántos alcanzó, cuántos quedaron fuera y por qué. Append-only, y es lo que responde "¿por qué esta persona no recibió la campaña?" | FS-MSG-0007 |

## Deliverability

| Tabla                     | Forma | De qué es dueña                                                                                                                                                | Spec        |
| ------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `sender_domain`           | A     | El dominio de envío del tenant con su estado de verificación SPF, DKIM y DMARC                                                                                 | FS-MSG-0008 |
| `deliverability_metric`   | **B** | Las métricas agregadas por dominio y por período: tasa de entrega, de rebote, de queja. Append-only porque son mediciones, y alimentan las alertas del runbook | FS-MSG-0008 |
| `sms_sender_registration` | A     | El registro del remitente SMS ante el operador, que en varios países es un trámite con estado y plazos                                                         | FS-MSG-0009 |

## Lo que este schema **no** tiene

* **Ninguna decisión de negocio sobre a quién avisar.** Eso lo deciden `loyalty` y `crm` emitiendo
  eventos; `messaging` decide **por qué canal** y **si corresponde enviar**.
* **Ninguna tabla de contacto ni de consentimiento.** El consentimiento es de `core`
  (FS-CORE-0004); acá solo vive la supresión, que es una decisión de envío, no de tratamiento.
* **Ninguna FK hacia `loyalty` ni `crm`.**
