Machine View
External Approval Channels
Source: https://conto.finance/docs/guides/external-approvals
# External Approval Channels
> Set up email, Slack, Telegram, and WhatsApp approval flows so your team can approve payments without logging into Conto
- Human URL: https://conto.finance/docs/guides/external-approvals
- Raw Markdown: https://conto.finance/docs/guides/external-approvals.md
- Terminal view: https://conto.finance/ai/docs/guides/external-approvals
Documentation group: Guides
# External Approval Channels
This guide walks through setting up approval notifications so your team can approve or reject payments from wherever they already work.
This is the setup walkthrough. For the concepts (when to use approval workflows, trigger conditions, patterns), see [Approval workflows](https://conto.finance/guides/approval-workflows). For the channel API reference (endpoints, request shapes), see [Notification channels](https://conto.finance/integrations/notification-channels).
## Prerequisites
An active organization with at least one agent
An approval trigger: a configured workflow or a policy rule that requires approval ([Securing
Agents](https://conto.finance/guides/securing-agents))
Admin or Owner role in your organization
## What You'll Build
By the end of this guide, your approval flow will look like this:
```
Agent requests $500 payment
→ Approval workflow triggers
→ Approver gets a Slack message with Approve/Reject buttons
→ Approver clicks "Approve" in Slack
→ Payment is approved and executed
→ Audit log records: who, when, which channel
```
## Step 1: Set Up an Approval Workflow
If you haven't already, create an approval workflow that triggers on the conditions you care about.
For multi-review, sequential, or specifically assigned approvals, configure a custom workflow. A
policy rule that requires approval without a matching custom workflow still creates a one-review
request for an organization Owner, Admin, or Manager in **Alerts & Approvals**.
Go to **Policies** in the dashboard. Create a new Approval Workflow with:
| Field | Example Value |
|-------|--------------|
| Name | Large Payment Review |
| Amount Threshold | $100 |
| Required Approvals | 1 |
| Timeout | 24 hours |
| Approver Roles | OWNER, ADMIN |
Request a payment above your threshold and confirm that Conto marks it as waiting for review.
Keep the returned payment request ID and check its customer-facing status before taking another
payment action.
## Step 2: Add a Notification Channel
Channels">
Click **Add Channel** and choose your platform.
Fill in the platform-specific fields.
**For Slack:**
- Bot Token: `xoxb-...` (from your Slack app)
- Channel ID: `C0123456789`
**For Email:**
- Recipients: `cfo@company.com, finance@company.com`
**For Telegram:**
- Bot Token: from @BotFather
- Chat ID: your group chat ID
At minimum, enable `approval.requested`. Consider also enabling:
- `approval.escalated` for time-sensitive visibility
- `approval.expired` so nothing falls through the cracks
- `payment.executed` on `WEBHOOK` channels if your verifier needs to mark invoices as paid
- `approval.approved` / `approval.denied` on your organization webhook when a decision is final, for your own audit trail
Click the test button. You should receive a sample notification on your platform.
## Step 3: Test the Full Flow
Use the SDK or dashboard to request a payment above your approval threshold.
```bash
curl -X POST https://conto.finance/api/sdk/payments/request \
-H "Authorization: Bearer $SDK_KEY" \
-H "Content-Type: application/json" \
-d '{ "amount": 500, "recipientAddress": "0x...", "purpose": "Test approval" }'
```
Within a few seconds, you should receive a notification on your configured channel with payment details and Approve/Reject buttons.
Complete the approval from the email confirmation page or the Conto dashboard. When the final
required approval is recorded, a Conto-managed wallet submits the payment automatically. The
approval review then links directly to the chain explorer receipt. If custody execution cannot
be completed, the approval remains recorded and the review shows that automatic execution needs
attention instead of presenting a receipt. External and smart-contract wallets continue through
their manual execution and confirmation flow.
Go to **Audit Logs** in the dashboard. You should see the approval decision with the channel
recorded (e.g., `SLACK`, `EMAIL`). Conto commits the decision, request state, and audit record
atomically, so a successful decision cannot lose its audit entry.
## Multiple Channels
You can configure multiple channels simultaneously. When an approval request is created, notifications are sent to all active channels that subscribe to the `approval.requested` event. The first approver to act from any channel resolves the request.
Info:
Notification channels deliver independently. If one channel is unavailable, other configured
channels can still deliver. Temporary delivery failures are retried.
## Webhook Integration for Custom Systems
If you already have your own approval system, use the Webhook channel type to receive approval requests and hand the final decision off to an authenticated Conto approver.
Approval authority is enforced the same way on every channel. Whether a decision arrives from the
dashboard, Slack, Telegram, WhatsApp, email, or a webhook, the deciding member must hold an
approval-capable role (`OWNER`, `ADMIN`, or `MANAGER`). Read-only roles (`VIEWER`, `MEMBER`) cannot
clear a payment even if a workflow lists them, and the initiator cannot self-approve unless a
custom workflow explicitly opts in.
Info:
`/api/approvals/action` only processes payment-approval decision tokens. `GET ?token=...` never
records a decision directly; it redirects to a hosted confirmation page first so mail scanners and
link previews cannot approve or reject a request by accident. `POST` accepts only `APPROVE` and
`REJECT` tokens from approval notifications. Store-order approval emails and auto-pay disable
links use their own hosted action flows.
```bash
# 1. Configure a webhook channel pointing to your system
# 2. Your system receives a signed approval-request payload
# 3. Notify your reviewers or link them to the Conto approval inbox
# 4. Complete the decision in Conto
```
## Troubleshooting
1. Check that the channel is **active** (toggle is on) in Settings > Channels
2. Review the delivery notice shown for the channel
3. Verify your bot token or credentials are correct
4. For Slack, confirm the bot is invited to the target channel
5. For Telegram, confirm the webhook URL is set correctly
Action tokens are one-time use and expire with the approval request. If the approval request has already been resolved (by another approver or from the dashboard), the token is no longer valid.
Confirm your Slack app's interactivity request URL is set to `https://conto.finance/api/webhooks/slack`, then reconnect the channel in Conto if the issue continues.
## Next Steps
### Channel Reference
Link: https://conto.finance/integrations/notification-channels
Full configuration reference for all channel types
### Policy Testing
Link: https://conto.finance/guides/policy-testing
Test your approval workflows before going to production