Channel On-Send branch vs On-Delivery branch: continue when handed to provider vs when the handset accepts
On-Send vs On-Delivery after email/SMS: provider accept vs real delivery—with timeline and FAQ.

Amir Hosseini
Runs email, SMS, and push campaigns for acquisition, retention, and reactivation.
September 26, 2026 · 6 min read
Also available in فارسی

On-Send advances as soon as the journey hands the message to the ESP/SMS provider. On-Delivery advances only when the provider reports successful handset/inbox delivery. In some designs both branches can fire in sequence for the same person, so you must design parallel continuation carefully or explicitly finish paths you do not want.
What is the difference between On-Send and On-Delivery branches?
After an email/SMS send step, continuation can hook channel signals:
- On-Send: “Accepted by the provider / queued.” Not the same as “customer saw it.”
- On-Delivery: “Handset/inbox accepted” per provider report (e.g. SMS DLR).
- Often also On-Failure: reject, blacklist, invalid number, bounce.
Iran reality: send ≠ deliver for SMS is common—coverage, bad numbers, operator filters. Treating On-Send as success lies in the dashboard.
Related to SMS flow vs SMS campaign and transactional vs promotional; here the focus is the post-send branch.
Simple timeline
journey send step
→ provider accepted ← On-Send
→ handset/inbox OK ← On-Delivery
→ rejected / failed ← On-Failure
→ (optional) open/click later ← engagement, not Delivery
On-Open for email ≠ On-Delivery. Delivery means arrived; Open means opened.
Comparison table
| Dimension | On-Send | On-Delivery |
|---|---|---|
| Practical meaning | handed to provider | successful delivery report |
| Speed | faster | waits on DLR/ESP |
| Best for | quick internal continue, logging | channel fallback, proof of reach |
| Risk | false optimism | delay / missing DLR |
| Iran SMS | fires often | less than Send |
| ESP accepted | delivered to inbox (not open) |
Iran examples
Store — SMS fallback to email
Cart discount SMS: if no On-Delivery within 2 hours or On-Failure → same offer by email. If you treat On-Send as success, fallback never runs while the customer never saw the SMS.
Transactional — OTP
On-Failure matters immediately; On-Send alone is not enough for UX if delivery failed. Keep transactional policy separate from promo.
SaaS — renewal notice
On-Delivery → gentle reminder 24h later if unread. On-Send alone does not prove awareness.
The dual-branch problem
Some engines let both On-Send and On-Delivery continue for one person—two parallel paths. If each sends another email, they get duplicates. Fixes:
- Explicit finish/exit on paths you do not want.
- Pick one signal for primary continuation (often Delivery for fallback).
- Guard with a journey attribute
already_continued.
When to choose which
- Need to know the system accepted the send → On-Send for metrics/non-sensitive continue.
- Need channel fallback or “it arrived” promises → On-Delivery / On-Failure.
- Do not confuse Open/Click with Delivery.
- Promo: watch fatigue; transactional: take Failure seriously.
- Confused customers → human Live Chat; AI Chat is not a customer live-chat bot.
Leadara mapping
- Journeys + Email/SMS: branch on real provider signals—not on imagined views.
- SMS via Kavenegar/Nikaline: use failure/delivery for fallback to email or web push.
- Web push: second channel when SMS fails if permission exists.
- Events: delivery is still a channel signal—see event-centric vs contact-centric.
- Do not invent connectors; use the user’s panel.
Common mistakes
- On-Send = customer saw it.
- Both branches without finish → duplicate messages.
- Treating On-Open as Delivery.
- Ignoring On-Failure for OTP/transactional.
- Treating one-shot blasts like branched flows.
One-line takeaway
On-Send = handed to the provider; On-Delivery = device/inbox reported success—and design dual-branch continuation on purpose.
Next step
Open one live SMS flow. Ask: does continuation use Send or Delivery? If you have fallback, test Failure/Delivery and finish the Send path if it must not run in parallel.
FAQ
Can both On-Send and On-Delivery fire for the same user?
In some designs yes—so explicit finish matters.
When should I branch On-Failure?
OTP, transactional, and any valuable channel fallback.
Is On-Open the same as On-Delivery for email?
No. Delivery is arrival; Open is opening.
Do SMS DLRs always arrive?
No. Add a timeout path: “if not delivered within N hours.”
Web push instead of email?
Only with permission; otherwise email.
Does this apply to blast campaigns?
Rich branching is more meaningful in flows/journeys than one-shot blasts—see SMS flow vs campaign.
Can AI answer the customer when SMS fails?
Leadara Live Chat is human support; AI Chat is an internal team assistant.
Step-by-step
- Write the branch goal: internal metric or fallback?
- Pick one primary signal (often Delivery/Failure for fallback).
- Finish unwanted parallel paths.
- Add timeout for missing DLR.
- QA with real fail and deliver test numbers.
- Watch Send vs Delivery vs Failure for a week.
Metrics
- Send rate vs Delivery rate
- Top failure reasons
- Email fallback entry rate
- Duplicate messages from parallel branches
PM language
Say “cart SMS: 96% Send, 78% Delivery, 9% Failure→email; 0 duplicates after guard,” not “sends were successful.”
Sketch
after send(message):
on_send: maybe continue_internal()
on_delivery: continue_fallback_ok_path()
on_failure: continue_fallback_other_channel()
guard: if continued: finish other branches
Acceptance tests
- Successful delivery → only Delivery path (if that is the design).
- Failure → email fallback, no optimistic path.
- Send without Delivery until timeout → “not reached” path.
- Guard prevents dual messages.
- Open measured separately from Delivery.
Channel checklist
- SMS: reading DLR and panel errors?
- Email: bounce distinct from delivered?
- Web push: permission before fallback?
Black Friday note
In traffic spikes, Send stays high while Delivery dips. Sensitize the dashboard to Delivery/Failure so the team does not celebrate green Send while customers got nothing.
Live Chat handoff
If a discount SMS never arrives and the customer says so in Live Chat, a human should resend or switch channel. Automation should already own the Failure path so chat only handles exceptions.
Versus engagement waits
Delivery answers “did the pipe work?” Click/open answers “did they engage?” Do not build an Action Path on Send acceptance and call it engagement.
Growth-team decision matrix
| Goal | Primary signal | Guard |
|---|---|---|
| Internal logging only | On-Send | Finish Delivery if it would send again |
| Channel fallback | On-Failure + no-Delivery timeout | Do not continue messaging on On-Send |
| Product “it arrived” promise | On-Delivery | Alarm Failure separately |
Teaching numbers
Of 10,000 cart SMS: 9,600 Send, 7,800 Delivery, 900 Failure, 300 missing DLR at 2h. Calling Send “96% success” hides ~22% who likely never saw the offer—those should enter email/push fallback.
Consent and annoyance
Duplicate messages from parallel branches drive unsubscribes on promo traffic. Treat an already_continued guard like mandatory code, not optional polish.
OTP special case
For OTPs, prefer Failure→visible in-app error plus resend, not a promotional email fallback that leaks codes. Keep transactional templates and journeys isolated.




