Skip to main content
Notification channels send approval requests and other events to email, Slack, Telegram, WhatsApp, or your own webhook. Only email links and the Conto dashboard, including the dashboard assistant, decide payment approvals. Decisions also fire approval.approved and approval.denied event webhooks.

How it works

When a payment needs approval, Conto sends approval.requested to every active channel subscribed to it. Channels deliver independently, and temporary delivery failures are retried. Email and dashboard decisions follow the same approval rules and appear in the same audit history. For how requests are matched, decided, and executed, see Approvals. New organizations start with an Owner email channel that sends approval requests to the owner. Change it under Settings > Event Delivery.

Supported channels

Each approval message shows the agent, amount, destination address, and why the payment was held. Email shows the full address. Chat messages shorten it and link to the review.

Setting up channels

Go to Settings > Event Delivery > Notification 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

Webhook URLs must use HTTPS and resolve to a public address. Loopback, private, link-local, .internal, and .local hosts are rejected.
3

Select event types

Choose which events trigger notifications:On email, Slack, Telegram, and WhatsApp, approval.decided and approval.expired send a short status update with a link to the request. They have no Approve or Reject actions. approval.escalated sends the approval request again to approvers who have not decided, including the workflow’s escalation targets, only while the request is still pending and unexpired. Escalation targets can then decide the request. See escalation.
4

Test the channel

Click the send-test button on the channel. A test message confirms delivery only. It creates no approval request, so test emails have no Approve or Reject buttons.
5

Run a real approval

To test the full decision flow, request a payment that requires approval, such as one above your approval threshold:
Approve from the email confirmation page or the dashboard. Audit Logs records who decided, when, and through which channel, for example EMAIL.

Channel configuration details

Each eligible approver receives their own HTML email with unique Approve and Reject buttons.Config fields:
  • recipients - List of email addresses. Enter members’ sign-in emails. Conto sends approval requests only to addresses that belong to members who can approve the request. After a request escalates, that includes its escalation targets. Other addresses, such as a shared inbox, get no approval requests. Every listed address gets test messages and, if the channel subscribes to them, approval.decided and approval.expired status updates.
Clicking a button opens a browser, validates the token, and opens the hosted confirmation page. The page shows the amount, network, full destination address, agent, and purpose. A recipient name supplied by the agent is labeled as not verified. Opening the page, or a mail scanner or link preview fetching the link, does not use the token. The decision is recorded only after the approver selects Approve payment or Reject payment.
Requires a Slack app with the chat:write bot scope. Messages use Block Kit with the payment details and a Review in Conto button that opens the request in the dashboard.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. Invite the bot to the target channel
Uses the Telegram Bot API to send the payment details with a Review in Conto link button.Config fields:
  • botToken - Your Telegram bot token from @BotFather
  • chatId - The chat or group ID to send messages to
  • secretToken - Any random string. Required when you save the channel.
Setup:
  1. Create a bot via @BotFather
  2. Add the bot to your group chat
  3. Copy the chat ID into the channel config
Uses the WhatsApp Cloud API to send each recipient a free-form text message with the payment details and a Review in Conto link.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. Copy the phone number ID and a permanent access token into the channel config
Sends a signed JSON payload to any HTTPS endpoint. Approval payloads include a dashboardUrl that opens the request in Conto. They carry no approve or reject tokens, so an authenticated Conto approver makes the decision.A webhook channel is separate from the organization event webhook. See two kinds of webhooks for how their events and signatures differ.Config fields:
  • url - Your HTTPS endpoint URL
  • secret - Signing secret for HMAC verification (required)
Every delivery carries two headers:Verify the signature before trusting the payload. This signed input differs from Conto’s event webhooks, which sign the raw body only. Use this verifier for every notification-channel delivery (approval, payment execution, governance, alert, and Conto Pay events).
Approval payload (approval.requested, approval.decided, approval.escalated, approval.expired):
purpose is omitted when the agent did not supply one.Payment execution payload (payment.executed): event, paymentRequestId, paymentDetails (amount, currency, recipientAddress, agentName, purpose), transaction (transactionId, transactionHash, explorerUrl, executedAt), and timestamp.

Conto Pay lifecycle webhooks

conto_pay.request.received is delivered to the payer organization. Terminal outcomes (paid, rejected, and expired), cancellations, and reminders are delivered to both the payer and payee organizations when they have matching active webhook channels. links.requestUrl opens the request review page and links.payerActionUrl opens the payer’s action page. They match the links shown in the Conto Pay inbox.
Use request.direction to render the event from the receiving organization’s point of view: incoming means the organization is the payer, while outgoing means the organization created the request and is waiting on the payer.

Governance approval webhooks

Webhook channels can subscribe to governance.approval.requested and governance.approval.decided for protected organization changes. Use them when an external audit, compliance, or ticketing system needs a durable record of sensitive configuration changes such as policy updates, policy rule changes, API key lifecycle actions, or freeze configuration changes. Governance approval webhooks only notify. Owners and Admins approve or reject governance requests in the Conto dashboard. For setup, protected-action selection, and the review flow, see require a second approver for changes.

Alert webhooks

Webhook channels can subscribe to alert.raised to receive organization alerts outside the dashboard. Conto sends every alert raised at HIGH or CRITICAL severity. LOW, MEDIUM, and WARNING alerts stay in the dashboard. Approval requests arrive as approval.requested, not alert.raised. Conto sends at most five alerts of one type per organization in each 15-minute window. Subscribing the channel is the opt-in, so alert email preferences do not affect it. Alert types include: Conto does not retry a failed alert delivery. The failure is recorded on the channel as its last error. The same alert can arrive more than once, so dedupe on alert.id.

REST API

Manage channels with an organization API key: policies:read to list, policies:write to create, update, test, or delete.

Email action token security

Action tokens secure the Approve and Reject links in approval emails.
  • 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

Troubleshooting

  1. Check that the channel is active in Settings > Event Delivery
  2. Review the delivery notice shown for the channel
  3. Verify your bot token or credentials
  4. For Slack, confirm the bot is invited to the target channel
  5. For Telegram, confirm the bot is in the chat that matches the configured chat ID
This is expected. Chat messages link to the request with Review in Conto. Approve or reject in the dashboard or from the approval email.

Next steps

Approval workflows

Configure multi-approval workflows with escalation and sequential approvals

Recommended policy setup

Set up spending limits and approval thresholds for your agents