Troubleshooting: resolve dialing-window blocked voice calls
A voice call held by a dialing window fails with a422 before it ever
reaches the phone network — no SIP is dispatched, no carrier sees it,
and no trunk or codec change will clear it. Every block in this class
answers with four fields in the error details: reason, the resolved
timezone, local_hour at the recipient, and next_allowed_at. Those
four fields, plus which of the three error codes you received, tell you
which gate fired and what to change.
This page maps each code to its fix. For the concept behind the gates
(which states carry an overlay, why weekends matter), see
US state calling windows — this
page works the errors, not the statutes.
Symptom → cause index
Find your error code and reason first, then go to the section that works it.
One distinction cuts most triage short:
TCPA_DIALING_WINDOW_BLOCKED
comes from a gate you turned on — relax your own window or schedule
around it. TCPA_FEDERAL_DIALING_WINDOW_BLOCKED comes from the one gate
you cannot turn off — you can only schedule around it.
”About to dial Florida on a Sunday?” — read the reason code back to its statute
You get422 TCPA_DIALING_WINDOW_BLOCKED — or
TCPA_FEDERAL_DIALING_WINDOW_BLOCKED from a campaign — and the error
details carry a reason and, for state-driven blocks, a citation.
Work the two worked dials from the
state calling windows page as the
diagnostic pattern: same moment, two states, opposite outcomes.
Both dials are evaluated at Sunday 8:30 PM recipient-local:
Miami, FL (area code 305) → blocked. The area code resolves 305 → FL,
and Florida’s overlay (8 AM–8 PM, Sunday banned) intersects the federal
window to 8 AM–8 PM with no Sunday dialing. The 422 details read:
214 → TX, Texas carries no
overlay, the federal 8 AM–9 PM window applies unchanged, and 8:30 PM is
still inside it. (An hour later it would come back
outside_federal_window.)
The reason codes map back to the statute, not to a platform quirk:
For state-driven blocks, the error details also carry a
citation —
see Reading the citation in the error
below. For the full statutes behind each overlay, jump straight to the
state calling windows page; don’t
try to re-derive them from the error.
When the recipient’s timezone can’t resolve
422 TCPA_TIMEZONE_UNKNOWN (opt-in gate) or a
TCPA_FEDERAL_DIALING_WINDOW_BLOCKED with reason: "timezone_unresolved"
(campaign path) both mean the same thing: the recipient is a US (+1)
number whose area code mapped to no IANA timezone. There is no window
math behind this error — the resolver failed before any hour was
computed, and an unresolved timezone is never treated as “in window.”
Where the two paths diverge is the failure posture:
- Campaign and dialer voice fails closed — always. A US recipient whose timezone can’t be resolved is refused before the dial, no matter what your tenant settings say. The federal penalty exposure isn’t yours to waive, so this posture isn’t either.
- Ad-hoc 1:1 voice is advisory by default. With the voice gate off,
the same call dispatches and the unresolved decision is only logged.
When you do enable the voice gate, its posture for an unresolved
timezone follows your
unknown_timezone_policy:skip(the platform default) — fail open: the call passes.deny(the default the voice gate ships with for US recipients) — fail closed:422 TCPA_TIMEZONE_UNKNOWN.enforce_utc— evaluate the window against UTC instead, a deterministic answer for every recipient.
timezone_override on
the preview call so your scheduler plans around the true local time.
What to check before a campaign: recipient → state resolution
Pre-flight a bulk list against the resolution chain instead of learning it from blocked attempts. A US number resolves through this chain:- The E.164 number yields its NANP area code.
- The area code maps to a USPS state — when the state is one of the seven overlay states, the intersected window applies.
- The area code maps to a timezone (or fails to → the fail-closed case above).
- Non-NANP recipients (anything not +1) never hit the federal guard at all — TCPA jurisdiction is US-only. They play by your own channel gate, if you enabled one.
- Canadian and Caribbean NANP area codes, and US area codes not yet mapped, fall through to the federal window only. The 8 AM–9 PM recipient-local window still applies, but no state overlay can. A fall-through is not a failed lookup — it doesn’t trip the fail-closed timezone posture.
- States without an overlay (TX, CA, NY, IL, most of the map) resolve and attach to the decision for your audit filtering, but the window stays the plain federal one.
allowed_now: false with a next_allowed_at you can schedule against
is the whole pre-flight answer. Sample the list by area code — one
preview per distinct area code covers every recipient that shares its
resolution.
Reading the citation in the error
When a state overlay drove the block, the error details name the statute so you can trace the decision without reading platform code:citation only appears on state-driven decisions — federal-only
blocks carry none. Use it as the audit trail: hand the citation and the
reason to counsel or a compliance reviewer and they can verify the
block against the statute text directly. The verification status and
the most-restrictive-wins composition rule behind the overlay table are
documented on US state calling windows.
The federal window itself cites 47 U.S.C. § 227(b)(1)(B) where it
appears in error messages.
The tenant opt-in gate fails open until you enable it
Ad-hoc 1:1 dials from the dashboard or softphone are advisory-only by default: outside any window, the call dispatches and the decision is logged — no error at all. The gate that producesTCPA_DIALING_WINDOW_BLOCKED on this path is quiet_hours.voice.enabled
in your organization settings, and it only ever exists because you set
it. Expectations to hold onto while you debug:
- Gate off → fail open. Calls dispatch in every window; the decision still lands in the log for visibility.
- Gate on → fail open only where your policy says so. An unresolved
timezone passes under
unknown_timezone_policy: "skip"and blocks under"deny"— the gate is exactly as strict as you configured. - Either way, the gate can only add restrictions. Nothing on the tenant side relaxes the campaign/dialer hard block below it.
skip (pass) or
enforce_utc (evaluate against UTC). All three knobs are walked in
Quiet hours configuration.
The campaign/dialer hard block has no override
Campaign, dialer, and automated voice origination — predictive, progressive, preview, and agentless modes, scheduled callbacks, and the pre-dial gate — are always hard-blocked outside the federal 8 AM–9 PM recipient-local window, and always fail closed on an unresolved timezone. There is no tenant toggle, consent flag, support override, or emergency carve-out for this path; the only lever is timing. If a dial cannot go out right now, every fix is one of:- Schedule to
next_allowed_at. Every 422 in this class carries it. Pass it straight to your scheduler — the dialer itself defers held contacts and re-attempts once the window opens, so a blocked attempt never burns the contact. - Pre-flight with the preview endpoint (above) so the campaign launches inside the window for every sampled area code.
- For
state_blocked_day, reschedule the day, not the hour — Florida’s Sunday ban has no compliant hour on Sunday.
What to capture before escalating
Work the sections above first. If a block still misreads — the recipient genuinely is in-window, the area code resolves wrong, or thenext_allowed_at looks off — open a ticket with:
- The full error body — code, message, and the
detailsobject (reason,timezone,local_hour,next_allowed_at,citation). - The recipient E.164 number and its area code.
- The call path — ad-hoc dashboard/softphone dial, or campaign / dialer origination, plus the campaign or dialer run ID for bulk work.
- Your organization ID (Settings → Organization, or
organizationIdfromGET /api/v1/me). - If the timezone resolution itself is in question, the
preview response for the same number from
GET /api/v1/compliance/quiet-hours/preview.
What not to do
- Do not retry the dial in a loop. A window block re-fires on every
attempt until the recipient-local hour changes. Read
next_allowed_atand schedule there — retries before it only multiply 422s. - Do not reconfigure the trunk or restage the number. The block fires before SIP; nothing on the carrier path is involved.
- Do not flip the voice gate off to “fix” campaign blocks. The tenant gate and the campaign hard block are different layers; disabling your gate changes nothing for automated voice and only loosens your own posture.
- Do not treat a state fall-through as a resolver failure. Canadian, Caribbean, and unmapped US area codes legitimately resolve to the federal window only — that’s by design, not a gap to report.
See also
- US state calling windows — the
overlay table, the resolution chain, and the statutes the
citationfield points back to. - Quiet hours configuration — the
tenant opt-in gate,
unknown_timezone_policy, and the campaign fallback window. - Send gates — the preview endpoint and the campaign/dialer federal asymmetry.
- Error codes — the full TCPA entry set this page works from.
- Troubleshooting: voice call quality — the next page once the call does dispatch and the audio is the complaint.