Free Google Forms response formatter for Slack
Paste raw form data. JSON, a Sheets row, or key: value lines. We extract the fields, build a clean Slack Block Kit payload, and show you how the channel message will look. Everything runs in your browser.
Paste JSON, a Sheets row, or key: value lines. We'll detect the format.
📥 New form response
Form: Lead capture
Submitted: 6/3/2026, 1:53:23 PM
Name: Priya Mehta
Email: priya@example.com
Budget: ₹75,000
Interests: SEO, Slack, Forms
POST this to any Slack incoming webhook URL.
{
"text": "New response from Lead capture",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":inbox_tray: *New form response*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Form:* Lead capture\n*Submitted:* 6/3/2026, 1:53:23 PM"
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Name:* Priya Mehta\n*Email:* priya@example.com\n*Budget:* ₹75,000\n*Interests:* SEO, Slack, Forms"
}
}
]
}Three input shapes, auto-detected
- JSON object. A flat
{ "Name": "Priya", "Email": "..." }, an Apps ScriptonFormSubmitevent payload (withnamedValues), or a RouteForms-style payload with a_metablock. Whichever you've got, paste it. - TSV, a row from the Sheets responses tab. Open the linked Google Sheet, copy a row including the header line, paste. The first line becomes the field names, the second becomes the values.
- Key: value lines. The simplest fallback. One field per line as
Name: valueorName = value. Useful when you're transcribing a response from somewhere unstructured.
A Slack preview and a paste-ready Block Kit payload
The output panel shows two things side-by-side: a faithful Slack-channel preview (so you can sanity-check what the post will look like) and the raw Block Kit JSON (so you can POST it to a webhook or drop it into a script). One-click copy for either.
- The preview matches the message shape our Apps Script generator emits and what RouteForms posts in production, same header, same meta block, same field list.
- The JSON is a standard Slack Block Kit body. POST it to any
hooks.slack.comURL withContent-Type: application/json. - A “Copy text” button gives you a plain-text version too, for pasting into other tools or as a quick channel message draft.
The three moments people reach for it
- Debugging a broken integration. Your Apps Script logged an event payload but the Slack post never arrived (or arrived ugly). Drop the logged JSON in here, see what the formatted output should have been, compare against what actually landed.
- Building a custom server-side webhook.You're POSTing form responses to your own backend instead of Slack directly. Use the formatter to design the Slack relay payload, then have your server emit that same shape.
- Showing a teammate what the message will look like.Paste yesterday's response, screenshot the preview, send it. No need to wire anything up just to demo the output.
And where RouteForms picks up
The formatter does one thing: it shapes raw data into a Slack-ready message. It does not deliver, route, or monitor. Once you start needing those, the script alone won't carry you:
- Conditional routing. The formatter formats one message; RouteForms decides which channel that message belongs in based on the answer.
- Delivery monitoring.A per-form log of every Slack post with its HTTP response, the formatter doesn't deliver, so there's nothing to log. RouteForms records every attempt.
- Idempotent retries. If the same response triggers two posts (Apps Script retried, a teammate replayed manually), RouteForms dedupes on the Google Forms response ID at the database level. The formatter has no concept of a response ID.
Frequently asked questions
What does this tool do?▾
It turns messy raw form data into a clean Slack-ready message. Paste the response in whatever shape you've got it, a JSON object from your Apps Script log, a row copied from the Google Sheets responses tab, or just lines of 'Question: Answer', and the formatter extracts the fields, builds a Slack Block Kit payload, and shows a preview of how the channel message will look.
What input formats are supported?▾
Three, and we auto-detect: (1) a JSON object, either a flat { 'Name': 'Priya', ... } or an Apps Script event payload with a namedValues key; (2) a TSV, two tab-separated lines (headers, values) that match what you get from copying a row out of the responses Sheet; (3) plain Name: value or Name = value lines, one per question. Anything that doesn't fit gets a yellow warning and the unparsable lines are skipped.
Does this send anything to Slack?▾
No. Everything runs in your browser, your form data never leaves your machine. The output is a JSON payload you'd POST yourself, or copy into a script that POSTs it.
What do I do with the Block Kit JSON?▾
Two things, depending on what you're building. (1) Test in Slack: POST it to an incoming webhook URL with Content-Type: application/json, instant preview in the channel. (2) Use in code: hand it to whatever wrapper makes HTTPS calls, an Apps Script UrlFetchApp.fetch, a Node fetch, a curl command, anything. The payload shape is exactly what Slack expects.
How is this different from the Slack message preview tool?▾
The preview tool is interactive, you type field-by-field on the left and watch the message update. The formatter is paste-driven, you dump raw response data in once and get the formatted output. Use the formatter when you already have a real response and want it Slack-shaped; use the preview when you're designing the message format from scratch.
What about checkbox or multi-select answers?▾
Arrays get collapsed into comma-joined strings — ['SEO', 'Slack', 'Forms'] becomes 'SEO, Slack, Forms'. The same collapsing the Apps Script generator does on the live POST. If a value is over 500 characters we truncate with an ellipsis to keep the Slack message readable.
Will the timestamp match the real submission time?▾
No, the previewed timestamp is right now, because we're showing what your channel would see if the message arrived at this moment. The Apps Script generator and RouteForms both use the actual submittedAt from Google Forms, so the production message gets the correct time.
What if my JSON is wrapped in something weird?▾
If it's the standard onFormSubmit event from Apps Script (namedValues with arrays), we handle it natively. If it's a RouteForms-style payload with a _meta object, we extract formTitle as the form name and use the rest as fields. For anything more exotic, paste the inner part of the object directly or convert to plain Name: value lines first.
Format every response automatically
RouteForms posts a clean Slack message like this for every Google Forms submission, with routing rules, retries, and a per-form delivery log. Free for 30 responses a month.
Keep reading
If you're designing the message format from scratch instead of formatting a real response, the interactive preview is the better starting point.
Once you're happy with the shape, generate the Apps Script that POSTs this payload for every submission.
POST a test payload to your Slack webhook URL and see whether it accepts the body.
All the real options for delivering Google Form responses to Slack, ranked by fit.