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

# Outbound compliance pre-flight checklist

> Walk the send gates in admission order before a campaign launches — wallet posture, opt-out/suppression sync, quiet hours, frequency caps, compliance profiles, and the TCPA voice window — then dry-run with the preview endpoints and count blocked rows after launch.

# Outbound compliance pre-flight checklist

Every outbound send on Orbit is admitted through a chain of gates before it
reaches a provider. The [send-gating model](/concepts/send-gating-and-quiet-hours)
maps those gates and the order a send walks them. This checklist turns that
map into a pre-launch pass: confirm each gate's posture **before** a campaign
opens, so a blocked row is a surprise you chose, not a gate you forgot to
check.

Run the checklist top-to-bottom — the order below mirrors the admission
chain, so each check you pass is one fewer gate that can refuse your traffic
mid-blast. Assign an owner per item, exactly like the
[production go-live checklist](/guides/go-live-checklist) (which covers
numbers, channels, and members — this page covers only outbound compliance).

## 1. Wallet posture — can the org send at all?

The wallet/billing gate is the first flag a send consults after quiet hours
and duplicate-content are claimed. Resolve it first: nothing else matters
until the org can legally open money.

* [ ] **Balance is funded for launch volume plus headroom.** A zero balance
  pauses the whole org with `402 SENDING_PAUSED`; top up before the blast and
  let auto-resume lift the pause. *Owner: Operations/Finance.*
* [ ] **No billing-alert pause or dunning hold is active.** Read
  `GET /api/v1/billing/balance` — confirm `outbound_paused` is `false` and
  check `outbound_block_reason` for a hint if it isn't. *Owner: Operations/Finance.*
* [ ] **Billing alerts and actions won't trip mid-campaign.** An alert pause
  firing during the blast halts every remaining send; set thresholds above
  expected spend. *Owner: Operations/Finance.*

See [Wallets, credits, and charges](/concepts/wallets-credits-and-charges)
for the ledger and pause-flag semantics.

## 2. Opt-out and suppression — is the block list current?

Recipient block lists are consulted per recipient, after the org-level gate.
A send to a suppressed address drops as a `skipped` row (campaign) or
`422 RECIPIENT_OPTED_OUT` (direct).

* [ ] **Bulk-import the existing suppression list before launch.** Upload the
  CSV you migrated from a prior platform or a partner list — per-row results,
  deduplicated against what's already on file. See
  [Opt-out & suppression lists](/compliance/opt-out-suppression).
  *Owner: Compliance/Operations.*
* [ ] **Re-export and cross-check the live list.** Use the suppression export
  to confirm the totals you expect post-import. *Owner: Compliance.*

## 3. Quiet hours — which window governs this send?

The quiet-hours evaluator is the first content-level gate and fails closed
for marketing traffic. Decide the window before scheduling anything.

* [ ] **Choose the org gate or the campaign fallback window explicitly.**
  Public 1:1 sends follow the per-channel org toggle; drip/journey sends
  with no per-campaign window fall back to the org-wide default. Decide
  which one governs this send — don't let a surprise fallback pick the
  window. See [Quiet hours configuration](/guides/quiet-hours-configuration).
  *Owner: Operations/Compliance.*
* [ ] **Confirm the timezone policy for unresolvable recipients.** Under a
  `deny` policy a recipient whose timezone can't be resolved is blocked
  (`422 QUIET_HOURS_TIMEZONE_UNKNOWN`); pick that outcome consciously.
  *Owner: Compliance.*

## 4. Frequency caps — are per-contact limits set?

Frequency caps claim a slot per recipient; over the cap, direct sends get
`429 FREQUENCY_CAP_EXCEEDED` and campaign sends skip with `frequency_capped`.
Set them **before** the blast, not after complaints.

* [ ] **Configure rolling-window caps per channel and use case.** Marketing
  gets recipient-facing caps; system traffic gets coherent limits. See
  [Frequency caps](/guides/frequency-caps). *Owner: Operations.*
* [ ] **Distinguish caps from duplicate-content suppression.** Caps limit
  *how many* sends; the [message suppression](/guides/message-suppression)
  content-hash policy blocks the *same body* re-sent inside a window. Set
  whichever one addresses the actual risk. *Owner: Operations.*

## 5. Compliance profiles — is the destination cleared?

Regulated destinations carry registration and profile requirements a send
checks before dispatch.

