> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Messaging windows and off-window sends: Meta DM, WhatsApp, and the no-window channels

> The one model that decides whether an off-window send is allowed: Meta DM's 24-hour window with RESPONSE/UPDATE/MESSAGE_TAG types and OTN tokens, WhatsApp's free-form session vs template rule, and why SMS and email have no window at all.

# Messaging windows and off-window sends

For two channels — Meta DM (Messenger and Instagram) and WhatsApp — Meta's
platform decides, per conversation, whether your outbound message is allowed
at all. An inbound message from the recipient opens a 24-hour customer-service
window; how long you have left, and what escapes exist once it closes, depends
on which channel you are sending to. This page explains the model once instead
of per channel, so an integrator reading the
[`MESSAGING_WINDOW_CLOSED`](/troubleshooting/messenger-window-closed) error
understands what the window is, what the escape hatches are, and which fields
to branch on.

The per-channel request shapes live on the [Messenger](/channels/messenger)
and [Instagram](/channels/instagram) pages; this page covers the shared
semantics. The compliance dimensions this model does **not** cover (registration,
quiet-hours windows, dialing windows) are consolidated on the
[omnichannel compliance matrix](/concepts/omnichannel-compliance-matrix).

## 1. The window everywhere: Meta DM

Meta's DM channels (Messenger and Instagram) share one rule, enforced upstream
by Meta and pre-checked by Orbit at send time:

* A recipient's inbound message (or postback tap) **opens a 24-hour window**
  for direct replies.
* Inside the window, sends pass as `messaging_type: RESPONSE` (a reply) or
  `UPDATE` (a proactive, non-promotional update).
* Outside the window, the only sends that pass are `messaging_type: MESSAGE_TAG`
  carrying a top-level `tag`, or a one-time-notification token (Messenger only).

The approved message tags Meta accepts on DM channels:

| Tag                      | Use                                                                                                |
| ------------------------ | -------------------------------------------------------------------------------------------------- |
| `HUMAN_AGENT`            | A human agent replied after the window closed; extends the window to 7 days for support follow-ups |
| `ACCOUNT_UPDATE`         | Account or profile change notification                                                             |
| `POST_PURCHASE_UPDATE`   | Order, shipping, or return status                                                                  |
| `CONFIRMED_EVENT_UPDATE` | Reminders and updates for a confirmed event                                                        |

Addressing is per-identity-scheme: Messenger replies go to the recipient's
PSID (Page-Scoped ID) and Instagram to their IGSID — both arrive in your
inbound webhook payload and are the `to` of every follow-up. A tag that Meta
did not approve, or a `MESSAGE_TAG` send with no `tag`, is rejected the same
way as an untagged send outside the window.

## 2. Where it bites in Orbit

Orbit pre-checks the window before dispatch, so a closed window rejects
synchronously with **422 `MESSAGING_WINDOW_CLOSED`** instead of a failed send
you reconstruct from Meta's callback:

```json theme={null}
{
  "error": { "code": "MESSAGING_WINDOW_CLOSED", "message": "..." },
  "details": {
    "hours_since_last_inbound": 31,
    "last_inbound_at": "2026-09-05T04:12:00Z"
  }
}
```

Read `details.hours_since_last_inbound` to tell a race (barely past 24) from a
quiet conversation (hundreds of hours); `details.last_inbound_at` is the anchor
the recipient's next inbound message resets. The full error surface, remediation
table, and the WhatsApp sibling codes
(`WHATSAPP_OUTSIDE_24H_WINDOW`, `WHATSAPP_RE_ENGAGEMENT_WINDOW_CLOSED`) are on
the [troubleshooting page](/troubleshooting/messenger-window-closed).

