Free tool · no sign-up

Slack webhook message formatter

Build simple Slack webhook messages or advanced Block Kit payloads without writing JSON from scratch. Pick a starter — Simple message, Lead alert, Google Forms response, Support request, or Custom JSON — edit blocks, copy the payload, send.

Starting template

Pick a starter shape or build from scratch.

Top-level
header
section-mrkdwn
Add block
# preview

Hello from RouteForms

This is a Slack webhook message. Edit the blocks on the left to make it yours.

Block Kit payload

POST with Content-Type: application/json.

{
  "text": "New Slack message",
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Hello from RouteForms"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "This is a Slack webhook message. Edit the blocks on the left to make it yours."
      }
    }
  ]
}
curl

Paste into a terminal to send a real test post.

curl -sX POST "https://hooks.slack.com/services/T.../B.../..." \
  -H "Content-Type: application/json" \
  -d '{"text":"New Slack message","blocks":[{"type":"header","text":{"type":"plain_text","text":"Hello from RouteForms"}},{"type":"section","text":{"type":"mrkdwn","text":"This is a Slack webhook message. Edit the blocks on the left to make it yours."}}]}'
The seven blocks you'll actually use

What each block type is for

  • Header: big bold line at the top of the message. Use for the message title (“New lead”, “Urgent ticket”). Capped at 150 chars by Slack.
  • Section (text): a paragraph of mrkdwn. Supports *bold*, _italic_, `code`, line breaks, and Slack mentions. Most messages have one of these as the body.
  • Section (fields): up to 10 short mrkdwn lines rendered in a two-column grid. Good for label / value pairs (*Budget:* $50,000).
  • Divider: horizontal line. Separates the header / body from the meta / actions.
  • Context: smaller secondary text, usually for meta info (“Submitted 5 minutes ago”, “#leads”).
  • Actions: up to 5 buttons. Each button has text, an optional URL, and a style (default / primary / danger). Webhook buttons can only link to URLs, not trigger Slack-side actions.
  • Image: an image rendered inline, with required alt text for accessibility.
The five starter modes

Pick a starting point, edit from there

  • Simple message: header + a one-paragraph body. The smallest useful Slack webhook message.
  • Lead alert: header + two-column fields layout + action buttons + context. Built for inbound-lead notifications.
  • Google Forms response: header + form/timestamp + per-field lines + context. The shape RouteForms uses for form-to-Slack notifications.
  • Support request: header + on-call mention + divider + action buttons + context. Tuned for urgent inbound tickets.
  • Custom JSON: empty starter. Add blocks from the picker to build any Slack-shaped payload from scratch.

Pick a starter, edit the content for your use case, add or remove blocks, copy the payload. The channel preview updates as you type so you see what Slack will render before you send.

When to use this vs the form-response tools

The boundary in plain English

If your message is “here are the answers to a form submission, posted to Slack”, our form-centric tools are faster. The message preview takes form fields directly; the template generator ships 5 use-case presets; the notification templates reference gives you 8 copy-paste examples.

If your message needs more structure than the form-centric tools give you, buttons, divided sections, image embeds, custom field layouts, this generator is the right choice. It treats Block Kit as the model, not the form response.

FAQ

Frequently asked questions

What does this generator do?

It's a playground for building a Slack Block Kit body block-by-block. Pick from seven block types, header, section (text), section (fields), divider, context, actions (buttons), image, arrange them in any order, edit the content, and get the JSON payload + a curl command to POST it. The block model matches what Slack's incoming webhooks accept.

How is this different from the Slack message preview tool?

The preview tool (at /tools/slack-message-preview) is field-centric, type form question titles and answers, get a Block Kit body that's shaped like a form-response notification. The Block Kit generator is structural, you add the blocks you actually want (with buttons, images, fields layouts) and edit them as raw Block Kit. Use the preview when you're building a Google-Forms-to-Slack message; use this when you want full control of the Block Kit structure (interactive buttons, side-by-side field layouts, divider styling).

What block types does it support?

(1) Header, large bold text, capped at 150 chars. (2) Section (text), a single mrkdwn paragraph supporting *bold*, _italic_, `code`, and line breaks. (3) Section (fields), up to 10 small mrkdwn lines rendered in a two-column grid. (4) Divider, visual horizontal rule. (5) Context, smaller secondary text. (6) Actions, up to 5 buttons with text, URL, and style (default / primary / danger). (7) Image, image_url + alt_text. These cover ~95% of static webhook payloads.

Does the curl command actually send to Slack?

No, we just generate the command. When you paste it into a terminal and hit enter, your machine sends the request. The generator itself doesn't make any network requests. Use /tools/slack-webhook-tester if you want us to send the test ourselves and decode Slack's response.

What about interactive features like select menus or modals?

Slack's incoming webhooks don't support full interactivity, buttons can have URLs (jump to a page on click) but can't trigger actions back to a Slack app. For full interactivity (modals, select responses, action handlers), you need a Slack app with the Web API and Block Kit Actions, not an incoming webhook. The generator emits buttons-as-link-buttons because that's what webhooks actually accept.

Why a fallback text field?

Slack uses it for notifications (mobile alerts, accessibility tools, screen readers) when blocks can't be rendered or the user has rich content disabled. Without it, Slack returns the missing_text_or_fallback_or_attachments error. The generator includes it at the top of every payload.

What are Slack's actual block limits?

Up to 50 blocks per message; header text up to 150 chars; section.fields up to 10 entries; actions.elements up to 5 buttons; section text up to 3000 chars. The generator enforces the field and button caps in the UI; you'll need to mind the others manually. For messages over the limits, split into multiple webhook posts.

Where does this fit with the other tools?

Build the payload here. Validate the JSON shape against Slack's Block Kit Builder if you're unsure. Post a test to your webhook URL with /tools/slack-webhook-tester. If Slack rejects, decode the error at /tools/slack-webhook-error-decoder. For wiring the payload into a Google Forms submission, our Apps Script generator emits the bridge code at /tools/google-forms-to-slack-generator.

Wire these payloads into real form responses

RouteForms posts a Block Kit message like this on every Google Forms submission, with conditional routing and retries. Free for 30 responses a month.