TL;DR: Every time a new order lands in your Shopify store, this n8n workflow automatically appends a row to a Google Sheet — order ID, customer name, email, total, item count, fulfillment status, and timestamp included. No Shopify Plus required, no Zapier subscription needed. Works on any Shopify plan, takes under 20 minutes to build, and runs in real time.
What this workflow does
Shopify has a built-in order export, but it’s a manual pull. You have to remember to do it, download a CSV, and then copy data somewhere useful. That works until it doesn’t — and it usually breaks the moment your team grows past one person or you start running daily reporting.
This n8n Shopify automation replaces that manual export loop entirely. The moment an order is created in Shopify, a webhook fires to your n8n instance. n8n picks it up, maps the fields you care about, and appends a new row to your designated Google Sheet — all in under two seconds, with zero human involvement.
The resulting sheet becomes a live order log your team can filter, sort, and build dashboards from without ever opening Shopify admin.
Why it beats Shopify’s built-in options
Shopify offers three native paths for this kind of data sync: manual CSV export, Shopify Flow, and third-party apps from the App Store.
Manual export is exactly what it sounds like — a recurring human task that gets skipped when things get busy. Shopify Flow is genuinely powerful, but it’s locked to Shopify Plus, which starts at $2,300 per month. App Store solutions like “Orders to Sheets” or similar connectors typically cost $9–$25 per month per store, push data on a delay rather than in real time, and give you no control over what fields get synced.
n8n costs nothing extra if you’re already self-hosting — one flat VPS bill, unlimited executions. It runs on any Shopify plan. And unlike any App Store app, you can extend the same workflow later: add a Slack alert for high-value orders, trigger a follow-up email sequence via Gmail, or feed the same data into Airtable — all from within the workflow you’re already running.
What you need before you start
You will need a working n8n instance (self-hosted or n8n cloud), a Shopify store with API access enabled, and a Google account. More specifically: an n8n credential for Shopify (a Private App API key works fine), a Google Sheets OAuth2 credential inside n8n, a Google Sheet created in advance with your column headers in row 1, and a Shopify store on any plan — Basic, Grow, and Plus all work.
If you are not yet running n8n, our n8n setup and installation service gets your instance live and fully configured in under 24 hours.
Node-by-node breakdown
The core workflow uses four nodes. Here is what each one does and why it is there.
Shopify Trigger — the entry point. This node registers a webhook directly on your Shopify store for the orders/create event. Every time a new order is placed, Shopify sends the full order payload to n8n automatically. No polling, no cron schedule, no delay.
IF node (optional but recommended) — a filter gate. By default, Shopify fires the orders/create event for all orders, including test orders and orders with a pending payment status. The IF node checks that financial_status equals paid before passing the order downstream. Anything that does not match exits through the false branch and nothing is written to the sheet.
Set node — the field mapper. Shopify’s order payload contains dozens of nested fields. The Set node lets you extract exactly what you want — order ID, customer name, email, total price, line item count, fulfillment status, created_at timestamp — and give each field a clean, predictable name that matches your Google Sheet headers. This keeps the Google Sheets node straightforward and makes the workflow readable six months from now.
Google Sheets (Append Row) — the destination. This node takes the mapped fields from the Set node and appends them as a new row at the bottom of your target sheet. Operation is set to Append Row. You map each field from the Set node to the corresponding column. That is the full workflow.
Step-by-step build
- Prepare your Google Sheet. Create a new spreadsheet (or a new tab in an existing one). Add these column headers in row 1: Order ID, Customer Name, Email, Total (USD), Items, Financial Status, Fulfillment Status, Created At. You can add or remove columns — just make sure the Set node maps to the same names you use here.
- Add and configure the Shopify Trigger node. In n8n, create a new workflow and add a Shopify Trigger node. Select the
orders/createevent. If you have not already created a Shopify credential, go to your Shopify admin, navigate to Settings → Apps → Develop apps → Create an app, and give it read access for Orders. Paste the API key and secret into the n8n credential form. Once the credential is saved, n8n registers the webhook in Shopify automatically when you activate the workflow. - Add an IF node to filter by payment status. Drag an IF node onto the canvas and connect it to the Shopify Trigger. Set one condition: value 1 is
{{ $json.financial_status }}, operation is Equal To (string), value 2 ispaid. The true branch continues to the Set node. The false branch does nothing. Skip this step only if you want every order logged regardless of payment status. - Add a Set node to map fields. Connect a Set node to the true branch of the IF node. Add one assignment for each column you want to populate. Useful expressions: Order ID →
{{ $json.id }}, Customer Name →{{ $json.customer.first_name }} {{ $json.customer.last_name }}, Email →{{ $json.customer.email }}, Total →{{ $json.total_price }}, Items →{{ $json.line_items.length }}, Financial Status →{{ $json.financial_status }}, Fulfillment Status →{{ $json.fulfillment_status ?? 'unfulfilled' }}, Created At →{{ $json.created_at }}. - Add the Google Sheets node. Connect a Google Sheets node to the Set node. Set the operation to Append Row. If you have not yet created a Google Sheets credential, click Connect, sign in with your Google account, and authorize the Sheets scope — it takes about 90 seconds. Select your spreadsheet and the target tab. In the column mapping section, match each field name from your Set node to the corresponding header in your sheet.
- Test the workflow. Click “Test workflow” in n8n to put it into listening mode. Then open your Shopify admin, go to Settings → Payments → Manage, and enable the Bogus Gateway for testing. Place a test order. Return to n8n — you should see green checkmarks on all nodes. Open your Google Sheet and confirm the new row is there with the correct data.
- Activate the workflow. Toggle the workflow to Active. n8n will now process every incoming order automatically. The test order row will remain in your sheet — delete it manually if needed before going live.
Common mistakes
The most common issue is credential scope. When you create a Shopify Private App, read access for Orders is not enabled by default — you have to set it explicitly. If the Shopify Trigger fires but returns an authorization error, go back to your private app in Shopify admin and confirm that Orders is set to Read access, then save and regenerate your API key.
The second common issue is the null fulfillment status. Shopify returns null for orders that have not yet been fulfilled — not an empty string, but an actual null value. If you try to display or filter on this column in Sheets, you will get an empty cell. Use {{ $json.fulfillment_status ?? 'unfulfilled' }} in the Set node to normalize null to a readable string.
Third: column header mismatch. If the field names in your Set node do not exactly match the header row in your Google Sheet, the Append Row operation will create new columns on the right instead of populating the correct ones. Double-check spelling and capitalization — they must be identical.
Fourth: test orders polluting your live data. Shopify test orders fire real webhooks. Either add a second IF condition checking that {{ $json.test }} is false, or point your workflow to a staging sheet during development and switch it to your production sheet before activating.
Cost at realistic volume
At 100 orders per day, this workflow executes 100 times daily — roughly 3,100 executions per month. On n8n cloud’s Starter plan (€20/month, 2,500 executions included) you would need to upgrade. On self-hosted n8n, executions are unlimited; your only cost is the VPS, which typically runs €5–€15 per month depending on provider and region.
Google Sheets is free up to 10 million cells per spreadsheet. At one row per order and eight columns, 100 orders per day gives you 800 cells per day — you could run this workflow for 34 years before hitting the limit. Cost is effectively zero.
Compare this to a $15/month App Store connector that syncs on a 15-minute delay with no field customization. n8n wins on cost, wins on latency, and wins on flexibility.
Get the ready-to-import template
You can build this workflow from scratch using the steps above, or skip the setup and download the pre-built JSON template from the store. Import it into n8n in two clicks, connect your Shopify and Google Sheets credentials, point it at your sheet, and you are live.
Browse the full template library at easyworkflows.net/downloads. If you would rather have someone handle the full deployment — including credentials setup, testing, and a walkthrough — our n8n installation and setup service covers it end to end.
FAQ
Does this workflow work on all Shopify plans?
Yes. The n8n Shopify Trigger uses webhooks, which are available on every Shopify plan including Basic. You do not need Shopify Plus or Shopify Flow to use this workflow — it runs identically on a $39/month Basic store.
What Google Sheets permissions does n8n need?
n8n needs OAuth2 access to your Google account with the Sheets scope (spreadsheets.readwrite). You grant this once when creating the Google Sheets credential inside n8n. No service account, no JSON key file, no Google Cloud Console setup required for basic use.
Can I sync order line items individually instead of just the order total?
Yes. Shopify includes a line_items array in the webhook payload. Add a Loop Over Items node after the Set node to iterate over each product in the order, writing one Google Sheets row per line item. This gives you SKU-level tracking with product name, variant, quantity, and price per row.
Will this handle high order volume without hitting Google Sheets rate limits?
Google Sheets allows 300 write requests per minute per project. At up to 5 orders per minute you are well within that ceiling. For stores processing higher burst volumes, consider batching writes using n8n’s aggregator nodes, or switch to a higher-throughput destination like Google BigQuery for large-scale order analytics.
Can I filter so only paid orders are synced to Google Sheets?
Yes. Add an IF node after the Shopify Trigger and check that financial_status equals paid. Orders with any other status — pending, refunded, or voided — will exit through the false branch and will not appear in your sheet. You can add additional conditions in the same IF node to filter by order value, product tag, or any other field in the payload.
Related guides
If this walkthrough was useful, check out the rest of the collection in our Shopify automation category. We cover inventory low-stock alerts, AI product description generation, new customer welcome emails, and more — all built with n8n, all using the same tool stack.