approval.approved and approval.denied
event webhooks.
How it works
When a payment needs approval, Conto sendsapproval.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
Email
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.decidedandapproval.expiredstatus updates.
Slack
Slack
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
- Create a Slack app at api.slack.com/apps
- Add the
chat:writebot scope - Install the app to your workspace
- Invite the bot to the target channel
Telegram
Telegram
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 @BotFatherchatId- The chat or group ID to send messages tosecretToken- Any random string. Required when you save the channel.
- Create a bot via @BotFather
- Add the bot to your group chat
- Copy the chat ID into the channel config
WhatsApp
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 IDaccessToken- Permanent access token from MetarecipientNumbers- Phone numbers in international format (e.g.,+1234567890)
- Register at developers.facebook.com
- Create a WhatsApp Business app
- Copy the phone number ID and a permanent access token into the channel config
Webhook
Webhook
Sends a signed JSON payload to any HTTPS endpoint. Approval payloads include a Approval payload (
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 URLsecret- Signing secret for HMAC verification (required)
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.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.
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 togovernance.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 toalert.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
Notifications not arriving
Notifications not arriving
- Check that the channel is active in Settings > Event Delivery
- Review the delivery notice shown for the channel
- Verify your bot token or credentials
- For Slack, confirm the bot is invited to the target channel
- For Telegram, confirm the bot is in the chat that matches the configured chat ID
Email link expired or already used
Email link expired or already used
Email action tokens are one-time use and expire with the approval request. Once the request is
resolved, by another approver or from the dashboard, its links stop working.
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