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:

WOML
<slack
  channels="#approvals #engineering"
  bot-token="{{secrets.SLACK_BOT_TOKEN}}"
  app-token="{{secrets.SLACK_APP_TOKEN}}"
/>

Lifecycle notification adds required message:

WOML
<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

WOML
<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

WOML
<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

WOML
<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.