Skip to main content

Notification Channels

Notification channels send approval requests and webhook lifecycle events to external platforms. Approvers can approve or reject directly from their email inbox, Slack workspace, Telegram chat, or WhatsApp conversation. Webhook channels can also receive machine-readable payment execution and governance approval events for agents, compliance tools, and back-office systems.

How It Works

Every external decision follows the same approval rules as a dashboard decision and appears in the same audit history. When a decision reaches the required approval count, Conto submits payments from managed wallets. The resulting transaction hash and explorer URL are available from the approval review; payment.executed remains the lifecycle event for downstream webhook consumers. External and smart-contract wallets still use their manual execution flow. When a policy requires approval and no custom workflow matches, Conto creates a one-review request for an organization Owner, Admin, or Manager. The dashboard alert and configured notification channels reference the same reviewable request.

General Store Email Actions

General Store emails use the same hashed action-token infrastructure for customer order approval, merchant Accept and Ready actions, customer status links, and disabling Store auto-pay. Order actions are scoped to the order and intended recipient, expire automatically, and are consumed atomically when used so a replay cannot repeat a lifecycle transition. Stripe Connect onboarding uses a separate merchant-scoped, time-limited renewal token. It does not contain Stripe credentials and cannot edit a merchant or enable payouts. Its only authority is to request a fresh single-use Stripe Account Link for the same merchant when an emailed onboarding link expires. Stripe account.updated events and an explicit admin sync remain the source of truth for charges and payout readiness.

Supported Channels

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:Webhook targets must resolve to public addresses. Conto rejects loopback, private, link-local, and other internal-only destinations. In production, webhook channels must use HTTPS.
3

Select event types

Choose which events trigger notifications:
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
  • secretToken - Required webhook secret. Conto requires Telegram to send the matching x-telegram-bot-api-secret-token header on every callback.
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. Include Telegram’s secret_token option when calling setWebhook
  4. Add the bot to your group chat
Conto only accepts interactive callbacks for the configured chatId. Telegram callbacks must also include the matching secret header before approval tokens are processed.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
  • secret - Signing secret for HMAC verification (required)
Every delivery is signed: the X-Conto-Signature header carries an HMAC-SHA256 of ${timestamp}.${rawBody} computed with your channel secret. Verify it before trusting the payload.Validation rules:
  • The destination must resolve to a public IP address
  • Private, loopback, link-local, and .internal / .local hosts are rejected
  • In production, only https:// webhook targets are accepted
Payload format:
To submit a decision, POST the token back to the actionUrl:

Conto Pay Lifecycle Webhooks

Webhook channels can subscribe to hosted Conto Pay request lifecycle events: conto_pay.request.received, conto_pay.request.paid, conto_pay.request.rejected, and conto_pay.request.expired. The received event is delivered to the payer organization. Terminal outcomes (paid, rejected, and expired) are delivered to both the payer and payee organizations when they have matching active webhook channels. Each Conto Pay webhook payload includes absolute hosted links for the request review page and the payer action page. These match the copyable links shown in the Conto Pay activity inbox and hosted request review screens, so external systems and human operators can refer to the same URL.
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 events for protected organization changes: governance.approval.requested and governance.approval.decided. Use these events 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 are notification-only. Owners and admins still approve or reject requests from the Conto dashboard. For dashboard setup, protected-action selection, and the in-product review flow, see Governance Approvals.

REST API

Manage channels programmatically:

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
Store order approval emails use the same one-time token model. When a connected agent starts a General Store checkout that requires customer approval, Conto emails the customer order-bound Approve and Decline links. Approval opens hosted checkout for that order; decline cancels the approval-pending order and releases the reserved spend.

Webhook Payload Validation

Inbound webhook payloads from Slack, Telegram, and WhatsApp are validated against typed Zod schemas before processing. Malformed payloads are rejected with a 400 response and never reach handler logic. Signature verification (HMAC) still runs first for all three providers regardless of payload shape.

Delta decision callbacks

Organizations using Delta receive a signed approval.requested webhook with the approval reference and the payment and invoice fields required for verification. Verify the X-Conto-Signature over ${X-Conto-Timestamp}.${rawBody} before acting on the request. See Delta Verification Setup and the Delta End-to-End Test for the complete integration sequence. After verification, submit the decision to the decision callback URL provisioned during Delta onboarding. Use the approval reference from the webhook:
The response returns recorded, idempotent, the approval and payment references, a customer status, and status URLs. A pending response includes an await_more_approvals next action. Retrying the same signed decision is safe; a conflicting decision returns DECISION_CONFLICT. Subscribe to payment.executed when the verifier also needs the settlement transaction reference, hash, explorer URL, and execution time for reconciliation.

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