Guide · Make.com · Tally · Google Sheets

How to send Tally form submissions to Google Sheets with Make

Short answer: Start a Make.com scenario with the instant Tally → Watch New Responses trigger, or point a Tally webhook at a Make Custom webhook. Then add Google Sheets → Add a Row and map each Tally field to a column. Multi-choice answers arrive as lists of option IDs, so turn them into text and join them into one cell. Store the Tally response ID in its own column and check it before adding a row, so a resent submission doesn't create a second row.

By Flowpaja · Published

A Tally Watch New Responses trigger, a Search Rows check that finds no existing response ID, and one Google Sheets row added per submission
Check the response ID before adding the row, so a resent submission never creates a second row.
Disclosure: everything in this guide works with plain Make.com and the apps it connects. At the end we mention our own Make templates and our Make scenario fix service on Fiverr. Module names, settings and limits were checked against Make's Tally app docs and Make's Google Sheets docs in October 2026. Menus and limits change, so check them if something looks different.

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.

What you need

  • A Tally form. Tally's free plan includes unlimited forms and submissions (within Tally's fair-use rules), webhooks and the Make integration, so you can build and run this without paying. No account yet? Tally (affiliate link)
  • A Make.com account. The Free plan includes 1,000 credits a month, 2 active scenarios and a 15-minute minimum interval for scheduled runs, according to Make's pricing page (checked 2 October 2026). The interval doesn't matter here, because this scenario uses an instant trigger. Sign up here if needed: Make (affiliate link)
  • A Google account and a Google Sheet

Honest limits to know first:

  • Tally sends the answers as a list of field objects, not as fixed named fields. Mapping by question label takes one small formula (step 4).
  • Uploaded files arrive as links to Tally's storage, not as files in your sheet. On the free plan, each uploaded file can be up to 10 MB; Tally Pro removes that limit.
  • Tally branding stays on free forms, and Tally's own email notifications are a Pro feature. Neither matters for this scenario, but it's worth knowing before you choose a form tool.

Step 1: Prepare the sheet

Create a tab called Responses with these headers in row 1:

Submitted at | Response ID | Name | Email | Services | Budget | Message | File links

Keep the column order fixed. Make writes Google Sheets values by column position, so inserting a column in the middle later shifts your data into the wrong columns.

Step 2: Choose the trigger

Option A: Tally app (simplest)

  1. In Make, create a scenario and add Tally → Watch New Responses. It's an instant trigger.
  2. Click Create a webhook, then Create a connection. Choose Tally OAuth (sign in to Tally) or Tally Personal API Key (create the key in Tally under Settings → API keys).
  3. Select your form and save. Make adds the webhook to the form for you, and it shows up under the form's Integrations tab in Tally.

Option B: Tally webhook to a Make Custom webhook

  1. In Make, add Webhooks → Custom webhook, click Add, name the webhook and save. Copy the URL.
  2. In Tally, publish the form, open the Integrations tab and click Connect next to Webhooks. Paste the URL.
  3. Optional, but a good idea: protect the webhook. In Make's webhook settings, add an API key. In Tally's webhook settings, click Add HTTP headers and send that key in a header named x-make-apikey. Make then accepts only requests that carry the key.

Both options are instant: the scenario runs when a submission arrives. Nothing polls, so no credits go to empty checks. If the scenario never starts, see Make webhook not receiving data.

Step 3: Send one test submission

Click Run once in Make, then submit your Tally form once with fictional data, e.g. "Ana Example", [email protected]. Make shows the received data in the trigger's output bubble. With a Custom webhook, Make learns the data structure from this first request.

