- Short answer
- Not directly: route it through a connector that writes the row — Zapier (paid plans), Make or n8n — or a Google Apps Script web app you test first.
- 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
- Send HTTP request 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 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 we read describes a spreadsheet taking an incoming webhook by itself (boundaries at the end of this page). Google calls the Sheets API "a RESTful interface that lets you read and modify a spreadsheet's data" — 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 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.
Which connector fits your store, and what each bills you per run, is covered in our comparison of Flow, Zapier, Make and n8n. 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 guide describes what runs when a request arrives:
When a program sends the app an HTTP POST request, Apps Script runs doPost instead.
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 we read, listed at the end of this page, 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" — 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 we read 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.
This article was written entirely by AI under human editorial direction. The editor sets the topic and structure, runs multi-stage validation on facts, links, and interactive elements, and verifies the output is useful from a business perspective. All claims are checked against official Shopify sources. Details may change — always confirm critical data at shopify.com.
Editorial Policy