notifications
Named channels that notify steps send into. rflow ships its own senders — no external webhook relays needed.
notifications:
channels:
ops:
telegram:
bot_token: ${TG_BOT_TOKEN}
chat_id: ${TG_CHAT_ID}
eng:
slack:
webhook_url: ${SLACK_WEBHOOK}
alerts:
discord:
webhook_url: ${DISCORD_WEBHOOK}
pager:
pagerduty:
routing_key: ${PD_ROUTING_KEY}
oncall:
opsgenie:
api_key: ${OPSGENIE_API_KEY}
eu: true
sms:
twilio:
account_sid: ${TWILIO_ACCOUNT_SID}
auth_token: ${TWILIO_AUTH_TOKEN}
from: "+15550001111"
to: "+15552223333"Each channel configures exactly one sender (validation error otherwise).
telegram
| Field | Description |
|---|---|
bot_token | ✅ Bot token from @BotFather |
chat_id | ✅ Target chat/group id |
slack
| Field | Description |
|---|---|
webhook_url | ✅ An incoming webhook url |
discord
| Field | Description |
|---|---|
webhook_url | ✅ A channel webhook url |
pagerduty
Sends through the Events API v2
(events.pagerduty.com/v2/enqueue, event_action: trigger).
| Field | Description |
|---|---|
routing_key | ✅ The integration (routing) key of an Events API v2 integration |
Severity follows what fired the notification: notify: steps send error,
circuit breaker trips and
liveness/stall breaches send
critical, and approval requests send info.
opsgenie
Creates alerts via the Alert API
(Authorization: GenieKey <api_key>).
| Field | Description |
|---|---|
api_key | ✅ An API integration key |
eu | Use the EU host api.eu.opsgenie.com (default false = api.opsgenie.com) |
Priority follows the same taxonomy as pagerduty severity: circuit trips and
liveness/stall breaches are
P1, notify: steps P3, approval requests P5.
twilio
SMS through the Messages API (basic auth account_sid:auth_token).
| Field | Description |
|---|---|
account_sid | ✅ Account SID |
auth_token | ✅ Auth token |
from | ✅ The sending Twilio number (E.164, e.g. +15550001111) |
to | ✅ The destination number (E.164) |
Using channels
steps:
- id: alert
notify:
channel: ops
message: "large transfer: ${{ format_units(trigger.args.value, 6) }} USDC"Messages are full templates — any expression works, and
values under secrets: are redacted if they ever end up in one.