Skip to main content

Notification Channels

Notification channels send approval requests to external platforms. Approvers can approve or reject directly from their email inbox, Slack workspace, Telegram chat, or WhatsApp conversation.

How It Works

Payment triggers approval workflow
  → Conto generates secure, one-time action tokens
    → Notifications sent to all configured channels
      → Approver clicks Approve/Reject
        → Token is validated and consumed
          → Same approval logic as the dashboard
Every external decision uses the same submitApprovalDecision() path. Audit logs, atomic counters, webhook delivery, and race-condition safety all apply regardless of channel.

Supported Channels

ChannelDeliveryHow Approvers Act
EmailRich HTML via ResendClick Approve/Reject button links
SlackBlock Kit message with buttonsClick interactive action buttons
TelegramMessage with inline keyboardTap inline keyboard buttons
WhatsAppInteractive button messageTap reply buttons
WebhookJSON POST with tokensPOST tokens back to Conto API

Setting Up Channels

Go to Settings > Channels in the Conto dashboard, or use the REST API.
1

Choose a channel type

Click Add Channel and select the platform: Email, Slack, Telegram, WhatsApp, or Webhook.
2

Configure credentials

Each channel type requires different configuration:
ChannelRequired Config
EmailComma-separated recipient email addresses
SlackBot token (xoxb-...) and channel ID
TelegramBot token and chat ID
WhatsAppPhone number ID, access token, recipient numbers
WebhookHTTPS URL to receive JSON payloads
3

Select event types

Choose which events trigger notifications:
EventWhen It Fires
approval.requestedNew payment needs approval
approval.decidedSomeone approved or rejected
approval.escalatedRequest escalated after timeout
approval.expiredRequest expired without resolution
4

Test the channel

Click the test button to send a sample notification and verify your configuration.

Channel Configuration Details

Uses Resend to deliver rich HTML emails. Each eligible approver receives their own email with unique Approve and Reject buttons.Config fields:
  • recipients - List of email addresses. Only addresses matching eligible approvers receive actionable emails.
Clicking a button opens a browser, validates the token, submits the decision, and shows a confirmation page.
Requires a Slack app with the chat:write bot scope. Messages use Block Kit with payment details and interactive Approve/Reject buttons.Config fields:
  • botToken - Your Slack app’s bot token (xoxb-...)
  • channelId - The Slack channel ID to post messages to
Setup:
  1. Create a Slack app at api.slack.com/apps
  2. Add the chat:write bot scope
  3. Install the app to your workspace
  4. Set the interactivity request URL to https://conto.finance/api/webhooks/slack
  5. Set SLACK_SIGNING_SECRET in your Conto environment
When an approver clicks a button, Slack sends the interaction to Conto. The message is updated to show the result.
Uses the Telegram Bot API to send messages with inline keyboard buttons.Config fields:
  • botToken - Your Telegram bot token from @BotFather
  • chatId - The chat or group ID to send messages to
Setup:
  1. Create a bot via @BotFather
  2. Set the webhook URL: https://api.telegram.org/bot{token}/setWebhook?url=https://conto.finance/api/webhooks/telegram
  3. Add the bot to your group chat
When an approver taps a button, the message updates to show the result.
Uses the WhatsApp Cloud API to send interactive button messages.Config fields:
  • phoneNumberId - Your WhatsApp Business phone number ID
  • accessToken - Permanent access token from Meta
  • recipientNumbers - Phone numbers in international format (e.g., +1234567890)
Setup:
  1. Register at developers.facebook.com
  2. Create a WhatsApp Business app
  3. Set the webhook URL to https://conto.finance/api/webhooks/whatsapp
  4. Set WHATSAPP_APP_SECRET and WHATSAPP_VERIFY_TOKEN in your Conto environment
  5. Subscribe to the messages webhook field
Sends a signed JSON payload to any HTTPS endpoint. Use this for custom integrations that need to review and submit approval decisions.Config fields:
  • url - Your HTTPS endpoint URL
Payload format:
{
  "event": "approval.requested",
  "approvalRequestId": "clxyz123...",
  "paymentDetails": {
    "amount": 500,
    "currency": "USDC",
    "recipientAddress": "0x5678...",
    "agentName": "Treasury Agent"
  },
  "tokens": {
    "approve": "base64url-token",
    "reject": "base64url-token"
  },
  "actionUrl": "https://conto.finance/api/approvals/action",
  "timestamp": "2026-04-06T12:00:00Z"
}
To submit a decision, POST the token back to the actionUrl:
curl -X POST https://conto.finance/api/approvals/action \
  -H "X-Action-Token: base64url-token" \
  -H "Content-Type: application/json" \
  -d '{"comment": "Approved via external review system"}'

REST API

Manage channels programmatically:
# List channels
curl https://conto.finance/api/notification-channels \
  -H "Authorization: Bearer $API_KEY"

# Create a channel
curl -X POST https://conto.finance/api/notification-channels \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channelType": "SLACK",
    "name": "Treasury Channel",
    "config": { "botToken": "xoxb-...", "channelId": "C012345" },
    "eventTypes": ["approval.requested", "approval.decided"]
  }'

# Test a channel
curl -X POST https://conto.finance/api/notification-channels/{id}/test \
  -H "Authorization: Bearer $API_KEY"

# Delete a channel
curl -X DELETE https://conto.finance/api/notification-channels/{id} \
  -H "Authorization: Bearer $API_KEY"

Action Token Security

Action tokens are the core security mechanism for external approvals.
  • 32 bytes of cryptographic randomness, base64url-encoded
  • Protected at rest. Plaintext tokens are not retained after issuance
  • One-time use. Tokens cannot be reused after a decision is recorded
  • Time-limited. Tokens expire when the approval request expires (default 24 hours)
  • Per-user, per-action. Each approver gets separate Approve and Reject tokens
  • Full audit trail. Every decision records the channel, token ID, IP address, and user agent

Environment Variables

VariableRequired ForDescription
RESEND_API_KEYEmailResend API key for sending emails
SLACK_SIGNING_SECRETSlackSlack app signing secret for webhook verification
WHATSAPP_APP_SECRETWhatsAppMeta app secret for webhook signature verification
WHATSAPP_VERIFY_TOKENWhatsAppToken for Meta webhook verification challenge

Next Steps

Approval Workflows

Configure multi-approval workflows with escalation and sequential approvals

Securing Agents

Set up spending limits and approval thresholds for your agents