WooCommerce + Google Sheets: orders logged clean
New orders shouldn’t feel like a scavenger hunt. But in a lot of WooCommerce stores, someone still copies details into a spreadsheet, pings the team, and hopes inventory is right.
This WooCommerce Sheets automation hits ops managers hardest, because they live in the gap between “order placed” and “order shipped.” Store owners feel it too. So do fulfillment leads who need clean handoffs, not more messages to chase.
This workflow logs every order to Google Sheets, checks stock, emails the customer, and alerts your team in Slack. You’ll see how it works, what you need, and where people usually get stuck.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: WooCommerce + Google Sheets: orders logged clean
flowchart LR
subgraph sg0["Scheduled Order Sync1 Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>WooCommerce Order Webhook1"]
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Order Sync1", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge Triggers1"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract Order Data1"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Order Items1", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Check Inventory1"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Inventory Results1", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Process Order Logic1"]
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Fulfillment Status1", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Send Customer Confirmation1", pos: "b", h: 48 }
n10@{ icon: "mdi:message-outline", form: "rounded", label: "Send Backorder Notice1", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Notify Fulfillment Team1"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Backorder Alert1"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge Processing Paths1"]
n14@{ icon: "mdi:database", form: "rounded", label: "Log Order to Sheets1", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook1"]
n2 --> n3
n12 --> n13
n5 --> n6
n4 --> n5
n3 --> n4
n14 --> n15
n7 --> n8
n1 --> n2
n10 --> n13
n13 --> n14
n11 --> n13
n8 --> n9
n8 --> n11
n8 --> n10
n8 --> n12
n0 --> n2
n9 --> n13
n6 --> n7
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n1 trigger
class n8 decision
class n14 database
class n0,n15 api
class n3,n5,n7 code
classDef customIcon fill:none,stroke:none
class n0,n2,n3,n5,n7,n11,n12,n13,n15 customIcon
The Challenge: Orders Move Faster Than Your Ops
When orders come in, the work starts immediately. Someone has to confirm stock, tell the warehouse what to pick, update a tracker, and reassure the customer. If that “someone” is a human doing it all manually, the weak points show up fast: missed Slack messages, wrong quantities, and messy spreadsheets that nobody trusts. It’s also mentally exhausting, because you’re constantly context-switching between WooCommerce, email, and whatever sheet your team uses to stay sane. And if you sell across channels, it gets worse.
It adds up fast. Here’s where it usually breaks down.
- Orders get acknowledged late, so customers email you first instead of the other way around.
- Inventory checks happen after the fact, which means you discover backorders when the picker is already holding the slip.
- Copy-pasting order details into Google Sheets introduces small errors that turn into big fulfillment mistakes.
- Team updates live in DMs or scattered channels, so there’s no reliable “single source of truth” for the day.
The Fix: Automatic Logging + Stock-Aware Alerts
This workflow creates an order pipeline that behaves like a dependable ops assistant. The moment a WooCommerce order is created, it can trigger instantly via webhook, or you can run an hourly sync on a schedule (useful when webhooks are flaky or you want a backstop). It then parses the raw WooCommerce order data into a clean structure, splits the line items, and checks each item’s stock status. Once it knows what’s actually available, it applies your fulfillment rules to mark the order as ready or backordered. From there, customers get the right email automatically, the right internal Slack channel gets notified, and the order is appended to Google Sheets for tracking and analytics.
The workflow starts with either a real-time WooCommerce webhook or a timed sync. Then it cleans and evaluates the order, including inventory validation for each line item. Finally, it sends the correct emails and Slack alerts, then logs the final outcome to Google Sheets so you can report on it later.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you average 25 orders a day. Manually, it’s common to spend about 3 minutes per order copying details to Google Sheets, checking stock, and notifying the right Slack channel, which is roughly 75 minutes daily. With this workflow, you do almost none of that: the trigger is instant (or hourly if you prefer), and the rest runs in the background while the team just reacts to clear Slack alerts. That’s about an hour back most days, plus fewer messy “oops” moments when something is backordered.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- WooCommerce to trigger and fetch order data.
- Google Sheets to store a clean order log.
- Slack to alert fulfillment and inventory channels.
- Gmail to send customer emails automatically.
Skill level: Intermediate. You’ll connect accounts, map a few fields, and confirm your Slack channels and Sheet headers match.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Order comes in (or sync runs). A WooCommerce webhook can fire in real time when an order is created, and there’s also a scheduled trigger for an hourly catch-up run.
The order gets cleaned up. Raw WooCommerce JSON is parsed into a tidy format your team can use, then line items are split so each SKU can be evaluated properly.
Stock and fulfillment rules are applied. The workflow checks inventory, summarizes the result, then computes fulfillment logic to decide “Ready” versus “Backordered” (including shipping priority if you want to expand it).
Messages go out and the order is logged. Customers receive the correct Gmail message, your team gets a Slack alert in the right channel, and Google Sheets receives a new row for long-term tracking. A webhook response is returned to close the loop.
You can easily modify the inventory lookup to use your real stock source (ERP, warehouse system, or even another sheet) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the incoming order webhook and the scheduled trigger so orders can arrive in real time or on a timed sync.
- Add and open Incoming Order Hook, then set HTTP Method to
POSTand Path towoo-new-order. - Set Response Mode to
responseNodeso the webhook replies using Return Webhook Reply. - Add and open Timed Order Sync, and keep the interval rule to run every hour (
hours). - Connect both Incoming Order Hook and Timed Order Sync into Combine Trigger Paths (mode
chooseBranch).
Step 2: Connect Google Sheets
Store each processed order by appending a row to a Google Sheet.
- Open Append Order to Sheets and set Operation to
append. - Select the destination Document and Sheet Name (both are currently empty).
- Credential Required: Connect your Google Sheets credentials.
Step 3: Set Up Processing Nodes
Parse the incoming payload, split items, check inventory, and compute fulfillment decisions.
- In Parse Order Details, keep the provided JavaScript that maps line items and customer data from the webhook body.
- In Split Line Items, set Field To Split Out to
items. - In Verify Stock Levels, confirm the JS code returns
isInStock: trueandstockStatus: 'available'. - In Summarize Stock Results, keep Aggregate set to
aggregateAllItemData. - In Compute Fulfillment Rules, keep the code that merges Parse Order Details output and sets fulfillment fields (UPS Ground, 3–5 days).
- In Evaluate Fulfillment Status, set the condition to Boolean Equals with Left Value
{{ $json.inventory.allInStock }}and Right Valuetrue.
Step 4: Configure Output and Routing Nodes
Send email and Slack notifications based on fulfillment status, then merge branches and log to Sheets.
- Configure Email Order Confirmation with Send To
{{ $json.customer.email }}, SubjectOrder Confirmed, and MessageThank you!. - Configure Dispatch Backorder Email with Send To
{{ $json.customer.email }}, SubjectBackorder notice, and MessageSome items are on backorder.. - Set Slack Fulfillment Alert to send Text
New Order!. - Set Slack Backorder Warning to send Text
Backorder alert!. - Confirm that Evaluate Fulfillment Status outputs to both Email Order Confirmation and Slack Fulfillment Alert in parallel.
- Confirm that the “false” branch of Evaluate Fulfillment Status routes to Dispatch Backorder Email and Slack Backorder Warning.
- Keep Merge Fulfillment Branches in
chooseBranchmode, then connect it to Append Order to Sheets and Return Webhook Reply. - In Return Webhook Reply, set Respond With to
jsonand Response Body to{{ {success: true} }}. - Credential Required: Connect your Gmail credentials for Email Order Confirmation and Dispatch Backorder Email.
- Credential Required: Connect your Slack credentials for Slack Fulfillment Alert and Slack Backorder Warning.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm the webhook response, notifications, and Google Sheets append action.
- Use Incoming Order Hook’s test URL to POST a sample WooCommerce order payload.
- Verify that Parse Order Details outputs
items,customer.email, andtotalfields. - Confirm that the correct branch runs: fulfillment sends Email Order Confirmation and Slack Fulfillment Alert in parallel; backorder sends Dispatch Backorder Email and Slack Backorder Warning.
- Check the Google Sheet to ensure Append Order to Sheets added a new row.
- Verify the webhook response from Return Webhook Reply returns
{"success":true}. - Once verified, toggle the workflow to Active for production use.
Watch Out For
- WooCommerce webhooks can be disabled by plugin changes or site migrations. If orders stop flowing, check WooCommerce → Settings → Advanced → Webhooks and confirm the URL and “Active” status.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About an hour if your accounts are ready.
Yes. You will mostly connect accounts and match a few fields to your Google Sheet headers.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gmail/Slack usage (usually $0 unless you’re on paid plans) and any inventory system API you connect later.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can swap the stock check to match your reality. In this workflow, the inventory logic lives in Verify Stock Levels (currently simulated with code), and the decisioning happens in Compute Fulfillment Rules and Evaluate Fulfillment Status. Common tweaks include routing VIP orders to a different Slack channel, changing the email copy for different shipping expectations, and adding a lookup to Odoo or another ERP before you mark an order “Ready.”
Most of the time it’s credentials or permissions. Re-check the WooCommerce REST API keys, confirm the user role has access, and verify the store URL matches exactly (http vs https matters). If you rely on the webhook trigger, make sure the webhook is still active in WooCommerce and hasn’t been duplicated with an old URL. Rate limits are also a thing on some hosts, especially if the hourly sync pulls a lot of orders at once.
On n8n Cloud Starter you can run a solid volume of workflows for small stores, and higher plans handle more executions. If you self-host, there’s no execution cap from n8n, but your server and API limits become the bottleneck. Practically, this workflow can handle typical “small shop” bursts easily because each order is processed as a single run, then line items are handled inside that run.
Often, yes, because this isn’t just “send order to a sheet.” You’ve got branching (ready vs backordered), line-item iteration, and a few spots where custom logic matters. n8n handles that complexity without turning every conditional path into a pricing problem. Zapier or Make can still work if you keep it simple, but once you add stock rules and multiple notifications, it gets fiddly. Another plus: self-hosting is an option, which can be a big deal when order volume grows. If you want a quick recommendation for your setup, Talk to an automation expert.
Once this is running, orders stop being a daily coordination game. The workflow handles the repetitive updates, and your team spends their time shipping, not translating data between tabs.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.