Core conceptsChannels

Channels

A channel is a way of reaching a person, and in a sequence it is a property of a step rather than a separate system. Nine step channels exist. Only two of them send on their own, and knowing which is which is the difference between a sequence that runs and a sequence that quietly waits for somebody.

The nine step channels

A sequence step carries one channel. The persisted set is email, call, AI call, SMS, LinkedIn, social, manual, wait and task. Email is the spine: a campaign can disable any other channel for its sequence, and email is filtered out of that list defensively, so it can never be the thing you turned off.

An unrecognized channel value resolves to email rather than being rejected. That is a deliberate fallback in the resolver, and it is worth knowing if you are writing steps through an integration: a typo does not fail loudly, it becomes an email step.

What sends itself, and what waits for a person

Every step channel resolves to one of three advance behaviours. Auto means the worker performed the action and the enrollment moves on. Manual means the enrollment parks until a person or a drain completes the work. Timer means there was no side effect at all.

Email, SMS
Sent by the worker. These are the two channels that actually dispatch, and the enrollment advances on its own.
LinkedIn
Never auto-sent. The step surfaces into the daily LinkedIn shortlist and the enrollment parks until the rep sends it.
Call, manual, task
A task is created, due on the step's day, and the enrollment parks until that task is completed.
AI call
An AI-dispatchable call task, worked by the outbound-agent drain rather than by a rep. The drain runs its own consent, suppression and quiet-hours gate, fail-closed, before originating the call, and completing the task releases the park. A rep completing it by hand is a legitimate fallback rather than a bypass.
Wait
A pure delay. Nothing is sent and the timer advances the enrollment.

Social is persistable as a step channel but has no dispatch arm, so a social step falls to the default and is skipped rather than performed. Do not build a sequence that depends on it doing something.

The gate every channel passes

There is one environment-level switch in front of all of it, and it is fail-closed in the code and deployed shut. Only an explicit affirmative value opens it; absent, empty or unrecognized keeps it closed. A master flag governs everything, and email, SMS and voice each have their own override that can open or close that channel independently of the master.

Arming a send is gated too, on the master flag alone. Enrolling contacts while outbound is globally shut would only build a backlog that fires on the first scheduler tick after the gate opens, so enrollment is held rather than queued.

Transactional mail does not pass through this gate. Sign-in links and receipts keep working while outbound is shut, so closing the gate never locks your team out of the product.

What each channel needs beyond that

Passing the outbound gate is necessary and not sufficient. Each sending channel has its own conditions, and a refusal names which one it hit.

  • SMS needs an approved 10DLC number in the workspace and configured provider credentials before consent is even considered. It then needs affirmative opt-in on the contact: the absence of an opt-out is not consent, and a contact with neither is refused. Quiet hours are enforced, and a timezone that cannot be resolved blocks the send rather than defaulting to permitted.
  • Voice enforces calling windows in the called party's local time and a per-number daily dial ceiling, which defaults to fifty. The Dialer page covers the recording-consent and abandoned-call rules.
  • Email passes a consolidated pre-send review before launch: token resolution, spam triggers, the deliverability gate, tone, and warming-pool capacity, each finding carrying a stable code.
  • Email, SMS and LinkedIn each reserve their per-sender daily capacity through one atomic claim rather than by counting sends so far, so two workers running at once cannot both see room and both send. If the claim cannot be granted for any reason, including an error, the grant is zero and the send defers.

Stopping it, on every channel at once

The workspace emergency pause is one switch that holds all outbound, email, SMS, LinkedIn and scheduled calls together, for a fixed twenty-four hours, and then resumes on its own when the clock passes. Inbound replies are deliberately not gated by it, so conversations keep flowing while sending is stopped.

It fails closed, and the trade is stated in the code rather than implied. An unreadable or unparseable pause state resolves to paused, because over-holding is recoverable and fail-open would mass-fire the backlog somebody meant to stop.

Suppression is the other cross-channel stop, and it is keyed on the email address and the phone number rather than on the contact row. An opt-out therefore survives the contact being edited, deleted or re-imported, and it applies on every channel at once: a STOP on SMS also stops the email. A read error counts as suppressed.

Behaviour on this page is read from

  • src/lib/sequence-builder.ts
  • src/lib/sequence-runtime.ts
  • src/lib/sequence-step-dispatch.ts
  • src/lib/outbound-gate.ts
  • src/lib/sms-compliance.ts
  • src/lib/sms-runtime.ts
  • src/lib/channel-budget-governor.ts
  • src/lib/workspace-outreach-pause.ts
  • src/lib/suppression-store.ts
  • src/lib/pre-send-gate.ts
  • src/lib/dialer/pool-planner.ts

Was this page helpful?

Book a demo