Skip to main content

Smart Channel

When a send targets several channels — push, email, SMS — every reachable subscriber normally gets it on all of them. Smart channel flips that: each subscriber gets the message on their single best channel, and nothing else. You send less, land better, and never annoy someone on three surfaces at once.

Smart channel is available on Growth plans and above, for campaigns and one-off sends. (Journey send steps keep explicit channels for now.)


The rule, in full

Smart channel is a published heuristic — no black box, no machine learning:

  1. Reachability first. A subscriber is only ever considered for channels they can actually receive: an active device, a verified email address, a phone number — and consent for that channel. Consent and quiet-hours rules apply exactly as they do for explicit sends.
  2. 90-day engagement ranking. Channels are ranked by engagement rate — opens and taps divided by deliveries — over the trailing 90 days, per channel class (push, email, web push, SMS, WhatsApp).
  3. Personal history counts from 5 deliveries. If a subscriber has received at least 5 deliveries on a channel class, their own engagement rate on that class decides. Below that, your audience-wide ranking decides — 4 data points are noise, not signal.
  4. Ties break deterministically — higher delivery volume first, then a fixed channel order (push, email, web, SMS, WhatsApp). The same subscriber always resolves the same way on the same data.
  5. Fallback only on permanent failure. If the chosen channel hard-fails — a dead push token, a bounced email, a provider rejection — the next-ranked reachable channel is tried. A message that merely wasn't opened is never re-sent on another channel, and a delivery that might have succeeded blocks any fallback. One message per subscriber, full stop.

Rankings are recomputed nightly from your delivery and engagement history.

Turning it on

In the Composer, select the channels the send may use, then enable Smart channel beneath the channel picker. The selected channels define the eligible set — arbitration picks the best one per subscriber from among them.

Via the API, add one field to the create call:

POST /api/v1/notifications
{
"channel_ids": ["ch-push", "ch-email"],
"target": { "type": "all" },
"content": { "title": "Hello", "body": "…" },
"channel_arbitration_mode": "smart"
}

channel_arbitration_mode accepts explicit (the default — today's behavior) or smart. On plans below Growth, smart returns 403 with feature_not_available.

Reading the results

Every smart send gets an honest per-job readout on its detail page (History → the send → Smart channel), and on GET /api/v1/notifications/{id} as channel_arbitration:

{
"channel_arbitration": {
"chosen": [
{ "class": "push", "source": "personal", "subscribers": 1240 },
{ "class": "email", "source": "tenant", "subscribers": 310 }
],
"suppressed_devices": 1490,
"rank_errors": 0,
"fallback_steps": 3,
"fallback_dedup_errors": 0
}
}
FieldMeaning
chosen[].classThe channel class that won for this bucket of subscribers.
chosen[].sourceWhat decided it: personal (the subscriber's own history), tenant (your audience-wide ranking), or default (no data — fixed order).
suppressed_devicesDeliveries that would have happened on other channels and were skipped — the "sent less" number.
fallback_stepsDeliveries retried on the next channel after a permanent failure.
rank_errorsSubscribers delivered on all their channels because the ranking was momentarily unavailable (arbitration fails open, never blocks a send).

The readout is aggregate-only by design — no per-recipient decision log exists.

What smart channel deliberately does not do

  • No re-sends on silence. Not opening a message never triggers another channel.
  • No journeys yet. Journey send steps keep their explicit channel configuration.
  • No machine learning. The ranking rule above is the whole algorithm; it can be audited from this page.
  • No consent bypass. Arbitration narrows the channels consent already allows — it never widens them.

Rehearse it first: a simulated send runs arbitration for real and shows the full decision readout — chosen classes, suppressed devices, fallbacks — without delivering anything.