A Tally webhook payload looks like this (shortened from the example in Tally's webhook docs):

{
  "eventId": "…",
  "eventType": "FORM_RESPONSE",
  "createdAt": "2026-10-02T09:15:00.000Z",
  "data": {
    "responseId": "abc123",
    "formName": "Contact",
    "createdAt": "2026-10-02T09:15:00.000Z",
    "fields": [
      { "key": "question_1", "label": "Name", "type": "INPUT_TEXT", "value": "Ana Example" },
      { "key": "question_2", "label": "Email", "type": "INPUT_EMAIL", "value": "[email protected]" },
      { "key": "question_3", "label": "Services", "type": "CHECKBOXES",
        "value": ["opt1", "opt3"],
        "options": [ { "id": "opt1", "text": "Website" }, { "id": "opt2", "text": "SEO" }, { "id": "opt3", "text": "Automation" } ] },
      { "key": "question_3_opt1", "label": "Services (Website)", "type": "CHECKBOXES", "value": true }
    ]
  }
}

Real option IDs are long UUIDs. Checkbox questions also get one extra true/false entry per option, labelled like Services (Website).

Step 4: Map the fields

Add Google Sheets → Add a Row, choose your connection, spreadsheet and the Responses tab.

Because fields is a list, pick each answer by its label with map():

Name:   {{first(map(1.data.fields; "value"; "label"; "Name"))}}
Email:  {{lower(trim(first(map(1.data.fields; "value"; "label"; "Email"))))}}
  • map(array; key to return; key to filter by; values to match) returns the matching values, and first() takes the single answer.
  • The label must match exactly, so Services picks the main checkbox entry and not Services (Website).
  • Change a question's label in Tally and the mapping returns empty. Keep labels stable, or filter by key instead.
  • The paths above are for the Custom webhook (1.data.fields). With the Tally app trigger, pick the fields list from the mapping panel instead of typing the path, because the structure can be shorter.

Other columns:

  • Submitted at: {{formatDate(1.data.createdAt; "YYYY-MM-DD HH:mm"; "Europe/London")}}. Use your own time zone.
  • Response ID: {{1.data.responseId}}

Step 5: Multi-choice and file-upload fields

Multi-choice, checkboxes, dropdowns. The value is a list of option IDs, and the readable text sits in options.

To keep the formula readable, add Tools → Set multiple variables before Add a Row (1 credit):

services_ids:   {{first(map(1.data.fields; "value"; "label"; "Services"))}}
services_opts:  {{first(map(1.data.fields; "options"; "label"; "Services"))}}

Then map the Services column to the texts of the selected options:

{{join(map(2.services_opts; "text"; "id"; join(2.services_ids; ",")); ", ")}}

The inner join() turns the selected IDs into a comma-separated list, which is what map() expects as its "values to match". The outer join() writes something like Website, Automation into one cell. Test with two options ticked before you go live.

File uploads. The value is a list of file objects, each with id, name, url, mimeType and size. To store the links in one cell:

{{join(map(first(map(1.data.fields; "value"; "label"; "Upload")); "url"); " ")}}

Replace Upload with your question's label. If you want your own copy of each file instead of a link to Tally's storage, add HTTP → Get a file and Google Drive → Upload a file (2 more credits per file). Note that Make's Free plan handles files up to 5 MB.

Step 6: Prevent duplicate rows

Tally retries a webhook delivery if it doesn't get a success response within 10 seconds, so the same submission can occasionally arrive twice. Use the response ID as the unique key.

Option 1: Google Sheets → Search Rows (cheapest)

  1. Before Add a Row, add Google Sheets → Search Rows on the Responses tab. Filter: Response ID column equal to {{1.data.responseId}}. Set Limit to 1.
  2. Know how it behaves: when Search Rows finds nothing, it still outputs one empty bundle with Total number of bundles = 0, and the next module still runs. So "the module returned something" tells you nothing.
  3. Put a filter between Search Rows and Add a Row: Total number of bundles (from Search Rows) Equal to 0 (numeric operator). Alternatively: Row number Does not exist.
  4. A new submission passes the filter and gets a row. A duplicate finds its row (Total number of bundles = 1) and stops at the filter.

Want to see a working version? The free Webhook to Sheets with duplicate check template uses exactly this setup. More on how the empty bundle works: Search Rows returns nothing.

Option 2: a Make data store Add Data store → Check the existence of a record with the response ID as the key, a filter that continues only when the record does not exist, then Add a Row and Data store → Add/replace a record with the same key. It costs one credit more per new submission. The Free plan includes one small data store (1 MB), which is plenty for response IDs.

Step 7: Error handling and switching on

  • In the scenario settings, enable Store incomplete executions. Make then retries temporary errors such as ConnectionError and RateLimitError automatically, and failed runs are saved instead of lost.
  • For other errors on Add a Row, you can attach a Retry error handler (called Break until Make renamed it in May 2026). Error handlers don't use credits.
  • Know the default: the Errors before deactivation setting is ignored for scenarios that start with an instant trigger. Without stored incomplete executions, the first error deactivates the scenario. Check History after go-live either way.
  • If the Google connection fails, see Make Google connection errors.
  • Switch the scenario on.

Credits per run

Make counts one credit per module action; filters, routers and error handlers don't use credits (Make pricing page, checked 2 October 2026):

SetupModules that runCredits per submission
BasicTrigger + Add a Row2
With Set multiple variables for multi-choiceTrigger + Set multiple variables + Add a Row3
With Search Rows dedupe, new submissionTrigger + Search Rows + Add a Row3
With Search Rows dedupe, duplicate (stopped)Trigger + Search Rows2
With data store dedupe, new submissionTrigger + check record + Add a Row + add record4

At 3 credits per submission, the Free plan's 1,000 credits cover roughly 330 submissions a month, as long as nothing else uses them. More on estimating and saving credits: Make credits explained.

Common errors and fixes

ProblemLikely causeFix
Scenario never runsWebhook URL wrong, or scenario offRe-copy the URL into Tally; switch the scenario on
Empty cells for some answersQuestion label changed in TallyUpdate the label in map(), or map by key
Multi-choice shows IDsValues are option IDsMap IDs to option texts with map() (step 5)
File cell emptyWrong field label or structureCheck the field in the output bubble
Duplicate rowsWebhook delivered twice, or dedupe filter checks the wrong thingFilter on Total number of bundles = 0 (step 6)
Data in the wrong columnsColumns inserted in the sheetKeep the column order; remap
403/404 from Google SheetsWrong account or file accessCheck the connection and file sharing

More error types: Make error cheat sheet.

FAQ

Does Tally have a Make integration?
Yes. Make has a Tally app with an instant Watch New Responses trigger, and you can also send a Tally webhook to a Make custom webhook. Both run as soon as a form is submitted.
How do I map Tally answers to columns?
Tally sends answers as a list of fields. Use map() with the question label, e.g. first(map(fields; "value"; "label"; "Email")), and keep labels stable.
Why do multi-choice answers show IDs instead of text?
Tally sends the selected options as option IDs, with the option texts in a separate options list. Use map() to turn the selected IDs into their texts, then join them into one cell.
How do I stop duplicate rows?
Store the Tally response ID in its own column. Before Add a Row, search for it with Google Sheets Search Rows and only add the row when Total number of bundles is 0. Search Rows outputs one empty bundle when it finds nothing, so don't rely on it returning nothing.
How many Make credits does each submission use?
About 2 for the trigger plus Add a Row, and 3 with a Search Rows duplicate check. Make counts one credit per module action; filters don't use credits.

Tally scenario not working?

Send the exported blueprint and a fictional test submission to our Make scenario fix service on Fiverr. No logins needed.

Stuck on an error in your own Make scenario? Make scenario fix / debugging on Fiverr, from $25: send the exported blueprint and a description of the error, no logins needed.

← All guides · All templates

Make, Tally, Google and Google Sheets are trademarks of their owners. Flowpaja is independent and not affiliated with or endorsed by them. Menus and features change; check the providers' current help.