Notifications
<notify> behavior
<notify> accepts one or more built-in or explicitly imported custom provider tags. In an approval, every delivery has its own single-use capability, but all deliveries settle the same approval. One successful delivery is enough to wait for a decision; if every configured delivery fails, the run fails rather than waiting invisibly.
In a lifecycle hook, notifications are informational. They never receive decision authority and failure becomes a lifecycle warning rather than a new business outcome.
Slack notification
Approval:
<slack
channels="#approvals #engineering"
bot-token="{{secrets.SLACK_BOT_TOKEN}}"
app-token="{{secrets.SLACK_APP_TOKEN}}"
/>Lifecycle notification adds required message:
<slack
channels="#incidents"
message="Workflow {{lifecycle.workflow.id}} failed: {{lifecycle.failure.code}}"
bot-token="{{secrets.SLACK_BOT_TOKEN}}"
app-token="{{secrets.SLACK_APP_TOKEN}}"
/>channels is whitespace-separated and accepts lowercase #channel aliases or Slack conversation IDs. Duplicate destination/credential combinations are rejected.
Telegram notification
<telegram chats="-1001234567890,123456789" bot-token="{{secrets.TELEGRAM_BOT_TOKEN}}" />chats is a comma-separated list of positive or negative numeric chat IDs. Approval notifications forbid message; lifecycle notifications require it.
Discord notification
<discord channels="200000000000000001,200000000000000002" bot-token="{{secrets.DISCORD_BOT_TOKEN}}" />channels is a comma-separated list of 17–20 digit channel IDs. Approval notifications forbid message; lifecycle notifications require it.
WhatsApp notification
<whatsapp
recipients="15551234567,15557654321"
access-token="{{secrets.WHATSAPP_ACCESS_TOKEN}}"
phone-number-id="123456789012345"
template="woml_approval_v1"
language="en_US"
/>Recipients are comma-separated international numbers containing 8–16 digits, without + or spaces. Template names use lowercase letters, digits, and underscores. Approval templates must provide the approved Approve/Reject button order. Lifecycle notifications additionally require message, passed as the first template body parameter. Meta does not let WOML edit a delivered approved-template message after resolution, so WOML records a bounded warning instead of claiming it updated the message.
Message templates
Lifecycle messages may include bounded scalar {{context...}} and {{lifecycle...}} placeholders. Secret interpolation is forbidden. Approval message wording is assembled from approval metadata and runtime decision data; credentials never enter message content.