# How to Automate Slack Project Updates using the API

- Tool: API Automations
- Difficulty: Intermediate
- Fix time: 30-60 minutes
- Compatibility: Free Slack workspace; no Marketplace approval needed for internal project update bots
- Last updated: May 2026

## TL;DR

Automate Slack project updates by receiving external webhooks (GitHub, Jira, custom), formatting data as Block Kit messages, and posting via chat.postMessage to project channels. Use thread_ts to organize follow-ups. chat.scheduleMessage for timed updates, and chat.update to edit sent messages. Rate limit: 1 message per second per channel. Block Kit payload limit: 50 blocks, approximately 40,000 characters — msg_blocks_too_long fires near 13,000 characters in practice.

## Best practices

- Save the (channel, ts) from every chat.postMessage response in your database keyed by job/build/ticket ID — enables status updates and threading.
- Use chat.update for in-place status changes rather than new messages — a single live-updating message is cleaner than a stream of status messages.
- Keep Block Kit text fields under 200 characters for webhook data — truncate and link to source for full details.
- Always include a plain text fallback alongside blocks — used in push notifications and accessibility.
- For high-frequency events (e.g., every commit), consider batching updates every 30 seconds rather than posting for each event.
- Validate and sanitize all external data before including in Block Kit text — long commit messages, unusual characters, and mrkdwn-like text can break formatting.
- Schedule batch reports (daily, weekly) during off-peak hours — reduces noise and respects rate limits.

## Frequently asked questions

### Is the Slack API free for project update bots?

Yes. The Slack Web API (chat.postMessage, chat.update, chat.scheduleMessage) is free with no per-message pricing. Rate limits apply regardless of plan.

### Why do I get msg_blocks_too_long even with fewer than 50 blocks?

There is a known issue (Bolt #2509) where msg_blocks_too_long fires near 13,000 characters total payload size, even with a small block count. The documented limit is 50 blocks / ~40,000 characters, but in practice the error appears earlier. Truncate long text fields to under 200 characters each and link to external sources for full details.

### Can I edit a scheduled message after creating it?

No. chat.scheduleMessage cannot be edited after creation. To change it, call chat.deleteScheduledMessage with the scheduled_message_id, then create a new scheduled message with the updated content or time.

### How do I update a message that was posted by my bot?

Call chat.update with the channel ID and ts from the original chat.postMessage response. Only the bot that posted the original message can update it — the bot token must match. Store (channel, ts) in your database when posting to enable future updates.

### What happens if my webhook endpoint is down when GitHub fires an event?

GitHub retries webhook deliveries on failure with exponential backoff — three times over 18 hours. Slack's Events API (for Slack-originated events) retries with exponential backoff for up to 24 hours. Implement idempotency in your webhook handler: track event IDs (GitHub delivery IDs) and skip re-processing if already handled.

### Can I post to multiple channels from one webhook event?

Yes. In your webhook handler, call chat.postMessage once for each target channel. Add a 1.1-second delay between calls if sending to the same channel repeatedly, but different channels can receive simultaneous posts.

### Can RapidDev help build a custom Slack CI/CD integration?

Yes. RapidDev has built 600+ apps including Slack bots with GitHub, Jira, and Linear integrations for live build status updates, PR review workflows, and sprint reporting. Visit rapidevelopers.com for a free consultation.

---

Source: https://www.rapidevelopers.com/api-automations/how-to-automate-slack-project-updates-using-the-api
© RapidDev — https://www.rapidevelopers.com/api-automations/how-to-automate-slack-project-updates-using-the-api
