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

# The send-gate evaluation chain — which gate fires, in which order

> The ordered list of compliance gates a send traverses end-to-end — consent, suppression, quiet hours, DNC/RND, HIPAA BAA, sender-ID, 10DLC, STIR/SHAKEN, DNO, the federal voice window, and the per-country rate guard — with each node's error codes, a first-matching-gate mental model, and per-gate ownership.

# The send-gate evaluation chain

When an outbound send refuses to dispatch, the response names one
gate — never two. That's because every send passes through a fixed
**ordered chain** of checks, and the **first** gate that says no is
the one you hear about. This page describes that chain end-to-end so
you can answer "which gate fired, and what's upstream of it?" without
opening five different pages.

Every gate below is tenant-owned — you enabled it, you configure
its posture, you decide whether it applies to your traffic. One
sole exception is called out in place: the US TCPA federal voice
dialing window (a platform-global hard guard with no tenant toggle).

<Warning>
  This page describes Orbit's platform controls. It is **not legal
  advice.** Which laws apply to your traffic, and what posture is
  adequate for it, depends on your jurisdiction, your recipients,
  and the content of your sends. Confirm with qualified counsel.
</Warning>

***

## 1. The chain, in order

Read top to bottom. A send exits the chain at the first failing
gate and surfaces that gate's error code — every later gate is
silent. The sequence is:

| # | Gate | Error code(s) it emits | Notes |
| - | - | - | - |
| 1 | **Consent** — affirmative opt-in on the contact, when enabled | `422 MESSAGING_CONSENT_REQUIRED` | Per-tenant toggle; off means no-op |
| 2 | **Suppression & STOP-fence** — suppression list and the Redis STOP fence a contact's STOP opt-out erected | `422 SUPPRESSED` family | STOP-fence always on — a STOP keyword erects it before the rest of the chain reads |
| 3 | **Unknown-marketing-policy** — a send whose marketing-political classification has no posture | `422 UNKNOWN_MARKETING_POLICY` | Tenant posture; off by default |
| 4 | **DNC scrub** — Do-Not-Call federal + state registers | `422 DNC_CONTACT` · `422 DNC_NUMBER` · `403 DNC_SYNC_NOT_ENABLED` (no feed synced) | Opt-in per tenant; fails open until a federal snapshot syncs |
| 5 | **RND scrub** — FCC Reassigned Numbers Database | `422 RND_REASSIGNED` · `403 RND_SCRUB_NOT_ENABLED` · `409 RND_FEED_NOT_CONFIGURED` | Opt-in per tenant |
| 6 | **Quiet hours — org gate with campaign fallback + platform default** | `422 QUIET_HOURS_BLOCKED` · `422 QUIET_HOURS_TIMEZONE_UNKNOWN` | Org gate first; a campaign's own `start_hour`/`end_hour` is the fallback; otherwise the per-channel default window |
| 7 | **HIPAA BAA** — executed, in-term Business Associate Agreement for HIPAA-mode orgs | `422 HIPAA_BAA_REQUIRED` · `500 HIPAA_BAA_GATE_DB_FAIL` (fail-**closed** transient) | Platform-invariant once HIPAA mode is on — one of the few fail-closed gates |
| 8 | **Sender-ID country registration** — alphanumeric `from` registered (and approved) for the destination market | `422 SENDER_ID_NOT_REGISTERED` · `422 SENDER_ID_NOT_APPROVED` · `503 SENDER_ID_CHECK_UNAVAILABLE` (transient) | Country-shaped: Brazil Anatel, Argentina Enacom, UAE TDRA, Singapore SGNIC, Saudi CST, etc. |
| 9 | **10DLC campaign registration** — US A2P long-code brand+campaign posture | `422 TEN_DLC_NOT_REGISTERED` | US-locks to the sender's shape: TFV for toll-free, 10DLC for long-code, alphanumeric skips |
| 10 | **KYC attach** — verified identity packet bound to the sender | KYC error family | Tenant-owned posture |
| 11 | **STIR/SHAKEN attestation** — caller-ID ownership resolution and attestation level at dial time | `stp`-no-codes — see [STIR/SHAKEN posture guide](/compliance/stir-shaken-posture-guide) | Voice only; not a block gate by itself — it shapes attestation level (A/B/C) on the SIP INVITE |
| 12 | **DNO caller-ID reject** — Do-Not-Originate list match on the `from` | `422 VOICE_DNO_BLOCKED` | Voice only; extend/replace/subtract org override |
| 13 | **Federal voice dialing window** — US TCPA 8 am–9 pm recipient-local | `422 TCPA_FEDERAL_DIALING_WINDOW_BLOCKED` · `422 TCPA_TIMEZONE_UNKNOWN` | **Platform-owned invariant** — no tenant toggle, no opt-out, fails closed on unresolved timezone. Campaign and dialer voice always enforce it; ad-hoc 1:1 dialing is advisory by default. |
| 14 | **Emergency short-code block** — destination matches US 911, EU 112, UK 999, AU 000 | `422 EMERGENCY_CALLING_NOT_SUPPORTED` | Platform-invariant — hard guard, no tenant knob |
| 15 | **Per-country voice rate window** — sliding-window country rate cap | `429 VOICE_COUNTRY_RATE_LIMITED` | Voice-traffic rail, not a compliance gate — but fires on the same pre-dispatch path |
| 16 | Dispatch | — | Send leaves the chain and hands off to the channel router |

