Output Routes
Output routes deliver agent and team run results to external destinations when a task completes or fails. Each route listens for specific events and posts a structured payload to its configured destination. Supported destinations:| Type | How it delivers |
|---|---|
| HTTP Webhook | POST to any URL with HMAC-SHA256 signing |
| Slack | Incoming Webhook — formatted message with result block |
| Discord | Discord Webhook — embedded message with result |
| Telegram | Bot API — sends message to a chat or group |
| Microsoft Teams | Incoming Webhook — Adaptive Card |
| Asana | Creates a task in a project via Personal Access Token |
| Trello | Creates or updates a card on a board via API Key + Token |
Concepts
Events
Every route subscribes to one or more events. Only matching events trigger delivery:| Event | Fires when |
|---|---|
task.completed | An agent task finishes successfully |
task.failed | An agent task errors out |
team_run.completed | A pipeline, orchestrator, or collaboration team run finishes |
team_run.failed | A team run errors out |
Payload
Every route receives the same JSON payload:result_full— the complete output. Some destinations (Slack, Discord, Telegram, Teams) truncate long outputs in the formatted message; use HTTP if you need the full untruncated result.attachments— file attachments associated with the task or team run. Signed download URLs expire after 24 hours.task_idorteam_run_id— only one will be set, depending on whether the event is from an agent task or a team run.
Retry
Each delivery is attempted up to 2 times (initial + 1 retry after 5 seconds). Failed deliveries are logged in Settings → Output Routes → Logs with the HTTP status code and error message.Scoping Deliveries
By default, all active routes in a workspace receive all matching events. You can restrict an agent or team to only send to specific routes — see the Output Routes selector in Agents and Pipeline Teams.Creating a Route
- Go to Settings → Output Routes
- Click New Route
- Choose the destination type and configure it
- Select which events to subscribe to
- Save — optionally test with the Send Test button
HTTP Webhook
The most flexible option. CrewForm POSTs the full JSON payload to your URL. Use this for custom integrations, internal tooling, or platforms not natively supported.Configuration
| Field | Required | Description |
|---|---|---|
| URL | ✅ | HTTPS endpoint to POST to |
| Secret | Optional | If set, CrewForm signs the payload with HMAC-SHA256 |
Signature Verification
If you set a secret, CrewForm adds aX-CrewForm-Signature header to every request:
HMAC-SHA256(secret, raw-body). Verify it on your server:
Example Handler (Express)
Tip: CrewForm treats any 2xx response as success. Return 200 quickly and process async to avoid timeouts.
Slack
Posts a formatted message to a Slack channel via an Incoming Webhook. Results appear in a coloured attachment block — green for completed, red for failed.Setup
- Go to api.slack.com/apps → Create New App → From Scratch
- Go to Incoming Webhooks → Enable → Add New Webhook to Workspace
- Select the channel and click Allow
- Copy the Webhook URL (starts with
https://hooks.slack.com/...)
Configuration
| Field | Required | Description |
|---|---|---|
| Webhook URL | ✅ | Slack Incoming Webhook URL |
Message Format
Messages are posted as Block Kit attachments:Truncation: Results over 2,900 characters are truncated in the Slack message. Full output is always available in the HTTP webhook payload.
Discord
Posts an embedded message to a Discord channel via a Discord Webhook.Setup
- In Discord, open the channel settings → Integrations → Webhooks
- Click New Webhook → give it a name
- Copy the Webhook URL
Configuration
| Field | Required | Description |
|---|---|---|
| Webhook URL | ✅ | Discord Webhook URL |
Message Format
Results appear as Discord embeds — green border for completed, red for failed — with agent name, task title, status, and result inline.Truncation: Results over 1,000 characters are truncated in the Discord embed. Use HTTP webhook if you need full output.
Note: This is a one-way output route (CrewForm → Discord). For two-way integration where Discord users can trigger agents via /ask, see the Discord Integration guide.
Telegram
Sends a message to a Telegram chat or group via the Bot API.Setup
- Create a bot via @BotFather →
/newbot - Copy the Bot Token (format:
123456789:AABBcc...) - Get the Chat ID of the target chat:
- For personal chats: message the bot, then visit
https://api.telegram.org/bot<TOKEN>/getUpdatesand findchat.id - For groups: add the bot to the group, send a message, check
getUpdates - For channels: add the bot as admin, use the channel’s
@usernameas the chat ID (e.g.@mycrewformchannel) or the numeric ID (e.g.-1001234567890)
- For personal chats: message the bot, then visit
Configuration
| Field | Required | Description |
|---|---|---|
| Bot Token | ✅ | Token from @BotFather |
| Chat ID | ✅ | Numeric chat ID, group ID, or @channelusername |
Message Format
Truncation: Results over 3,500 characters are truncated in the Telegram message.
Note: This is a one-way output route (CrewForm → Telegram). For two-way integration where Telegram users can trigger agents, see the Telegram Channel guide.
Microsoft Teams
Posts an Adaptive Card to a Teams channel via an Incoming Webhook. Cards render with a colour-coded header, fact set, and result body.Setup
- In Teams, open the channel → Connectors (⋯ menu → Connectors)
- Find Incoming Webhook → Configure
- Give it a name and upload an icon (optional)
- Click Create and copy the Webhook URL
Modern Teams: Microsoft is migrating from Connectors to Workflows. If Connectors aren’t available in your tenant, use the Power Automate Workflows app instead: add the “Post to a channel when a webhook request is received” workflow and copy its URL.
Configuration
| Field | Required | Description |
|---|---|---|
| Webhook URL | ✅ | Teams Incoming Webhook URL (or Power Automate Workflow URL) |
Message Format
Delivered as an Adaptive Card (version 1.4):- Header: ✅ / ❌ with task/team run status
- Fact Set: Prompt/Task, Agent/Team, Status
- Body: Result text (monospace font)
- Error: Shown if the task failed
Truncation: Results over 2,000 characters are truncated in the Teams card.
Asana
Creates a new task in an Asana project when a CrewForm task or team run completes or fails.Setup
- Go to app.asana.com/0/my-apps → Create New Token (Personal Access Token)
- Copy the PAT
- Find your Project GID:
- Open the project in Asana
- The URL contains the GID:
https://app.asana.com/0/<PROJECT_GID>/... - Or use the Asana API:
GET https://app.asana.com/api/1.0/projects
Configuration
| Field | Required | Description |
|---|---|---|
| Personal Access Token | ✅ | Asana PAT from your account settings |
| Project GID | ✅ | Numeric project ID from the Asana URL |
Task Format
Each delivery creates an Asana task with:- Name:
[CrewForm] <task title> — <status> - Notes: Event type, task/agent details, timestamp, and full result
Tip: Use Asana rules to automatically assign, tag, or move created tasks to specific sections based on their name or status.
Trello
Creates a new card (or updates an existing one) on a Trello board when a CrewForm task or team run completes or fails. Trello also supports bidirectional integration — cards moved to a trigger list can start agent tasks, and results are posted back as comments.Setup
- Go to trello.com/power-ups/admin → create or select a Power-Up to get your API Key
- From the API key page, click the Token link to generate a token with read/write access
- Find your Board ID:
- Open the board in Trello
- The URL contains the ID:
https://trello.com/b/<BOARD_ID>/...
- Find the List ID for the target list:
- Use the Trello API:
GET https://api.trello.com/1/boards/<BOARD_ID>/lists?key=<KEY>&token=<TOKEN> - Or use a browser extension like Trello Card Numbers
- Use the Trello API:
- (Optional) Find a Review List ID — completed cards will be moved here automatically
Configuration
| Field | Required | Description |
|---|---|---|
| API Key | ✅ | Trello API key from the Power-Up admin page |
| Token | ✅ | Trello token with read/write access |
| Board ID | ✅ | Board short ID from the Trello URL |
| Default List ID | ✅ | List where new result cards are created |
| Review List ID | Optional | If set, cards are moved here after results are posted |
Card Format
Each delivery creates a Trello card with:- Name:
[CrewForm] <task title> — <status> - Description: Event type, task/agent details, timestamp, and full result
Bidirectional Flow
When used with a Trello Messaging Channel, CrewForm supports a full round-trip:- Inbound: A card is created or moved to the trigger list → CrewForm creates a task
- Agent processes the card’s title/description as the prompt
- Outbound: The agent result is posted as a comment on the original card → card moves to the Review list
Tip: Set up two lists on your board — an “AI Work” list (trigger) and a “Review” list (review) — for a clean Kanban workflow with your AI agents.
Delivery Logs
Every delivery attempt is logged. View logs in Settings → Output Routes → [Route Name] → Logs:| Column | Description |
|---|---|
| Timestamp | When delivery was attempted |
| Event | Which event triggered the delivery |
| Status | success or failed |
| HTTP Code | Response code from the destination |
| Error | Error message if delivery failed |

