How to Send Google Form Responses to Slack (Free Script, Zapier or Slack Workflow)
Send Google Form responses to Slack for free with a short Apps Script and a Slack webhook, or use Zapier. Steps, code, limits and fixes, checked 12 Oct 2026.
Quick answer: Attach a short Apps Script to your form, point it at a Slack incoming webhook, and add a form submit trigger. Free? Yes. Time: about 15 minutes. If you would rather not touch code, Zapier's Free plan allows 100 tasks per month as of 12 October 2026, which is enough for roughly 100 form responses.
This guide covers three ways to do it: a free script (Method 1), Zapier (Method 2) and a Slack workflow started by a webhook (Method 3).
What do you need before you start?
You need the following for every method:
- A Google Form that you own or can edit.
- A Slack workspace where you can add an app to a channel. If Slack blocks you, ask your workspace admin.
- A Slack channel to receive the answers. For a private channel, you must already be a member of it.
For Method 1 you also need a Google account. For Method 2 you need a free Zapier account. Method 3 needs a paid Slack subscription, according to Slack's help centre.
How do you send Google Form responses to Slack for free? (Method 1: Apps Script and a Slack webhook)
Create a Slack incoming webhook, then add a script to the form that posts each response to it. Everything here is free, and no third-party service sees your data.
Part A: Create the Slack webhook
Steps follow Slack's incoming webhooks page:
- Create a Slack app using the Create an app link on Slack's webhook page. Pick a name and your workspace, then click Create.
- On the app's settings page, select Incoming Webhooks.
- Switch Activate Incoming Webhooks to on.
- Click Add New Webhook to Workspace.
- Pick the channel for form answers, then click Authorize.
- Under Webhook URLs for Your Workspace, copy the new URL. It looks like
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX.
Slack says this URL is specific to a single user and a single channel, and that it contains a secret. Do not share it online.
Part B: Add the script to your form
- Open your Google Form and open its script editor. Verify this step: the menu may differ. It is usually under the three-dot menu at the top right of the form, in an item named Script editor.
- Delete the sample code and paste the script below.
- Replace
PASTE_YOUR_WEBHOOK_URL_HEREwith the URL from step 6. - Click Save.
// Sends every new Google Form response to a Slack channel.
// Run saveWebhook() once, then setup() once. Never run setup() twice.
function saveWebhook() {
// Stores the URL in Script Properties. Delete the URL from this
// line after you run the function.
PropertiesService.getScriptProperties()
.setProperty('SLACK_WEBHOOK_URL', 'PASTE_YOUR_WEBHOOK_URL_HERE');
}
function setup() {
const form = FormApp.getActiveForm();
ScriptApp.newTrigger('onFormSubmit')
.forForm(form)
.onFormSubmit()
.create();
}
function onFormSubmit(e) {
const url = PropertiesService.getScriptProperties()
.getProperty('SLACK_WEBHOOK_URL');
if (!url) {
throw new Error('Run saveWebhook() first.');
}
const response = e.response;
const lines = ['New Google Form response'];
if (e.source.collectsEmail()) {
lines.push('Email: ' + response.getRespondentEmail());
}
response.getItemResponses().forEach(function (itemResponse) {
const question = itemResponse.getItem().getTitle();
const answer = itemResponse.getResponse();
const text = Array.isArray(answer) ? answer.join(', ') : answer;
lines.push(question + ': ' + text);
});
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text: lines.join('\n') }),
muteHttpExceptions: false
});
}
- In the editor's function dropdown, choose saveWebhook and click Run. Google will ask you to authorize the script. Verify this step: the prompt wording may differ.
- Now delete the real URL from the
saveWebhookline, so it is not sitting in your code. - Choose setup and click Run. This creates the form submit trigger.
- Submit a test response in your form. The message should appear in your Slack channel.
Why does the code use setup() instead of the Triggers page? Both work. Google's guide says you can add a trigger by clicking Triggers (the alarm clock icon) and then Add Trigger. The code route uses the documented forForm(form) and onFormSubmit() methods from FormTriggerBuilder, so no dropdown labels are involved.
How does the script get the answers? The form submit event object includes response, a FormResponse for the whole submission, and source, the form. FormResponse returns item responses "in the same order that the items appear in the form", so Slack shows the questions in your form's order.
Method 2: How do you connect Google Forms to Slack with Zapier?
Use a Zap with the New Form Response trigger and the Send Channel Message action. This needs no code. According to Zapier's integration page, the trigger fires "when a new form response is received" and needs only the form. The Slack action needs a Message Text and a Channel.
- Log in to Zapier and click Create, then Zap.
- For the trigger, choose Google Forms, then the event New Form Response. Connect your Google account and select your form.
- Click Test trigger to pull in a sample response. Submit one first if none exists.
- For the action, choose Slack, then the event Send Channel Message. Connect your Slack account.
- Choose the channel. In Message Text, insert the answer fields from step 2.
- Click Test step, then publish the Zap.
Zapier also lists Send Direct Message and Send Private Channel Message as Slack actions, if the answers should go to one person or a private channel.
Method 3: How do you use a Slack workflow with a webhook?
Slack's own Workflow Builder can start a workflow when it receives a web request, and your form script can send that request. This is the option if you want Slack to format the message or take follow-up steps, but it needs a paid Slack plan. Slack's help article says the feature is "available on paid subscriptions".
In Workflow Builder, you set up a webhook start, define variables (each with a key and a data type), and Slack generates a URL starting with https://hooks.slack.com/triggers. Then add a step such as Send a message to a channel and insert your variables. You then change the script's payload to match the variable names, for example {"name": "...", "answer": "..."} instead of {"text": "..."}.
Three limits from the same article matter for forms:
- Up to 20 custom variables, so a long form will not fit.
- Nested JSON is not supported.
- If a defined variable is missing from the request, the workflow fails. Optional questions that are left blank can therefore break it.
Webhook workflows are also limited to one request per second.
Which method should you choose?
Method 1 suits most people. Method 2 suits anyone who dislikes code. Method 3 suits teams already paying for Slack who want Slack-side steps.
| Method | Cost (as of 12 Oct 2026) | Difficulty | Limits | Best for |
|---|---|---|---|---|
| 1. Apps Script + webhook | Free | Medium (paste code) | Apps Script quotas | Free, private, fast alerts |
| 2. Zapier | Free plan: 100 tasks/month | Easy | 15 minute polling on Free, two-step Zaps | No-code users |
| 3. Slack workflow + webhook | Paid Slack subscription | Medium to hard | 20 variables, 1 request/second, no nested JSON | Teams that want Slack-side steps |
What's free and what costs money?
Method 1 costs nothing, but Apps Script has quotas. Google's quota page (last updated 3 September 2026) lists 20,000 URL Fetch calls per day for consumer accounts and 100,000 for Google Workspace accounts, and 20 triggers per user per script. Each form response uses one URL Fetch call, so a small business is very unlikely to reach them. Google also says quotas can change without notice.
Zapier, as of 12 October 2026 on its pricing page:
- Free: 100 tasks per month, two-step Zaps, 15 minute polling. Webhooks and premium apps are not included.
- Professional: from $19.99 per month billed annually ($29.99 billed monthly) for 750 tasks, with 2 minute polling.
- Each successful Slack message uses one task. The Free plan has no pay-per-task option, so Zaps stop when the 100 tasks are gone.
Slack's webhook-started workflows need a paid subscription. Check your own plan before building Method 3.
What can go wrong, and how do you fix it?
- Nothing appears in Slack. The trigger probably does not exist. Open the Triggers page in the script editor and confirm an
onFormSubmitentry for your form. If it is missing, runsetup()once. - Every response posts twice. You ran
setup()more than once. Delete the duplicate on the Triggers page. - Error "Run saveWebhook() first". The URL was never stored. Paste it into
saveWebhook(), run it, then remove it. - Slack returns
no_text. Slack documents this error as thetextattribute missing from the payload. Check that the payload is{ text: ... }and the content type isapplication/json. - The trigger stops working after a teammate leaves. Google says installable triggers always run under the account of the person who created them. Create the trigger from an account that will stay, or a shared account.
- The Zap is slow. On the Free plan Zapier checks for new data every 15 minutes, as of 12 October 2026. Use Method 1 for fast alerts or upgrade.
Is this allowed?
Yes. Incoming webhooks, Apps Script triggers and Zapier's integration are all designed for this. Two cautions apply.
First, treat form data as personal data. Answers can include names, email addresses and health or HR details. Posting them to a busy Slack channel exposes them to everyone in it, so use a private channel for sensitive forms and check your organization's privacy policy.
Second, keep the webhook URL secret. Slack states that it "actively searches out and revokes leaked secrets", so a URL committed to a public repository may stop working.
What's still unclear?
- How fast is Zapier's trigger? Zapier's pricing page lists 15 minute polling on the Free plan, so expect delays there.
- File upload answers. Google's ItemResponse reference does not describe them, so test before relying on them.
- Quota changes. Google can change Apps Script quotas without notice, so check the quota page if your volume is high.
- Slack app creation rules. If your workspace restricts app installs, ask an admin.
- Weakest point of Method 1: it relies on one person's account. If that account is suspended, alerts stop silently.
Last checked: 12 October 2026. Steps marked "Verify this step" could not be matched to a vendor page word for word.
Frequently asked questions
Can Google Forms post to Slack without Zapier?
Yes. A short Apps Script attached to the form can run every time someone submits it and send the answers to a Slack incoming webhook. Both Apps Script and Slack webhooks are the vendors' own tools, so no third-party service is needed. You paste a short script and create one trigger. Apps Script has daily quotas, listed in this guide.
Is a Slack incoming webhook URL safe to share?
No. Slack's documentation says the webhook URL contains a secret and should not be shared online, including in public code repositories. Anyone who has it can post to that channel. Store it in Script Properties rather than pasting it into the code of a shared script, and create a new webhook if it leaks.
Does the Zapier free plan work for Google Forms to Slack?
Yes, with limits. As of 12 October 2026, Zapier's pricing page lists 100 tasks per month, two-step Zaps and a 15 minute polling interval on the Free plan. A Google Forms trigger plus a Slack message is two steps, and each Slack message uses one task. When the 100 tasks are used, Zaps stop until the next cycle.
Why did my Google Form not trigger the script?
The most common cause is a missing trigger. Saving a function named onFormSubmit does not make it run. Google says an installable form submit trigger runs when a user responds to a form, so one must be created, either from the Triggers page or with the setup function in this guide. Check the Executions page for errors.
Can I send file upload answers or checkbox answers to Slack?
Checkbox answers work. Google's reference says checkbox questions return an array of the respondent's choices, and the script below joins them with commas. File upload answers are not covered in the ItemResponse reference, so test them with your own form before relying on them.
Sources
- Sending messages using incoming webhooks, Slack (2026-10-12)
- Build a workflow: Create a workflow that starts outside of Slack, Slack (2026-10-12)
- Installable Triggers, Google for Developers (2026-10-12)
- Event objects, Google for Developers (2026-10-12)
- Class FormTriggerBuilder, Google for Developers (2026-10-12)
- Class FormResponse, Google for Developers (2026-10-12)
- Class ItemResponse, Google for Developers (2026-10-12)
- Quotas for Google Services, Google for Developers (2026-09-03)
- Google Forms + Slack integrations, Zapier (2026-10-12)
- Zapier pricing, Zapier (2026-10-12)