Patterns
intermediatenotification Featured

Multi-Channel Notification Router

Route alerts and notifications through the right channel (email, Teams, SMS, push) based on urgency, recipient preferences, and business hours. Always reach the right person at the right time.

Views35
BPMN 2.0
On this page

Visual Flow

Rendering diagram…

When to Use This Pattern

Use multi-channel notification when:

  • Important alerts are missed because they're buried in email
  • Different situations require different urgency levels (a system outage should not arrive the same way as a weekly report)
  • Recipients have different communication preferences (some prefer email, others Teams or SMS)
  • Your workflows notify people outside of business hours and need to reach them through appropriate channels

How It Works

UrgencyChannelWhenExample
🔴 CriticalSMS + Phone call + TeamsImmediately, 24/7System down, security breach
🟠 HighTeams message + EmailImmediately, business hoursApproval overdue, SLA warning
🟡 MediumEmailWithin 1 hourNew task assigned, status update
🟢 LowDigest emailDaily/weekly summaryFYI updates, reports ready

Implementation Guide

Step 1: Define the Channel Priority Matrix

Create a configuration table:

UrgencyPrimary ChannelFallback ChannelEscalation ChannelMax Delay
CriticalSMSPhone callManager SMS0 minutes
HighTeamsEmailSMS (after 30 min no ack)5 minutes
MediumEmailTeams (if opted in)60 minutes
LowDigest queueEnd of day
Step 2: Collect Recipient Preferences

Let users set their notification preferences:

PreferenceOptions
Primary channelEmail / Teams / SMS / Push
Quiet hourse.g., 10 PM – 7 AM
Quiet hours overrideCritical alerts bypass quiet hours
Digest preferenceDaily at 8 AM / Weekly on Monday
Phone numberFor SMS and phone call channels
Teams handleFor direct Teams messages
Step 3: Build the Notification Engine
FUNCTION send_notification(recipient, message, urgency):
    
    prefs = get_preferences(recipient)
    channels = get_channels_for_urgency(urgency)
    
    // Check quiet hours
    IF is_quiet_hours(recipient) AND urgency != "critical":
        queue_for_delivery(recipient, message, prefs.quiet_hours_end)
        RETURN
    
    // Send via primary channel
    primary = prefs.primary_channel OR channels.primary
    send(primary, recipient, message)
    
    // For high+ urgency: set up escalation
    IF urgency IN ["critical", "high"]:
        schedule_escalation(
            delay: channels.escalation_delay,
            action: send(channels.fallback, recipient, message)
        )
Step 4: Implement Each Channel
ChannelImplementation
EmailStandard send email action. Include full details.
TeamsPost adaptive card to user's chat or team channel. Include action buttons (Acknowledge, View Details).
SMSTwilio, Azure Communication Services, or carrier API. Keep under 160 characters with a link.
Phone callTwilio voice API or escalation to on-call rotation. For true emergencies only.
Push notificationMobile app push via Firebase or Azure Notification Hub.
Digest queueAccumulate messages in a queue, batch-send per schedule.
Step 5: Track Delivery and Acknowledgement
EventAction
SentLog delivery timestamp and channel
DeliveredConfirm delivery (read receipt, webhook confirmation)
AcknowledgedRecipient clicked "Acknowledge" or replied
Not acknowledgedAfter timeout, escalate to fallback channel
Bounced/failedTry fallback channel immediately

Example: Production Incident Alert

  1. Monitoring system detects API response time > 5 seconds
  2. Urgency classified as Critical
  3. On-call engineer receives: SMS (immediate) + Teams DM (immediate)
  4. After 5 minutes with no acknowledgement: Phone call to on-call
  5. After 10 more minutes: SMS to backup on-call + Teams post to #incidents channel
  6. Once acknowledged: Email with full details sent to broader team

Tips & Best Practices

Warning

Notification fatigue is real. If you send critical alerts too often, people start ignoring them. Reserve the most aggressive channels (SMS, phone) for truly critical events that happen rarely.

  • Respect quiet hours. Waking someone up at 3 AM for a medium-priority notification will make them disable notifications entirely. Only break quiet hours for critical alerts.
  • Include actionable content. Every notification should answer: What happened? What do I need to do? How do I do it? Include a direct link to take action.
  • Deduplicate. If the same event triggers multiple times in 5 minutes, send one notification with a count, not five separate messages.
  • Measure and tune. Track open rates and acknowledgement times per channel. If Teams messages get acknowledged 3x faster than email, encourage users to make Teams their primary.

Related patterns