DEV Community

Alexandr M.
Alexandr M.

Posted on Originally published at shopify.ecom-store.pro

Can you use a Google Sheet as a Shopify webhook URL? What has to sit in between

If you want Shopify events to land in a Google Sheet, the webhook URL field looks like the obvious place to paste a spreadsheet link. It is not that simple: each event arrives as a request that something has to receive and answer first. This post covers the two receivers that work (a connector or an Apps Script web app), the response-code trap with Apps Script, and the Shopify Flow route that skips the webhook entirely. Everything below was checked against the Shopify and Google pages linked inline, read September 25, 2026.

Short answer

Not directly. Route the event through a connector that writes the row (Zapier on paid plans, Make or n8n) or a Google Apps Script web app you test first. On Basic, Grow, Advanced or Plus, Flow's own Add row to spreadsheet action writes the row without a webhook URL.

Caveats at a glance:

  • Zapier's webhook trigger. Webhooks by Zapier isn't available on Zapier's Free plan.
  • Apps Script replies. A TextOutput reply from Apps Script is a redirect, not a 200; test that the admin webhook survives.
  • A receiver that keeps failing. Repeated non-200 responses get the admin webhook subscription deleted automatically.
  • Flow's own Sheets action. On Basic, Grow, Advanced or Plus, Flow's Add row to spreadsheet action writes the row without a webhook URL.
  • Flow's Send HTTP request. It needs Shopify Plus, Advanced or Grow; it counts 2XX or 3XX as success.
  • Self-hosted n8n. Shopify lists localhost among the URLs webhooks can't be returned to.

What a Shopify webhook needs at the other end

An admin webhook is created under Settings > Notifications > Webhooks: you pick an event, a format (JSON or XML) and a URL. The Shopify Help Center tells you to enter the URL "where you want data to be stored", which is why a spreadsheet link looks like the right answer. Shopify then sends the event's data to that address, so something there has to take the request.

None of the Google pages read for this post describes a spreadsheet taking an incoming webhook by itself (see the boundaries at the end). Google calls the Sheets API "a RESTful interface that lets you read and modify a spreadsheet's data", which is a way for code to work with the sheet. An Apps Script web app can accept an incoming request through its doPost function, so the sheet sits at the end of the route, behind a go-between.

The no-code route: a connector that writes the row

Zapier documents both halves. A Zap with a webhook trigger gets "a brand new URL for your use" from Webhooks by Zapier; you paste it into Shopify's URL field, and it triggers on a POST, PUT or GET request. The Zapier Google Sheets action Create Spreadsheet Row adds the row, and Create Multiple Spreadsheet Rows handles line items.

Webhooks by Zapier isn't available on Zapier's Free plan, only on Professional, Team and Enterprise.

Make and n8n cover both halves too. Make's custom webhooks "allow you to create a URL to which you can send any data", and its Google Sheets module has an Add a Row action that "Appends a new row to the bottom of the table." n8n's Webhook node can "receive data from apps and services when an event occurs", and its built-in Google Sheets node has an Append Row operation that creates a new row.

If you self-host n8n, keep it off your own machine's address: Shopify lists localhost among the URLs webhooks can't be returned to.

The build-it route: a Google Apps Script web app

If you would rather write a little code than add another service, deploy an Apps Script project as a web app. It gets its own URL, and Google's web apps guide describes what runs when a request arrives:

"When a program sends the app an HTTP POST request, Apps Script runs doPost instead."

Google for Developers, Apps Script web apps guide, read September 25, 2026

The request body reaches the function through its e parameter, in e.postData.contents, and doPost has to return an HtmlOutput or TextOutput object. Writing the row is a separate step with Apps Script's spreadsheet service; none of the Apps Script guides read for this post pairs doPost with SpreadsheetApp.appendRow, so expect to combine the web apps guide with Apps Script's Sheets guide.

Choose Execute the app as me so the script writes as you, and open access to anyone, signed in or not. Google's deployment reference calls that access level ANYONE_ANONYMOUS, "Any user, logged in or not". It is the only one of its access levels that doesn't require a login; the level named ANYONE means "Any logged in user".

Then test before you rely on it. Google says content returned by its Content service "is redirected to a one-time URL at script.googleusercontent.com", so a TextOutput reply is a redirect, not a 200. For app webhooks, Shopify's developer docs treat "any response outside the 200 range, including 3XX codes" as an error.

The admin webhook page read for this post says nothing about redirects, but it does say a destination that repeatedly returns a non-200 status gets the subscription automatically deleted. Place a test order, then check that the row appeared, then look for the webhook again after later orders. Shopify removes a failing webhook without an email.

Does Shopify Flow change the answer?

It adds a route with no webhook at all. Flow's Add row to spreadsheet action "adds a single row of data to a Google Sheets spreadsheet": Flow calls the Google Sheets API itself. You connect Flow to a Google account with edit access to the sheet first, and the action works with any trigger. Flow itself is a free app on the Basic, Grow, Advanced and Plus plans.

Flow's Send HTTP request action changes the sender, not the receiver: its URL field is simply "The URL of the server to which the HTTP request is sent.", so the other end is still a connector trigger or an Apps Script web app. Send HTTP request is only available on the Shopify Plus, Advanced or Grow plans.

What Send HTTP request does change is the success rule. Flow marks a request as a success on a 2XX or 3XX response; on 4XX, 5XX and 429 errors it does what you configured: retry for up to 24 hours, fail the run, or ignore the error.

Set beside the redirect above, the Send HTTP request page doesn't say whether Flow follows a redirect. Whether a Send HTTP request wrote the row is still yours to confirm, and a failed request shows up in Flow's run log, where you can retry the run.

What was looked for and not found

Read September 25, 2026.

  • A spreadsheet receiving a webhook by itself: Google's Sheets API concepts, values and authorizing guides, the Apps Script web apps and quotas pages, and the Google Sheets product page.
  • One page pairing doPost with appendRow: the Apps Script Sheets, web apps and triggers guides, and the Apps Script product page.
  • Redirects: Shopify's Help Center pages on admin webhooks and Flow's Send HTTP request.

Originally published at shopify.ecom-store.pro.

Disclosure: this article is AI-generated.

Top comments (0)