**The OTN exception (Messenger only).** A One-Time-Notification token is the
single-follow-up escape: you send an OTN *request* inside an open window, the
recipient taps to opt in, and exactly one later send can reference the token
and pass even after the window closes — then it is consumed. The request →
consume lifecycle, and why OTN is not a campaign primitive, is documented on
the [Messenger page](/channels/messenger#one-time-notification-otn).

First-contact sends are never pre-blocked: with no inbound history there is no
window to close, and the untagged send is passed to Meta, which rejects or
accepts it under its own rules. Tag first-contact sends yourself.

## 3. Cross-channel comparison

| Channel                        | Window rule                                                        | Off-window send                                          | Identifier scheme                   |
| ------------------------------ | ------------------------------------------------------------------ | -------------------------------------------------------- | ----------------------------------- |
| Meta DM (Messenger, Instagram) | 24 h after last inbound; `RESPONSE`/`UPDATE` inside                | `MESSAGE_TAG` + approved tag; OTN token (Messenger only) | PSID (Messenger), IGSID (Instagram) |
| WhatsApp                       | 24 h free-form session after last inbound; templates always        | Pre-approved template message — no tag alternative       | E.164 phone number                  |
| SMS / MMS                      | None — carrier registration governs, not a per-conversation window | N/A                                                      | E.164 phone number                  |
| Email                          | None                                                               | N/A                                                      | Email address                       |

The WhatsApp window is symmetric in shape but different in mechanics: inside
the session you reply free-form; outside it only template messages pass, and
sending a template does **not** reopen the window — only the recipient's reply
does. The [WhatsApp page](/channels/whatsapp) documents the window-status
pre-flight endpoint and the template-reply loop.

SMS, MMS, and email have no per-conversation messaging window at any layer.
Their gates are different planes entirely: A2P registration (10DLC, Sender-ID,
DLT) before the first send, plus your own opt-out suppression and quiet-hours
settings — comparison on the
[omnichannel compliance matrix](/concepts/omnichannel-compliance-matrix).

## 4. What Orbit meters on top

The window model is Meta's; two Orbit-level behaviours sit on top:

* **No delivery receipts.** Meta's Send API never emits DLRs, so Meta DM rows
  are flagged `no_dlr_channel: true` on message metadata and resolve to
  `submitted_no_receipt` after 5 minutes instead of `delivered`. On these
  channels that state is a functional delivery signal, not the ambiguous SMPP
  case — the distinction, and what to branch on, is on the
  [delivery lifecycle](/concepts/delivery-lifecycle#per-channel-caveats) page.
* **\$0 wallet behaviour on Messenger.** Connecting your own Meta Page makes
  you the provider of record, so every Messenger send — inside or outside the
  window, tag or OTN — is free on Orbit's side and never debits your wallet.
  Meta bills any Meta-side charges directly. See
  [Messenger → Pricing](/channels/messenger#pricing).

Neither behaviour changes the window rule: a \$0 send off-window without a tag
still returns 422.

## 5. What to branch on

Switch on machine-readable fields only:

* **`messaging_type`** — `RESPONSE`, `UPDATE`, `MESSAGE_TAG` on Meta DM sends;
  the declared relationship between your send and the window.
* **`tag`** — required on `MESSAGE_TAG` sends; one of the approved tags above.
* **`error.code`** — `MESSAGING_WINDOW_CLOSED` on Meta DM,
  `WHATSAPP_OUTSIDE_24H_WINDOW` on WhatsApp; the channel field on the error
  tells you which window tripped before you pick a fix.
* **`metadata.no_dlr_channel`** — present on Meta DM message rows, so a
  `submitted_no_receipt` reads as Meta's delivery-guaranteed case.

## See also

* [Messenger](/channels/messenger) and [Instagram](/channels/instagram) — per-channel request shapes, personas, OTN lifecycle
* [Troubleshooting: MESSAGING\_WINDOW\_CLOSED](/troubleshooting/messenger-window-closed) — error surface and remediation table
* [WhatsApp](/channels/whatsapp) — template vs free-form, window-status pre-flight
* [Omnichannel compliance matrix](/concepts/omnichannel-compliance-matrix) — the registration and window planes windows do not cover
* [Delivery lifecycle](/concepts/delivery-lifecycle) — where `no_dlr_channel` and `submitted_no_receipt` land in the state machine
