Slack Block Kit Approval Message Generator
Block Kit is Slack's JSON layout format for messages with structure and buttons. This generator builds an approval request you can post with chat.postMessage and wire to your ERP or PLM change workflow.
Fill in
Use the channel ID, not the name.
Body for POST https://slack.com/api/chat.postMessage
{
"channel": "C0123456789",
"text": "Approval needed: change order ECO-2291",
"blocks": [
{ "type": "header", "text": { "type": "plain_text", "text": "Engineering change approval" } },
{
"type": "section",
"fields": [
{ "type": "mrkdwn", "text": "*Document:*\nECO-2291" },
{ "type": "mrkdwn", "text": "*Requester:*\nAna Torres" },
{ "type": "mrkdwn", "text": "*Decision by:*\n2026-11-05" }
]
},
{ "type": "section", "text": { "type": "mrkdwn", "text": "*Impact:* Revision C to D on bracket 7751, 3 open work orders affected\n<https://plm.example.com/eco/2291|Open in system>" } },
{ "type": "divider" },
{
"type": "actions",
"block_id": "approval_ECO-2291",
"elements": [
{ "type": "button", "action_id": "approve", "style": "primary", "text": { "type": "plain_text", "text": "Approve" }, "value": "ECO-2291" },
{ "type": "button", "action_id": "reject", "style": "danger", "text": { "type": "plain_text", "text": "Reject" }, "value": "ECO-2291" }
]
},
{ "type": "context", "elements": [ { "type": "mrkdwn", "text": "Sent by the ERP integration. Decisions are logged." } ] }
]
}Send with an Authorization: Bearer bot token header and the chat:write scope. Button clicks are posted to the Interactivity Request URL of your Slack app, which must verify the Slack signing secret and respond within three seconds. Replace the buttons with a message update after a decision so nobody clicks twice.
Review your chat approval design
Optional: we can check signature handling, approver mapping and audit logging in your design.
Optional. The tool and every export work without this. No spam.
How to use it
Enter the channel ID, a short fallback text and the facts an approver needs. Copy the JSON into your integration and post it with your bot token. The fallback text appears in push notifications and screen readers, so make it meaningful on its own. Create the Slack app, add the chat:write scope, enable Interactivity and point the request URL to an endpoint you control. When someone clicks a button, Slack sends a signed payload with the action_id, the user and your value, which you map to the ERP document.
Handling the response safely
Treat every click as untrusted until verified. Check the X-Slack-Signature header with your signing secret and reject stale timestamps. Map the Slack user ID to an ERP user and confirm that person is an authorized approver for that document and amount. Update the original message to show the outcome and who decided, which also prevents duplicate clicks. Write the decision to your audit log with the Slack user ID and timestamp.
- Verify signature and timestamp
- Check approver authority in the ERP
- Update the message after the decision
- Make the handler idempotent
Common mistakes
Typical errors include using a channel name where an ID is required, exceeding the 50 block limit per message, forgetting that section text has a length limit, and responding to interactivity after the three second window. Do not put secrets or personal data in button values because they travel through Slack. Remember that private channel posts need the bot to be invited first.
Frequently Asked Questions
Do I need a Slack app to send this?
Yes for interactive buttons. An incoming webhook can post the blocks, but receiving clicks requires an app with Interactivity enabled and a public HTTPS request URL.
What is the fallback text for?
It is the plain text shown in notifications and by clients that cannot render blocks. Slack also uses it for accessibility, so write a complete sentence.
Can I approve without leaving Slack?
Yes if your handler writes the decision to the ERP through its API. For high value approvals many teams prefer a link to the system so a full review happens there.
Are there limits on message size?
Slack limits a message to 50 blocks and caps the length of text in individual blocks. Keep approval messages short and link out for detail.
Netray builds approval and alert integrations between ERP systems and chat tools, read-only by default with human approval on writes.
Related Tools
Teams Adaptive Card JSON Generator for Approvals
Creates an Adaptive Card approval message with a fact set, comment input and Approve and Reject actions, wrapped for a Teams webhook or Workflows post.
ERP OperationsERP Notification Matrix Worksheet
Map every ERP event to an audience, channel, priority and template, and see monthly volume per channel before you build.
Compliance & ContractsMessaging Integration Security Checklist
A 30 point checklist covering tokens, webhook verification, approver identity, data minimization, logging and incident handling for chat integrations.
Developer ToolsMessaging Throughput and Rate Limit Headroom Calculator
Estimate peak message rate, how much headroom you have under a rate limit, how many workers you need and how long a burst takes to drain.
More Developer Tools tools
See all- SAP Sales Order ABAP SELECT Generator (VBAK, VBAP, VBFA)
- SAP Sales Order Create BAPI ABAP Generator (BAPI_SALESORDER_CREATEFROMDAT2)
- SAP ABAP Open Items SELECT Generator
- SAP ACDOCA SQL Query Generator
- SAP QM Inspection Lot ABAP SELECT Generator
- SAP Quality Notification Pareto SQL Query Generator
- SAP QM Usage Decision BAPI Skeleton
- ABAP Custom Exception Class Generator
- ABAP Unit Test Class Generator
Keep exploring
Free tools
- Epicor BPM Custom Code Block GeneratorGenerates a C# custom code block for an Epicor method directive that validates a field on a temp table and raises an error or message.
- Teams Adaptive Card JSON Generator for ApprovalsCreates an Adaptive Card approval message with a fact set, comment input and Approve and Reject actions, wrapped for a Teams webhook or Workflows post.
- Slack API Rate Limit Tiers ReferenceSearchable table of Slack Web API methods with their rate limit tier and how to handle HTTP 429 responses.
ERP fixes and how-tos
- SyteLine csi_kit_live_kit and what a CSI warning meansWhat a CSI warning means in SyteLine and how to investigate csi_kit_live_kit or kit related warnings: find the object in SQL, read the message, check kits.
- Odoo Manufacturing App: How to Make a KitHow to make a kit in the Odoo Manufacturing app: set the BoM type to Kit, how stock and deliveries behave, and when to use Manufacture this product instead.
- How to Set Up Approval Routing in NetSuiteHow to configure NetSuite approval routing for purchase orders, vendor bills, and expense reports using native approval limits or SuiteFlow workflows.
Guides
- Wire Harness Production Scheduling and Capacity PlanningSchedule wire harness production around kit completeness, wire processing machines, formboards, test fixtures and operator certification, not just labor hours.
- Setting Up Mobile Approval Workflows in SyteLineConfigure mobile approval workflows in SyteLine for purchase orders, expense reports, and change requests. Enable on-the-go approvals for CloudSuite Industrial.
- How to Create Custom Workflows in SyteLineLearn how to create custom workflows in Infor SyteLine using the Workflow Designer, including approval routing, notifications, escalation rules, and integration triggers.
Integrations
- How to add Slack to Dynamics 365 Finance and Supply ChainAdd Slack to Dynamics 365 Finance and Supply Chain: events to alerts, slash commands, interactive approvals and safe write-backs through OData and services.
- How to add Slack to Infor LNConnect Slack to Infor LN with ION events, a Slack app, slash commands and interactive approval messages for supply chain alerts and read-only ERP lookups.