Skip to main content

Voice traffic-lane resolution at the federal dial gate

The US TCPA federal dialing window (8 AM–9 PM recipient-local) is the one voice gate that is on for every account, with no account-level switch — the statutory exposure behind it is not something an account setting can waive. Before that gate looks at the recipient’s local hour, Orbit decides whether the gate even applies to this call. That decision is the traffic-lane resolution, and it is the difference between “when is my call a marketing call” being a policy you read once and being an error you trip. The resolver assigns every outbound voice call one of two lanes: Every voice dispatch point resolves a lane before it checks the window: the voice-gateway outbound-call route, the webhook-worker’s dial-pacer and callback schedulers, and the API-side gate all run the same resolution. Because the resolution happens upstream, the gate itself is deliberately conservative about a missing lane: if a dispatch path resolves nothing and says nothing, the gate treats the call as marketing. An exemption from the federal window exists only when a dispatch path actively resolved and carried it — silence is never an exemption.

Resolution precedence

The resolver reads the call metadata your dispatch path forwarded and applies these rules in order — the first one that matches settles the lane:
  1. The dispatcher itself signals an artificial voice → marketing. A dial route that is about to synthesise speech (its own TTS-payload extractor found a payload) says so directly rather than hoping a key spelling is recognised.
  2. metadata.traffic_lane: "marketing" set by you → marketing. Your own self-classification, honoured in the more-restrictive direction (see below).
  3. Campaign attribution — any of campaign_id, journey_campaign_id, dialer_campaign_id, broadcast_id, or flow_execution_id present in metadata → marketing.
  4. Unattended origination — amd_requested (you asked for answering-machine detection) or a per-lead dynamic_variables substitution map → marketing. Both mean nobody is waiting on your end of the answered call.
  5. Artificial or prerecorded voice in metadata — voice_agent_id, agent_id, tts_text, tts_body, message_body, voice_cloned_model_id, or an explicit voice_content_type of "synthetic" or "cloned" → marketing. The statute names “artificial or prerecorded voice” directly, so it stays governed even with no campaign attached.
  6. None of the above → transactional. A direct API dial or a softphone call with no campaign attribution: one number, one operator, on purpose.

The anti-laundering rule: you can move a call onto the marketing lane, never off it

Only the "marketing" value of metadata.traffic_lane is honoured. An explicit metadata.traffic_lane: "transactional" is ignored — the resolver falls through to rules 3–6 anyway. Call metadata is caller-supplied and unauthenticated: it travels from your request body into the gateway untouched. If a transactional claim typed into that blob were accepted, any SDK consumer, campaign-config blob, or webhook handler could sidestep a federal statutory gate by typing one string — the same bypass class as the skip_tcpa flag the voice path removed. This is the compliance version of a one-way ratchet: your request can make a call more governed, never less. The practical consequence is worth stating plainly, because re-rerouting a campaign through the direct-dial path is the failure shape here: stripping campaign attribution does not make a call transactional. If any of rules 1–5 still apply — an AI voice, a TTS payload, AMD requested, a flow origin — the call is marketing-lane with or without a campaign_id, and the attribution you deleted only removes your audit trail, not the gate. If a dispatch path genuinely is transactional, the assertion has to arrive on a typed, server-side field set after authenticated resolution — not a metadata key.

Tenant-owned self-classification

metadata.traffic_lane: "marketing" is a tenant-owned control, in the same sense as the rest of your compliance configuration: you opt into more governance, the platform never opts you into less. Set it when you know traffic that would otherwise resolve transactional should walk the federal window — the canonical case is a dial-your-own-list workflow you run through a direct API integration, where you treat the calls as outreach and want them governed exactly as your campaign traffic is.
Setting the flag never removes any other gate. Do-not-call lists, suppression lists, cross-channel STOP, and your own voice quiet-hours window (when you have enabled one) are evaluated on every call regardless of lane. The lane decides only whether the federal dialing window is asked at all.

Per-dispatcher lane defaults

The pattern to copy: a dispatcher whose callers are always campaign traffic should pin "marketing" rather than rely on inference — the pacer’s callers do not reliably stamp campaign metadata, and inferring a lane from what such a dispatcher happens to pass would be the laundering rule arriving through the front door: a missing campaign_id would exempt a campaign dial. A dispatcher with mixed callers (the outbound-call route: campaign blasts, AI-voice legs and hand-dialled softphone calls alike) resolves per call instead.

Worked examples

Returned call, softphone. A customer called in and hung up; an agent dials them back one number at a time from the dashboard. No campaign attribution, no TTS, no AMD requested → rules 1–5 miss → transactional lane. The federal window is not evaluated; the call dials at any hour. DNC and suppression checks still apply to it. Campaign dial through webhook-worker. The dialer pacer picks the next lead for a predictive campaign and dispatches. The pacer pins the lane: "marketing". The gate resolves the recipient’s timezone, finds the local hour outside 8 AM–9 PM, and refuses with TCPA_FEDERAL_DIALING_WINDOW_BLOCKED and a next_allowed_at — the pacer defers to that timestamp. Hand-dialled call with a TTS greeting. An agent clicks to dial one number from the dashboard, but the answered leg hands to a text-to-speech payload (tts_text or message_body). “By hand” means a live voice on your end, not a click: the TTS payload matches rule 1 (the route knows it is about to synthesise speech) and rule 5 → marketing lane. The federal window governs it even though no campaign is attached.
The federal gate is the one platform-level voice control with no account switch. Which lane a call lands on, and whether you self-classify upward into more governance, stays tenant-owned — your compliance configuration, your audit trail.

See also