Some links on this page are affiliate links. If you sign up through them, Flowpaja may earn a commission at no extra cost to you.
Only need responses in a sheet? The shorter guide Send Typeform responses to Google Sheets covers just that. This page adds hidden fields, Slack, email and troubleshooting.
What you need
- A Typeform account and a published form. If you don't use Typeform yet: Typeform (affiliate link)
- Honest limit: Typeform's Free plan allows 10 responses a month across all your forms (Typeform Help Center, checked 2 October 2026). When you hit the limit, your forms stop accepting responses until the next month. That's enough to build and test this scenario, not to run a live lead form. Paid plans start at 100 responses a month (Basic), and removing Typeform branding needs Plus or higher. For simple or high-volume forms, Tally is the cheaper option.
- A Make.com account. The Free plan includes 1,000 credits a month and 2 active scenarios, according to Make's pricing page (checked 2 October 2026). Sign up here if needed: Make (affiliate link)
- Google Sheets, Slack and Gmail accounts (or just the ones you use)
Step 1: Add the instant Watch Responses trigger
- In Make, create a scenario and add Typeform → Watch Responses. Make has two modules with this name: pick the one with the INSTANT tag. The other one polls on a schedule and uses a credit on every check, even when there's nothing new.
- Click Create a webhook, then Create a connection. Select your Typeform account's region and approve the permissions.
- Select the form and save. Make creates the webhook in Typeform for you.
- Click Run once, then submit the form with fictional data, e.g. "Ana Example",
[email protected].
The trigger's output now shows the response: its ID (token in Typeform's data), the submit time, the answers and any hidden values.
Step 2: Set up and map hidden fields
Hidden fields carry data the respondent doesn't type, such as the traffic source, a campaign or a customer ID. Typeform renamed them URL parameters, but Make and Typeform's data still call them hidden fields.
- Create them in Typeform: in the form editor, open Workflow and use Pull data in to add parameters such as
utm_sourceandref. Typeform requires lower-case names with underscores instead of spaces. - Pass them in the form link. Typeform reads them after a
#, not a?:
https://yourname.typeform.com/to/AbC123#utm_source=newsletter&ref=oct-campaign
- Send a test response through that link, then click Run once again so Make sees the values.
- In Make, the values appear in a separate hidden collection, e.g.
hidden.utm_source. Pick them from the mapping panel rather than typing the path. Add a fallback for visitors who arrive without parameters:
{{ifempty(1.hidden.utm_source; "direct")}}
The name in the link must match the parameter exactly: utm_source works, UTM_Source or utm-source stays empty.
Step 3: Map answers reliably
In Typeform's data, answers are a list, one entry per answered question. Each entry has the question's ID and ref, a type, and the value under a key that depends on the type: text, email, number, boolean, date, url, file_url, choice (one option) or choices (several options).
- If the Make module shows each question as its own field, map those directly.
- If you work with the raw list, pick answers by the question's ref rather than its position. The ref stays the same when you edit the question text; it changes if you delete the question and create a new one.
- Multiple choice with several options gives a list of labels. Write it into one cell with
{{join(…choices.labels; ", ")}}.
Step 4: Send to Google Sheets, Slack and email
You don't need a router for this. Three modules in a row is the simplest setup, because each runs once per response.
- Google Sheets → Add a Row. Columns, for example: Submitted at | Response ID | Name | Email | Company | utm_source | ref. Keep the column order fixed.
- Slack → Send a Message to e.g.
#leads:
New Typeform response from {{name}} ({{company}})
Source: {{ifempty(1.hidden.utm_source; "direct")}}
If you connect Slack as a bot, invite the bot to the channel first, or Slack answers with not_in_channel or channel_not_found (fix: Slack channel not found in Make). Keep personal data in Slack to what the team needs.
- Gmail → Send an email to yourself, with the full answers. Only email the respondent if your form tells them they'll get an email.
Add a filter right after the trigger, e.g. Email → Exists, so test or incomplete responses stop before they use more credits.
Worried about the same response arriving twice? Store the response ID (token) and check it with Google Sheets Search Rows before Add a Row. Search Rows outputs one empty bundle when it finds nothing, so filter on Total number of bundles = 0, as explained in Search Rows returns nothing.
Credits per run
Make counts one credit per module action; filters and routers don't use credits (Make pricing page, checked 2 October 2026):
| Setup | Modules that run | Credits per response |
|---|---|---|
| Sheets only | Trigger + Add a Row | 2 |
| Sheets + Slack | Trigger + Add a Row + Slack | 3 |
| Sheets + Slack + Gmail | Trigger + 3 actions | 4 |
| Stopped by the filter | Trigger | 1 |
A retried run uses credits again for the modules it reruns. More in Make credits explained.
The 3 most common errors and fixes
1. The scenario doesn't run when someone submits
- Causes:
- The scenario was deactivated. A scenario that starts with an instant trigger ignores the Errors before deactivation setting: without stored incomplete executions, the first error switches it off.
- Typeform disabled the webhook. Typeform does this immediately if the endpoint answers
404or410(for example, after the webhook was deleted in Make), and also after a long run of failed deliveries. It sends you an email when it happens.
- Fix:
- Switch the scenario on, and enable Store incomplete executions in the scenario settings.
- Check Typeform's emails for a webhook warning. Webhooks that Make creates through Typeform's API aren't listed in the form's own webhook settings, so check from the Make side.
- In Make, open the trigger and check that its webhook still exists (also under Webhooks in the left menu). If it's gone, create a new webhook in the trigger and save, so Make registers it again.
For general webhook checks, see Make webhook not receiving data.
2. Answers are empty after editing the form
- Cause: a question was deleted and recreated, or changed type. It now has a new ID and ref, so the old mapping points at nothing.
- Fix:
- Send a new test response and Run once.
- Remap the affected fields.
- In future, edit questions in place rather than recreating them.
3. Hidden fields are always empty
- Cause: the link doesn't contain the parameters, uses
?instead of#, spells the name differently, or an embed doesn't pass them on. - Fix:
- Open the exact link your visitors use and check that the parameters are there after the
#. - For embedded forms, pass the values with the embed code's
data-tf-hiddenattribute, or keep Read URL parameters switched on in the embed's advanced settings if the values are in your page's URL. - Add an
ifempty()fallback so the sheet shows "direct" instead of a blank.
- Open the exact link your visitors use and check that the parameters are there after the
Also seen: 401/403 errors when the Typeform connection lost access. Reauthorize it under Connections. For Google errors, see Make Google connection errors. For all error types, see the Make error cheat sheet.