> ## 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.

# Module — messaging (MSG)

> Templates, campaigns, sends, deliverability, suppressions — and the platform-wide notification routing every other module depends on. Schema messaging.

Depends on `core`; never on `loyalty`, `crm` or `identity`.

| Document                                                                                                           | Purpose                                                             |
| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- |
| [`prd.md`](/modules/messaging/prd)                                                                                 | What the module is, for whom, non-goals, success, phases            |
| [`spec.md`](/modules/messaging/spec)                                                                               | The living technical shape: entities, invariants, events, endpoints |
| [`features/`](https://github.com/softcrumlabs/softcrum-suite/tree/master/docs/internal/modules/messaging/features) | The feature specs — the units of delivery                           |

Spanish mirror: [`../../es/modules/messaging/`](/es/modules/messaging/overview). English is authoritative.

## Feature roadmap

Nine deliveries. Six make F1a, because every other module needs to notify somebody.

| FS                                                                              | Feature                                         | Phase | Depends on | Status  |
| ------------------------------------------------------------------------------- | ----------------------------------------------- | ----- | ---------- | ------- |
| [FS-MSG-0001](/modules/messaging/features/fs-msg-0001-channel-cascade)          | Channel catalog and cascade resolution          | F1a   | —          | `draft` |
| [FS-MSG-0002](/modules/messaging/features/fs-msg-0002-templates)                | Message templates                               | F1a   | 0001       | `draft` |
| [FS-MSG-0003](/modules/messaging/features/fs-msg-0003-sends-and-status)         | Sends and status history                        | F1a   | 0001, 0002 | `draft` |
| [FS-MSG-0004](/modules/messaging/features/fs-msg-0004-suppressions-preferences) | Suppressions and preference center              | F1a   | 0003       | `draft` |
| [FS-MSG-0005](/modules/messaging/features/fs-msg-0005-dual-rail-dispatch)       | Dual-rail dispatch and workers                  | F1a   | 0003       | `draft` |
| [FS-MSG-0006](/modules/messaging/features/fs-msg-0006-channel-adapters)         | Channel adapters — email, in-app, webhook, push | F1a   | 0005       | `draft` |
| [FS-MSG-0007](/modules/messaging/features/fs-msg-0007-campaigns-and-triggers)   | Campaigns and triggers                          | F1b   | 0002, 0005 | `draft` |
| [FS-MSG-0008](/modules/messaging/features/fs-msg-0008-sender-domains)           | Sender domains and deliverability               | F1b   | 0006       | `draft` |
| [FS-MSG-0009](/modules/messaging/features/fs-msg-0009-sms-adapter)              | SMS adapter                                     | F1b   | 0006       | `draft` |

## The cut, explained

* **The cascade comes first** (`0001`). `resolveChannels()` is what every other module calls to ask
  "may I notify this person, on what". Nothing else in the module means anything without it.
* **Sends and dispatch are separate** (`0003`, `0005`). Recording that a message exists and getting
  it out under a shared provider rate limit are different problems: one is a state machine, the
  other is fairness between tenants.
* **Adapters are one delivery** (`0006`), not one per channel. They implement the same port with
  the same contract; splitting them would repeat the same spec four times.
* **Campaigns are F1b** (`0007`). F1a needs transactional notifications to work — points earned,
  coupon issued, OTP. Marketing blasts are a product surface that can follow.
* **SMS is last and separate** (`0009`) because it is the only one that needs a new vendor, which
  needs its own ADR (DEC-E1).

## The one rule the whole module exists to enforce

**Every send passes the cascade, and every send checks suppressions.** There is no path — not
transactional, not internal, not "just this once" — that reaches a channel adapter without both.