* [ ] **Evaluate eligibility for the destination before launch.** Run
  `GET /numbers/available`'s `requires_registration` evaluation for the
  target market so a blocked destination is caught pre-launch, not at send
  time. See [Assemble your tenant's compliance posture](/guides/compliance-profiles-assemble).
  *Owner: Compliance.*
* [ ] **Attach the required compliance profile for regulated traffic.**
  HIPAA-mode sends are blocked until a BAA is executed and in term; confirm
  the profile before opening the campaign. See
  [Send gates](/compliance/send-gates). *Owner: Compliance.*

## 6. TCPA federal voice window — if the campaign has a voice leg

For US (+1) recipients, the federal TCPA 8 am–9 pm recipient-local dialing
window hard-blocks campaign and dialer voice regardless of tenant settings —
there is no toggle, and a recipient whose timezone can't be resolved is
blocked outright.

* [ ] **Schedule voice calls inside the recipient-local 8 am–9 pm window.**
  Use the preview endpoint below to find the next allowed time per
  recipient. See [Send gates: US voice TCPA](/compliance/send-gates).
  *Owner: Operations/Compliance.*
* [ ] **Resolve recipient timezones before the blast.** An unresolvable
  timezone hard-blocks the call on campaign/dialer traffic; supply
  `recipientTimezone` where you know it. *Owner: Compliance.*

## 7. Dry-run — preview the gates before the send

Two read-only endpoints answer "would this send go through right now?":

* `GET /api/v1/compliance/quiet-hours/preview?phone=<E.164>&channel=<channel>`
  — is the recipient inside the permitted local window, and when does it next
  open? Call pattern in [Send gates: Quiet hours](/compliance/send-gates).

* `GET /api/v1/compliance/dnc/check?phone=<E.164>` — is the number on a
  block list (`on_dnc`, plus the flagging `source`)? Call pattern in
  [Send gates: DNC](/compliance/send-gates).

* [ ] **Run the quiet-hours preview for a sample of recipients across the
  target time zone spread.** *Owner: Engineering/Operations.*

* [ ] **Run the DNC check (or batch `POST /compliance/dnc/scrub` for the
  whole list, up to 500 numbers per request) for the campaign audience.**
  *Owner: Compliance.*

## 8. Post-launch — count blocked rows by error code

After the campaign fires, open the delivery log and group blocked sends by
the gate that refused them. The [error codes reference](/api-reference/error-codes)
maps each code to a gate; the troubleshooting pages walk the resolution.

* [ ] **`402 SENDING_PAUSED` / `SENDING_BLOCKED`** — wallet/billing flag.
  Poll `GET /billing/balance` until the flag clears, then resume.
* [ ] **`422 RECIPIENT_OPTED_OUT` / skipped `opted_out`** — block-list hit.
  Remove the recipient from the audience until they re-consent.
* [ ] **`422 QUIET_HOURS_BLOCKED`** — outside the window; reschedule at
  `next_allowed_at`. On US voice, `422 TCPA_FEDERAL_DIALING_WINDOW_BLOCKED`
  — see [TCPA window blocked calls](/troubleshooting/tcpa-window-blocked-calls).
* [ ] **`429 FREQUENCY_CAP_EXCEEDED` / skipped `frequency_capped`** — over a
  cap you set; honor `retry_after_seconds` or widen the cap deliberately.
* [ ] **`422 HIPAA_BAA_REQUIRED`** — HIPAA-mode blocked until the BAA is
  executed. See [Phi audience BAA required](/troubleshooting/phi-audience-baa-required).
* [ ] **The rest of the gate-specific codes** — quiet-hours timezone
  resolution, DNC/RND scrub gates, emergency stop — map at
  [Send gates](/compliance/send-gates) and the
  [error codes reference](/api-reference/error-codes).

A campaign with a verified scrub should see blocked rows only where you
deliberately chose a strict gate; the goal of this checklist is to shrink
that set to the intended one.

## See also

* [Send-gating model](/concepts/send-gating-and-quiet-hours) — the gate map
  and admission order this checklist walks.
* [Production go-live checklist](/guides/go-live-checklist) — numbers,
  channels, members, and billing readiness; this page covers only the
  outbound-compliance pre-flight.
* [Send gates](/compliance/send-gates) — BAA, quiet hours, DNC/RND/RMD scrub,
  and the emergency stop.
* [Error codes](/api-reference/error-codes) — the full blocked-row map.
