Destination type
Slack Destination
Use Slack destinations when routed events should become channel alerts for incidents, approvals, review queues, deployments, or team-visible operational signals.
When to use this destination type
Choose SLACK when the receiver target is Slack chat.postMessage API. Destinations are outbound delivery targets: they do not decide whether a source request should be accepted, and they do not own connection filters or transformations. They own where the final delivery goes and how FastHook should authenticate, pace, disable, and inspect that delivery.
A destination can be reused by multiple connections when several source branches should feed the same receiver. Reuse keeps receiver capacity, credentials, and attempt evidence attached to one destination id.
FastHook dashboard fields
In the dashboard, create a destination, set Destination Type to SLACK, then fill the fields below.
ChannelSlack channel name such as #ops-alerts or a channel ID such as C123.... Use IDs for private or renamed channels.
Message textSlack text template with FastHook tokens such as {{event_id}} and {{payload.customer.email}}. Keep it meaningful even when using blocks.
Block Kit JSONOptional Slack blocks payload after template rendering. Validate the rendered JSON before using it for production alerts.
Bot tokenSlack bot token with chat:write scope and permission to post in the target channel.
Max delivery rateBuilt-in one message per second pacing.
API config fields
The REST API stores destination-specific behavior under config. Use PATCH for focused edits and PUT only when your request contains the full config you want to keep.
config.channelRequired Slack channel name or channel ID. Prefer channel IDs such as C123... for production, private channels, and renamed channels.
config.text_templateRequired Slack message text template. It is also the fallback text Slack uses for notifications and accessibility when blocks are present.
config.blocks_templateOptional Block Kit JSON array or object with a blocks array. FastHook renders template tokens before parsing the JSON.
config.auth_typeSLACK_BOT_TOKEN.
config.auth.bot_tokenSlack bot token, usually starting with xoxb-, used as the chat.postMessage Bearer token.
config.rate_limitBuilt-in delivery pacing for Slack messages. Slack destinations are fixed at 1.
config.rate_limit_periodRate-limit period. Slack destinations are fixed at second.
{
"name": "ops-slack-alerts",
"type": "SLACK",
"config": {
"channel": "#ops-alerts",
"text_template": "FastHook event {{event_id}}\n```{{payload}}```",
"blocks_template": "[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*FastHook event* {{event_id}}\\nCustomer: {{payload.customer.email}}\"}}]",
"auth_type": "SLACK_BOT_TOKEN",
"auth": {
"bot_token": "xoxb-your-slack-bot-token"
},
"rate_limit": 1,
"rate_limit_period": "second"
}
}curl -X POST "https://api.fasthook.io/v1/destinations" \
-H "Authorization: Bearer $FASTHOOK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "ops-slack-alerts",
"type": "SLACK",
"config": {
"channel": "#ops-alerts",
"text_template": "FastHook event {{event_id}}\n```{{payload}}```",
"blocks_template": "[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*FastHook event* {{event_id}}\\nCustomer: {{payload.customer.email}}\"}}]",
"auth_type": "SLACK_BOT_TOKEN",
"auth": {
"bot_token": "xoxb-your-slack-bot-token"
},
"rate_limit": 1,
"rate_limit_period": "second"
}
}'Authentication
Destination authentication is outbound. It helps the receiver trust or accept FastHook delivery, and it is separate from source authentication that verifies the original webhook producer.
- Slack bot token with chat:write scope
- Optional chat:write.public scope for posting to public channels without inviting the app first
HTTP methods and rate limit
This destination type uses the methods below for delivery attempts. Rate limits apply at the destination boundary, so every connection that targets the same destination shares that capacity.
Rate limit: Locked to 1 request per second.
Delivery behavior
- FastHook renders Slack templates per delivery and calls Slack chat.postMessage.
- Use a bot token from a Slack app installed into the same workspace as the target channel.
- The bot needs chat:write. If you do not use chat:write.public, invite the app bot to the public channel before sending.
- Private channels and multi-person DMs require a channel ID and the app bot must already be a member.
- Slack API responses with ok: false are treated as failed delivery attempts even when Slack returns HTTP 200.
- Block Kit templates must render to a JSON array or an object with a blocks array.
- Slack destinations are locked to 1 request per second to avoid message bursts.
Setup checklist
- Create or open a Slack app in the workspace that owns the target channel.
- In OAuth & Permissions, add the Bot Token Scope chat:write. Add chat:write.public only if the app should post to public channels without being invited first.
- Install or reinstall the Slack app to the workspace after changing scopes, then copy the Bot User OAuth Token that starts with xoxb-.
- Invite the app bot to the target channel, or use a channel ID for private channels and confirm the bot is a member.
- Create a FastHook destination and choose SLACK as the destination type.
- Set the target channel, message text template, optional Block Kit JSON, and bot token.
- Connect only Slack-worthy events through filters before routing to the destination.
Troubleshooting
Attempts fail with channel_not_found or not_in_channel.Confirm the channel value, prefer the channel ID, and invite the Slack app bot user to the channel. Private channels require membership before chat.postMessage can post.
Attempts fail with missing_scope.Add chat:write to Bot Token Scopes, reinstall the Slack app to the workspace, then update the FastHook destination with the new xoxb token if Slack rotated it.
Attempts fail with invalid_auth.Check config.auth.bot_token and rotate the token if it was revoked.
Blocks fail before delivery or Slack returns invalid_blocks.Render the template with a sample event, validate that blocks_template is JSON, and make sure it is either an array of block objects or an object with a blocks array.
Messages post but notifications are unhelpful.Keep text_template meaningful. Slack uses top-level text as fallback text for notifications and assistive clients when blocks are present.