---
title: Channel Step
description: Send notifications through a configured channel
---

The channel step sends a notification to the recipient through a specific channel. Each channel step is linked to a channel you've configured in your project.

## Configuration

When adding a channel step, you select:

1. **Channel** — Which configured channel to use (e.g., "Marketing Email", "Transactional SMS")
2. **Template** — The notification content for this step

## Supported Channel Types

Channel steps can use any channel type you've configured:

| Channel Type | Providers | Description |
|--------------|-----------|-------------|
| **Email** | Amazon SES, SendGrid, Resend, Mailgun, Postmark, MailerSend, SMTP | Send emails with rich HTML, visual editor, or plaintext |
| **SMS** | Twilio | Send text messages |
| **Mobile Push** | Apple APNs, Firebase FCM | Send push notifications to iOS and Android devices |
| **Web Push** | Web Push (VAPID) | Send web push notifications |
| **In-App** | Built-in | Display notifications in your app's notification center |
| **Chat** | Slack, WhatsApp, Telegram, Discord | Send messages to chat platforms |
| **Webhook** | HTTP endpoint | Send to any URL with custom headers and body |

See [Channels & Providers](/docs/channels-providers) for setup instructions for each provider.

## Templates

Each channel step has an associated template that defines the notification content. The template format depends on the channel type:

| Channel Type | Template Format |
|--------------|-----------------|
| Email | Visual editor, HTML, or plaintext |
| SMS | Plaintext |
| Mobile Push | Title + body (plaintext) |
| Web Push | Title + body (plaintext) |
| In-App | Body + action URL (markdown) |
| Chat | Markdown or JSON |
| Webhook | URL + method + headers + body (JSON) |

All templates support Liquid variables like `{{ recipient.first_name }}`, `{{ actor.email }}`, and `{{ data.order_id }}`.

See [Templates](/docs/learn/building-notiflows/templates) for details on writing template content.

## Example

A channel step configured for email might use a template like:

```liquid
Subject: Your order has shipped!

Hi {{ recipient.first_name }},

Great news! Your order #{{ data.order_id }} is on its way.

Track your package: {{ data.tracking_url }}
```

A webhook step template might look like:

```
URL: https://api.example.com/events
Method: POST
Body:
{
  "user_id": "{{ recipient.external_id }}",
  "event": "order_shipped",
  "order_id": "{{ data.order_id }}"
}
```

## Multiple Channel Steps

A notiflow can have multiple channel steps to send notifications across different channels:

```
Trigger → Email → Push → End
```

Or use control steps to add delays between channels:

```
Trigger → Email → Wait (1 hour) → Push → End
```

Or use condition steps to route to different channels based on user preferences:

```
Trigger → Condition
              ├─ Prefers email → Email → End
              └─ Default → Push → End
```

## Step Conditions

You can add conditions to a channel step to control whether it executes. If the conditions aren't met, the step is skipped and execution continues to the next step. This is different from condition steps which route the entire flow into branches — see [Condition Step](/docs/learn/building-notiflows/condition-step).
