Ascend a new market without a hard-fail posture
Entering a new country has two regret shapes: gating so loose that unregistered or mismatched traffic sails into a regulated market, and gating so tight that a first campaign hard-fails on records you could not complete yet. The country gate — Orbit’s per-country registration and sender-type check, fed by the country-rules reference — supports a middle path. This playbook walks you from first lookup to a blocked-only-on-real-signals posture you can reverse cleanly.Every switch in this guide is tenant-owned: your scan mode, your
country allowlist, your sender registrations. Orbit curates the regulatory
reference and applies your posture to your traffic; it never gates
outbound globally. Confirm your obligations per market with counsel — this
is operations guidance, not legal advice.
What the federated country surface returns
GET /compliance/country-rules?channel=<channel> is read-only. It returns
one row per country × channel with the allowed sender_types, a
registration level of none, recommended, or required, and prose on
sender behavior and content restrictions. Read it as a decision input,
not as the gate itself:
The fail-closed half is deliberately narrow. Two shapes can block and
nothing else: an unregistered sender into a
required market, and a
resolved sender type outside the country’s permitted list. A country with
no row at all is never blocked — an uncatalogued destination produces
zero gate findings — and an empty sender_types list means “no recorded
restriction,” not “deny.” The write endpoints that curate these rows are
platform-admin only; your side of the surface is the read plus how you
respond to it.
Decide a posture for a new market
Set the order before you send a single message. The objective is that your first two weeks produce evidence, while the gate’s two can-block shapes stay fail-closed against genuinely wrong traffic.1
Flag on
With your org’s
policy scan mode
at
warn (the default), the gate already runs on every send to the new
market. A blocking-class finding — unregistered into a required
market, sender-type mismatch — is recorded and returned on the
message but does not stop dispatch. warn is your flag posture: every
send is screened, nothing is hard-failed yet.2
Block only on fail-closed signals
The gate’s two blocking shapes are fail-closed by design — no
favorable assumption unlocks them. Registering the Sender ID flips the
registration half to pass; choosing a sender identity from the country’s
sender_types flips the sender-type half. Treat those two as the only
knobs, and refuse to relax them with a loose scan mode.3
Verify in preflight
Before launch, run
POST /messages/lint against a draft body with
channel and either recipient_country or a destination to number.
The linter applies the same gate against the same rule rows and returns
the verdict a real send would get — pass, warn, or block — with
per-rule messages and suggestions, so “would we pass?” is answered
without spending a single message.4
Promote to strict when the evidence says so
After 14 days (the worked example below), if flagged violations are
resolved — registration approved, sender types aligned — move the org
to
strict. From that point a blocking verdict rejects the send with
POLICY_VIOLATION.When the platform says the carrier wants registration
Instrict mode, a send to a registration: required market without an
approved Sender ID is rejected with
400 POLICY_VIOLATION, and the details.violations list names the rule
country_registration_required with severity block, the destination
country, and a suggestion that points you at registration. A sender-type
mismatch names country_sender_type_not_permitted and lists the permitted
sender types. Legacy sender-registration codes you may see from earlier
integrations — SENDER_ID_NOT_REGISTERED — carry the same meaning on the
SMS path.
Thread that verdict into your sender resolver instead of treating it as a
dead end:
- Read the suggestion, not just the code. The violation message names the country and the unmet condition.
- Fix the identity, then retry. Register the sender for that country (Sender-ID Registration) or swap to a sender/campaign that already carries an approved registration for it. Retrying the identical request fails identically — the verdict is deterministic against the rule row.
- Resolve at routing time. If you use
sender resolution or sender pools, make
“carries an approved registration for the destination country” a
resolver input for
requiredmarkets, so the correct sender is picked before the gate runs rather than remediated after a 400.
off. That
detaches the gate from every other destination too; the fix belongs to the
sender, not the scanner.
Skip vs deny — decide on first lookup, not in bulk
For a new market profile, classify the country the first time you look it up, and record the decision on your side:- Deny in advance — the destination is out of scope for your business
(sanctioned, uneconomic, or simply not a market you serve). Set it in
your
outbound country allowlist.
The allowlist is empty by default — no destination restricted — and the
moment you set it, it is fail-closed by design: any off-list phone
destination is rejected with
422 COUNTRY_NOT_ALLOWED. A deny that lives in the allowlist is decided once, not re-decided per message. - Skip for now — the market is in scope but not launchable yet (no registration paperwork, wrong sender types, content not localized). Keep it out of your send lists and campaign audiences; the gate never sees the traffic, and nothing needs to be reversed later.
- Gate — the market is launchable under the posture above: flag on,
fail-closed on the two gate shapes, promote to
strictafter evidence.
Rollback check
Before you promote a market tostrict — and any time you need to undo
that promotion — verify what the gate would have said, not what it did
say:
- Would-be verdicts. Re-run the same draft through
POST /messages/lintunder each posture. The verdict is posture- dependent: ablockunderstrictis the same findingwarnrecords without stopping the send. If rollingstrictback towarnmakes a send pass again, the gate — not flaky carrier behavior — was the enforcement point, and the underlying rule row still applies. - Rule drift. Refresh
GET /compliance/country-rulesfor the market and compareregistrationandsender_typesagainst what you planned around. A country that wasrecommendedwhen you launched can becomerequiredafter an upstream re-sync; your rollback decision should price in the current row, not the launch-day one. - Allowlist reversal. To reverse a deny, remove the country from your allowlist (or clear the list to return to the empty, unrestricted default). There is no residual gate state — the next send re-evaluates against the current list.
- Audit trail. Mode changes (
warn→strictand back) and allowlist edits are written to your audit log, so a posture rollback is traceable to who changed what and when.
Worked example: 14 days of flag, then block
A retailer preparing SMS to a market whosecountry-rules row reads
registration: required:
1
Day 0 — flag on
Scan mode is
warn. Sends to the market return warn/block findings
in the X-Policy-Violations header and on the message metadata while
dispatch proceeds. The team shipping the campaign watches the
country_registration_required findings, not a dashboard of failures.2
Days 1–14 — remediate the flags
The flagged violation says the sender lacks an approved registration
for that market, so the submittable work is the
Sender-ID registration for that
country, and the sender pool is adjusted to prefer the registering
identity. New sends to the market stop producing
country_registration_required findings as the registration lands.3
Day 14 — move to block
Two consecutive days with zero gate findings for the market →
PATCH /settings/compliance/policy-scan-mode to strict. From this
point, if a new sender without an approved registration aims at that
market, the gate rejects it with POLICY_VIOLATION instead of
flagging it post-hoc.4
Reversal
If a launch needs to be walked back:
PATCH the mode to warn (the
gate keeps screening and recording, stop hard-failing), rerun the
rollback check above to confirm the finding faded, and fix at the
sender layer before trying strict again.Related references
- Country Compliance Requirements — the read-only regulatory reference this playbook decides against.
- Pre-Send Policy Scanner & DLP — verdicts,
the enforcement mode, and
/messages/lintpreflight. - Send Gates — the gate chain that runs alongside the scanner.
- Sender-ID Registration — submit and track the registrations the gate checks.
- Country allowlist gate model —
the deny-in-advance surface (
COUNTRY_NOT_ALLOWED). - Sender Resolution — route the correct sender before the gate runs.