Flow Studio
Messaging Capability Overview
Sending messages via Slack, email, SMS, and push notifications from workflow nodes — the channel adapter pattern, credential management, and expression-driven message bodies.
Channel Architecture
All messaging nodes share the IMessagingChannelAdapter pattern. Each channel (Slack, Email, SMS, Push) is a separate adapter implementation registered in DI. This makes adding new channels a first-class operation:
WorkflowNode (SendSlack / SendEmail / SendSMS / SendPush)
│
▼
IMessagingChannelAdapter.SendAsync(message, config)
│
├── SlackChannelAdapter → Slack API (block kit)
├── EmailChannelAdapter → SMTP / SendGrid
├── SMSChannelAdapter → Twilio / Vonage
└── PushChannelAdapter → FCM / APNs
Available Messaging Nodes
| Node Type | Channel | Auth Pattern |
|---|---|---|
| SendSlackMessage | Slack API | Bot token via ICredentialResolver |
| SendEmail | SMTP or SendGrid | SMTP password / API key via ICredentialResolver |
| SendSMS | Twilio | Account SID + auth token via ICredentialResolver |
| SendPushNotification | FCM / APNs | Service account key via ICredentialResolver |
Universal Credential Rule
Mandatory: All messaging credentials (API keys, SMTP passwords, bot tokens, account SIDs) are always stored via
ICredentialResolver using a credentialId integer. Raw secrets are never stored in node configuration. Violation of this rule is a critical security defect.
Output Shape (All Messaging Nodes)
{
"messageId": "msg-xyz123",
"channel": "slack",
"sentAt": "2026-05-25T10:00:00Z",
"status": "delivered",
"recipient": "#engineering-alerts"
}