<Note>
  Not every send traverses every node — toggles mean skips. A contact
  with no STOP-fence doesn't fail node 2; an org that isn't HIPAA-mode
  skips node 7; a US voice call skips nodes 8–10 (they're SMS-routed);
  a domestic short-code skips 10DLC. The chain is canonical order, not
  a mandate that every send hit every gate.
</Note>

***

## 2. The first-matching-gate mental model

The chain evaluates **sequentially** and exits at the **first**
failure. When you trace a blocked send, walk the chain top-down and
ask, at each node, "could this one have fired?"

> **Concrete trace.** A US campaign targets a contact whose number
> used to belong to a litigator, and the send is queued outside the
> federal 8 am–9 pm recipient-local voice window.
>
> What blocks it? **The federal window** (node 13) — not the
> litigator check (which sits upstream at node 3 in the broader
> posture shape), and not DNC (node 4), because the campaign
> dispatcher hits the federal voice-window gate before the SIP
> INVITE leaves the platform. The recipient never gets a call, and
> the response carries `422 TCPA_FEDERAL_DIALING_WINDOW_BLOCKED`.
>
> Re-check the recipient at 9 am their local time with
> `GET /compliance/quiet-hours/preview`, and the *next* gate in the
> chain is what you'll see — potentially `DNC_CONTACT` or
> `HIPAA_BAA_REQUIRED` depending on posture. Don't assume the first
> error was the *only* gate between the send and dispatch.

**Three implications to keep in mind when triaging:**

1. **The first error you see is not the only gate that matters.**
   Fix `SENDER_ID_NOT_REGISTERED` and the very same send may then
   hit `TEN_DLC_NOT_REGISTERED`. Iterate down the chain.
2. **A re-check curls them in order** — don't fix in reverse.
   `GET /quiet-hours/preview` answers node 6 and 13; `GET
   /dnc/check` answers node 4; the BAA status endpoint answers node
   7\. Re-probe each in sequence after each fix.
3. **A fail-closed transient is never a fix-it-later gate.** Node
   7 (`HIPAA_BAA_GATE_DB_FAIL`) and node 13 (timezone-unresolved
   blocked) close the send on a transient read rather than let PHI
   or a federal-window violation through silently. Treat those as
   support escalations, not retry loops.

***

## 3. Per-gate ownership map

Every gate in the chain is owned by **you, the tenant**, except
two. The split matters when you read a posture runbook or write an
internal change-management request:

| Gate | Owned by | Why |
| - | - | - |
| Consent | Tenant | You decide which sends need affirmative opt-in |
| Suppression & STOP-fence | Tenant | A contact's STOP erects the fence; the tenant owns the contact record |
| Unknown-marketing-policy | Tenant | Your marketing-policy posture, your classification |
| DNC scrub | Tenant (opt-in) | You choose to scrub; the federal feeds sync separately |
| RND scrub | Tenant (opt-in) | Same posture model as DNC |
| Quiet hours | Tenant | Window, channel on/off, recipient timezone source — all yours |
| HIPAA BAA | Tenant (when HIPAA on) | You attest HIPAA mode; executing the BAA is your act |
| Sender-ID country registration | Tenant | You file in each market you send into |
| 10DLC campaign registration | Tenant | Your TCR brand and campaigns |
| KYC attach | Tenant | Your legal packet |
| STIR/SHAKEN | Tenant-influenced | Your number ownership shapes A/B/C; the softswitch terminates |
| DNO caller-ID reject | Tenant (extends baseline) | You curate the extend/replace/subtract override |
| **Federal voice dialing window** | **Platform** | Sole platform-owned gate — 47 U.S.C. § 227(b)(1)(B) is not yours to waive |
| **Emergency short-code block** | **Platform** | Hard guard; no tenant knob, no override |
| Per-country voice rate window | Platform | Traffic rail, not a compliance control |

<Note>
  "Tenant-owned" here means you control whether the gate applies to
  your traffic — not that Orbit mandates the posture. Orbit enforces
  what you set; the decision to engage a gate is yours.
</Note>

***

## 4. Before you escalate — map the code to its deep page

Every error code in the chain has exactly one deep page that owns it.
Use this table to leave this page and land on the fix, rather than
chasing multiple symptoms across docs.

| Error code | Chain node | Owning deep page |
| - | - | - |
| `MESSAGING_CONSENT_REQUIRED` | 1 | [Consent management](/compliance/consent-management) |
| `SUPPRESSED` family | 2 | [Opt-out & suppression lists](/compliance/opt-out-suppression) |
| `UNKNOWN_MARKETING_POLICY` | 3 | [Unknown-marketing-policy posture](/compliance/spam-keywords) |
| `DNC_CONTACT` / `DNC_NUMBER` / `DNC_SYNC_NOT_ENABLED` | 4 | [DNC scrub](/compliance/dnc-scrub) |
| `RND_REASSIGNED` / `RND_SCRUB_NOT_ENABLED` | 5 | [RND scrub](/compliance/rnd-scrub) |
| `QUIET_HOURS_BLOCKED` / `QUIET_HOURS_TIMEZONE_UNKNOWN` | 6 | [Quiet-hours preview](/compliance/quiet-hours-preview) |
| `HIPAA_BAA_REQUIRED` / `HIPAA_BAA_GATE_DB_FAIL` | 7 | [HIPAA BAA gate](/compliance/baa-gate-guide) · [HIPAA](/compliance/hipaa) |
| `SENDER_ID_NOT_REGISTERED` / `SENDER_ID_NOT_APPROVED` / `SENDER_ID_CHECK_UNAVAILABLE` | 8 | [Sender-ID registration](/compliance/sender-id-registration) |
| `TEN_DLC_NOT_REGISTERED` | 9 | [10DLC registration](/guides/10dlc-registration) |
| KYC error family | 10 | [KYC identity model](/compliance/kyc-identity-model) |
| STIR/SHAKEN attestation level readouts | 11 | [STIR/SHAKEN posture guide](/compliance/stir-shaken-posture-guide) |
| `VOICE_DNO_BLOCKED` | 12 | [Do-Not-Originate](/compliance/do-not-originate) |
| `TCPA_FEDERAL_DIALING_WINDOW_BLOCKED` / `TCPA_TIMEZONE_UNKNOWN` | 13 | [Federal voice guard](/concepts/tcpa-federal-voice-guard) |
| `EMERGENCY_CALLING_NOT_SUPPORTED` | 14 | [Emergency calling and Kari's/Ray Baum's posture](/compliance/emergency-calling-and-karis-ray-baums-posture) |
| `VOICE_COUNTRY_RATE_LIMITED` | 15 | [Voice destination auto-blocks](/compliance/voice-destination-auto-blocks) |
| `COMPLIANCE_CHECK_UNAVAILABLE` (500) | Any | [Troubleshooting compliance error codes](/compliance/troubleshooting-compliance-error-codes) |

If the code isn't here, fall back to the
[troubleshooting-compliance-error-codes](/compliance/troubleshooting-compliance-error-codes)
routing surface, which maps every pre-send compliance code by gate
family, including regional and industry overlays this chain page
doesn't enumerate.

***

## 5. Reading order for the rest of the compliance docs

The chain page is the map. The neighbors:

* [Compliance posture overview](/compliance/posture-overview) — the
  toggle map for every control on this page, with defaults and
  fail-open vs fail-closed per gate.
* [Send gates](/compliance/send-gates) — per-gate behavior,
  endpoints, and the full fail-open/fail-closed semantics for the
  gates that are toggles.
* [Send-gate decision fork](/compliance/send-gate-decision-fork) —
  the inverse view: start from the error code, land at the gate.
* [Compliance send-gate error codes](/compliance/troubleshooting-compliance-error-codes) —
  router-by-router walkthroughs with re-check curls.
* [Tenant posture before the first send](/compliance/tenant-posture-first-run) —
  the runbook that walks the toggle side of this chain in
  configuration order.

***

## What this page deliberately does not say

* It does not say *which* gates your traffic should engage — that's
  your counsel's call and your regulator's charter, not Orbit's.
* It does not list every regional sender-ID overlay (Argentina
  Enacom, UAE TDRA, Singapore SGNIC, Saudi CST, Indonesia Komdigi).
  Those are node 8's market-specific branches and have their own
  per-market pages.
* It does not replace legal advice. Read
  [Compliance posture FAQ](/compliance/posture-faq) for the
  platform-posture framing that pairs with this chain.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.