Skip to content

How to send webhook data to Google Sheets (without Apps Script)

Turn every incoming webhook into a new row in Google Sheets: get a webhook URL, match the fields to your columns, and see every request. No Apps Script.

Updated

Lots of tools can send a webhook: payment providers, form builders, monitoring tools, trading alerts, your own code. Getting that data into a Google Sheet usually means writing an Apps Script, deploying it as a web app and debugging it when Google changes something. This guide does it without code: a webhook comes in, and each one becomes a new row.

  1. Trigger

    When a webhook is received

    Foliot gives you a URL. Anything POSTed to it starts a run.
  2. Step 1

    Add row to Google Sheets

    Email Trigger → email, Name Trigger → name
The workflow you'll build: two tiles, no code.

Before you start

  • A Foliot account. The free plan is enough to build and test this.
  • A Google account that can edit the spreadsheet.
  • A spreadsheet with column headers in row 1, for example Received, Email, Name, Plan. Foliot fills each new row by matching these headers, so you can reorder columns later without breaking anything.
  • Something that sends the webhook. To test, you can use curl or any HTTP client.

Set it up

1. Create the workflow and pick the webhook trigger

In Foliot, create a new workflow and choose When a webhook is received as its trigger. You get a webhook URL that looks like https://usefoliot.com/api/hooks/…. Copy it into the app that sends the webhook. Keep it private: anyone with the URL can start the workflow.

2. Send one sample request

While the workflow is off, requests to the URL don't run anything. They're saved as sample data, so you can see exactly what the sender delivers and pick fields from it. Click Get sample data, then trigger a test from your app, or send one yourself:

curl -X POST https://usefoliot.com/api/hooks/YOUR-TOKEN \
  -H "Content-Type: application/json" \
  -d '{"email": "ada@example.com", "name": "Ada", "plan": "pro"}'

Foliot accepts JSON, form-encoded and plain-text bodies up to 256 KB. The run's data looks like this, with the body under body, plus the query string, headers and the time it arrived:

{
  "method": "POST",
  "query": {},
  "headers": { "content-type": "application/json", … },
  "body": { "email": "ada@example.com", "name": "Ada", "plan": "pro" },
  "receivedAt": "2026-10-15T09:41:00.000Z"
}

3. Add the Google Sheets step

Click + after the trigger and choose Add row to Google Sheets. Then:

  1. Under Google account, connect your Google account. Foliot only asks for access to files you pick, not your whole Drive.
  2. Paste the spreadsheet's link and click Load sheet, or use Browse your Drive. Google's file picker opens so you can give Foliot that one file.
  3. Choose the tab. Foliot reads row 1 and shows one field per column header.
  4. Fill each column with data from the webhook. Click the data button next to a field and pick, say, Trigger → email for Email and Trigger → receivedAt for Received. Leave a column empty to skip it.

4. Test the step, then turn the workflow on

Test this step runs it for real with the sample, so a row appears in your sheet straight away. If it looks right, switch the workflow on. From then on, every request to the URL adds a row, usually within a few seconds. The sender gets a 202 response right away, and the run happens in the background.

Useful variations

Only add some webhooks

Put a Filter step before the sheet: “Only continue if Trigger → plan is pro”. Webhooks that don't match end as “Filtered out” instead of adding a row.

One row per item in a list

If the webhook carries a list, like the line items of an order, use For each on that list and put the sheet step inside the loop. Each item becomes its own row (up to 100 items per run).

Clean the data first

A Code step can reshape a value before it reaches the sheet: join a first and last name, convert cents to dollars, or pick one field out of a nested object. It's a few lines of JavaScript that return the new value.

Tell someone too

Add Post to Slack or Send email after the sheet step, so the team sees new rows as they arrive.

Good to know

  • Values are entered as if you typed them, so numbers and dates become real numbers and dates. Anything that would start a formula (like =…) is stored as plain text, so webhook data can never run a formula in your sheet.
  • The step always appends a new row. It doesn't look up or update existing rows.
  • The webhook URL accepts POST requests, up to 60 a minute per workflow. Each request is one run. The free plan includes 500 runs a month; Pro includes 10,000 for $12 a month.
  • The sender gets a fixed 202 reply with the run's ID. You can't customize the response, so this suits fire-and-forget webhooks, not APIs that expect an answer.

The other way: Google Apps Script

If you'd rather not use another tool, Google Sheets can receive webhooks itself. You write a doPost(e) function in Apps Script, parse the body, append the row, and deploy the script as a web app that anyone can call. It's free and fully under your control. The trade-offs: you maintain the code, each change needs a new deployment, and there's no run history, retries or failure alert unless you build them. If that sounds fine, it's a good option. If you'd rather point and click, use the workflow above.

Questions

Can Google Sheets receive a webhook directly?

Not on its own. You either write a Google Apps Script with a doPost function and deploy it as a web app, or use a tool that gives you a webhook URL and adds the rows for you, like the Foliot workflow in this guide.

Does the spreadsheet need a header row?

Yes. Foliot reads row 1 and matches each value to a column by its header, so the columns can be in any order and you can rearrange them later.

What format does the webhook have to be in?

A POST request with a JSON, form-encoded or plain-text body of up to 256 KB. JSON fields can be nested; you pick them with the data picker.

Is it free?

Foliot's free plan includes 500 runs a month and 5 active workflows. Each incoming webhook is one run, however many steps the workflow has. Pro is $12 a month for 10,000 runs.