WooCommerce → Google Sheets Sync Diagnostic Checklist
Use this when WooCommerce order webhooks are supposed to land in Google Sheets (often via Apps Script) but something fails: no payload, no row update, wrong fields, duplicates, or missing history. Work the decision path that matches what you observe. This page does not connect to your store or Google account.
Privacy: no email signup, no analytics, no cookies, no external APIs. Do not paste credentials, tokens, customer PII, or full order payloads into notes you share publicly.
No payload arrives
WooCommerce never successfully delivers (or never attempts) a webhook body to your receiver URL.
1. Webhook enabled?
WooCommerce → Settings → Advanced → Webhooks. Status must be Active (not Disabled / Paused). Topic typically Order created / Order updated / Order restored as required.
2. Delivery URL correct?
Delivery URL must be the live Apps Script /web app (or other receiver) URL — usually ends with /exec, not /dev. No typos, no forgotten query token, HTTPS only. A wrong URL often still logs delivery attempts with 404/403.
3. WooCommerce delivery status / logs
Open the webhook → Delivery history (or Logs). Look for recent attempts after a test order. Empty history after placing an order usually means the webhook is inactive, wrong topic, or events are not firing (caching / staging / order created offline).
4. HTTP response / error from receiver
Note the HTTP code: 200/2xx = receiver answered; 401/403 = auth or deployment access; 404 = wrong URL/version; 500 = script crash; timeout = script hung or cold start. Copy status + first line of response body into the template (no secrets).
5. Payload arriving vs not (external check)
Temporarily point the webhook at a throwaway request bin you control, or use an offline payload paste tester. If the bin never sees POST bodies, the problem is still on the WooCommerce / hosting / firewall side — not Sheets.
6. Hosting / security blockers
Some hosts, WAFs, or “disable REST” plugins block outbound webhook POSTs. Check failed cron, Action Scheduler, and firewall logs around the order time.
Payload arrives but Sheet does not update
Delivery history shows 2xx (or your bin received JSON), yet no new row appears in the spreadsheet.
1. Apps Script deployment / version
Confirm you are hitting the deployed web app URL for the version that contains your latest doPost. Editing the script without a new deployment leaves the old /exec behaviour unchanged. Prefer “New deployment” or update the existing deployment after edits.
2. Authorization / who has access
Web app execute-as and access settings matter. Common mistakes: “Only myself” while WooCommerce is an unauthenticated caller; wrong Google account; revoked token; forgotten URL secret/query token check that rejects the POST before writing.
3. Script errors after HTTP 200
Some receivers return 200 then fail on SpreadsheetApp writes. Open Apps Script → Executions. Look for failed runs at the delivery timestamp. Fix missing sheet name, wrong spreadsheet ID, or permission to the target file.
4. Wrong spreadsheet / tab
Verify spreadsheet ID and tab/sheet name in script properties. Orders may be writing to a different file or a hidden sheet.
5. Filters / frozen views
Sheet filter views can hide new rows. Clear filters; scroll to the bottom; check for rows beyond the visible range.
Rows appear but data is wrong
Something lands in the sheet, but fields, dates, refunds, or cell safety look incorrect.
1. Expected order fields
Compare a known test order against columns you expect (e.g. order id, status, total, currency, billing email, line items, dates). Missing nested fields often mean the mapper assumes a different WooCommerce payload shape (REST vs webhook topic version).
2. Timezone / date mismatches
WooCommerce store timezone, UTC in JSON, and the spreadsheet locale/timezone can disagree. Check whether you store raw ISO timestamps vs formatted local times. Align on one canonical timezone in documentation and conversion code.
3. Refund handling
Decide: separate refund rows, status overwrite, or net-total update? A create-only webhook will not reflect refunds. Confirm whether Order updated / refund topics are subscribed and how your upsert key behaves on status changes.
4. Spreadsheet formula-risk
Customer-controlled strings (names, notes, SKUs) that start with =, +, -, or @ can become formulas when opened in Sheets/Excel. Prefer prefixing risky cells with a safe marker (e.g. leading apostrophe / tab) or validating before write.
WooCommerce product CSV causing import problems?
I can check and prepare one product CSV (up to 2,000 rows) for £69
— deliverables: import-ready.csv + preflight report (original file untouched).
See WooCommerce Product CSV Import Safety Pass.
5. Number / locale formatting
Totals as text vs number, decimal commas vs points, and currency symbols in numeric columns break sums. Keep raw numbers in data columns; format in the sheet UI.
Duplicates / missing historical orders
Live webhooks may work while history gaps or repeated rows remain.
1. Duplicate orders
Causes: webhook retried after timeout; both created + updated topics appending; missing upsert on order id; manual re-delivery. Prefer idempotent writes keyed by WooCommerce order id (update-or-insert), and log delivery IDs when available.
2. Missing rows for recent orders
Check delivery history for those order IDs, script executions, and whether filters hide them. Confirm the webhook was Active at order time (not only now).
3. Missing historical orders (before webhook existed)
Webhooks do not backfill. You need a one-off reconciliation/backfill from WooCommerce REST (or exports) into the same sheet schema, then keep webhooks for ongoing sync.
4. Reconciliation / backfill need
Symptoms: sheet count ≪ store order count for a date range; gaps after outages; status drift. Plan: export or API-list orders for the window, upsert by order id, mark backfill source, then re-enable live webhooks.
Copyable diagnostic template
Fill this for yourself or a colleague. Omit credentials, tokens, customer names, emails, addresses, and full payloads.
WooCommerce → Sheets sync diagnostic Date (local): Store timezone: Sheet timezone/locale: Symptom path (1–4): [ ] 1 No payload arrives [ ] 2 Payload arrives, Sheet does not update [ ] 3 Rows appear, data wrong [ ] 4 Duplicates / missing historical orders Webhook Status (Active/Disabled): Topic(s): Delivery URL host only (no token): Recent delivery HTTP code: Recent delivery error (one line, no secrets): Receiver Type (Apps Script / other): Deployment is /exec (Y/N): Access setting (summary): Script execution at delivery time (OK/Fail/None): Spreadsheet ID last-4 only: Tab name: Data checks (if rows exist) Sample order id (numeric only): Expected fields missing: Date/timezone mismatch (Y/N / note): Refund handling expected: Formula-risk cells seen (Y/N): Duplicate order ids seen (Y/N / count): History gap date range: Next action:
Need a tool?
This checklist is free and complete on its own. If you want offline helpers or an implementation starting point (buyer-hosted — not a QuietForgeTools-managed sync), these existing products are available:
£5 WooCommerce → Sheets Webhook Tester — Offline browser utility to paste WooCommerce-like order webhook JSON, validate it, preview sheet-style rows, export CSV, and flag missing fields / formula risks. Does not send webhooks or write to Sheets.
£19 WooCommerce → Google Sheets Sync Toolkit — Apps Script webhook receiver + Python backfill/reconcile starting point. Synthetic-tested offline. Not a hosted managed integration — you configure your own WooCommerce + Google.
£24 WooCommerce → Google Sheets Starter Bundle — Pack including the Webhook Tester, Sync Toolkit, and related CSV diagnostics at a discount versus buying separately. Not a hosted service.
Buying is optional. The four paths and template above remain useful without any purchase. Not affiliated with WooCommerce, Automattic, or Google.