Automate Your Product Feed With n8n Without Double-Pushing SKUs
Build an n8n product feed automation that syncs Shopify changes to Google Merchant and Meta catalog, with field mapping and a diff log so SKUs never re-push.
A merchandiser edits a price in Shopify. Forty minutes later the Google Shopping ad still shows the old number, the Meta catalog shows a third number, and nobody's sure which feed is stale. Manual feed management always drifts because three systems each think they own the truth.
n8n product feed automation makes the store the single source and pushes only what changed, when it changed, to every channel that needs it. You catch the product event, map it into a clean schema, validate the required attributes, and sync to Google Merchant and Meta catalog without re-pushing the whole catalog or firing duplicate updates.
The workflows ranking for this term today either hard-wire a paid relay like Channable or dump products one-way into a spreadsheet. Neither handles a change-driven, multi-destination sync with a diff guard. That's the gap this build closes.
What a product feed workflow can actually automate
Feed sync is a handful of jobs that only work when you sequence them:
- Catch
products/updateand inventory changes from Shopify or WooCommerce. - Normalize each product into one internal schema so every channel reads the same object.
- Validate required attributes (GTIN, price, availability, image) before any push.
- Diff the product against its last-synced state so unchanged items skip.
- Fan out to Google Merchant Center and Meta catalog with per-channel field mapping.
- Log every push, skip, and rejection to Google Sheets for an audit trail.
That's not a feed export. It's a small sync engine that happens to run in n8n.
Why one-way feed dumps go stale
Here's the take most feed tutorials avoid: a scheduled full-catalog re-push is the lazy pattern, and it costs you. Re-sending 4,000 products every hour when three changed wastes API quota, buries real changes in noise, and makes the Merchant Center diagnostics useless because everything looks like it updated at once.
Change-driven sync is the opposite. A products/update webhook tells you exactly which SKU moved. You touch one item, write one row, push one update. The feed stays current to the minute instead of to the hour, and your rejection log actually means something because it only lists the items you just touched.
The competitors ranking here optimize feed copy with AI. Useful, but it's the wrong layer. Copy quality doesn't matter if the price is forty minutes stale.
The product feed pipeline
Product webhook → Normalize → Validate required attrs
│ ok
Diff vs last-synced hash
│ changed
Fan out → Merchant Center push
→ Meta Catalog push
│
Log push + update hash (Sheets)
1. Catch the change
Shopify's products/update and inventory_levels/update webhooks cover most edits. WooCommerce doesn't emit clean product events, so a Schedule trigger that polls GET /wp-json/wc/v3/products?modified_after= fills the gap. The Webhook node's default 120-second timeout is plenty for a single product payload.
2. Normalize into one schema
A Set node maps the incoming product into a flat internal object: sku, title, price, availability, image_link, gtin, description. Every downstream node reads these keys, so the destination mappers are the only place that knows about Merchant Center or Meta field names.
3. Validate before you push
Google Merchant rejects items missing GTIN, price, availability, or image_link, and the rejection is silent unless you parse the API response. Add an IF node that checks the required fields. Incomplete products route to a review sheet instead of failing the whole run.
4. Diff against the last sync
Store a hash of the feed-relevant fields per SKU in Google Sheets. Compare the new hash to the stored one. Same hash, skip. Different, push and update the stored hash. This is the guard that stops a chatty webhook from spamming no-op updates.
5. Fan out and log
A Switch or two HTTP Request branches map the normalized object into Merchant Center and Meta Catalog field shapes and push each. Log the result, the destination, and the new hash to Sheets. Now you can answer "when did this SKU last sync, and did it succeed" without guessing.
Implementation patterns worth stealing
Pattern: hash-based diff guard. Concatenate the fields that matter to the feed, hash them, store the hash. The push only fires when the hash changes. This makes the workflow idempotent: re-running it on the same product is a no-op.
newHash = hash(sku + price + availability + title + image_link)
IF newHash != storedHash THEN push(); store(newHash)
ELSE skip
Pattern: per-destination mapper, single source. Keep one normalized product object. Each destination gets its own Set node that renames fields (availability becomes in stock for Merchant, in stock stays for Meta but the enum differs). Adding a third channel later means one more mapper, not a rewrite.
Merchant Center and Meta both accept a malformed item and reject it asynchronously. If your workflow only checks the HTTP status, you'll think a rejected SKU synced. Parse the response body for per-item errors and log the rejection reason to Sheets, or you'll debug "missing from Shopping" tickets blind.
n8n nodes you'll use most
| Node | Purpose |
|---|---|
| Webhook | Catch products/update / inventory events |
| Schedule Trigger | Poll WooCommerce for modified products |
| Set | Normalize, then map per destination |
| Crypto / Code | Hash feed fields for the diff guard |
| IF / Switch | Validate attributes, route per channel |
| HTTP Request | Push to Merchant Center and Meta Catalog |
| Google Sheets | Hash store, push log, rejection log |
Getting started
- Wire the Shopify
products/updatewebhook (or the WooCommerce poll) into a Webhook node. - Add a Set node that normalizes each product into the flat internal schema.
- Add the validation IF that routes incomplete items to a review sheet.
- Build the hash diff against a Google Sheets SKU store.
- Add per-destination Set mappers and HTTP Request pushes for Merchant and Meta.
- Log each push, skip, and rejection back to Sheets with a timestamp.
- Test by editing one SKU's price and confirming exactly one push fires per channel, then editing nothing and confirming the next run skips.
For the webhook-in, transform, multi-destination, Sheets-log backbone, the Smart Distribution Scheduler already wires the spine you'll reuse for every channel push here.
Browse the n8n template catalog →The Smart Distribution Scheduler ships this end-to-end: a Webhook trigger that receives store notifications, a routing step that selects the right destination, a Slack ops alert, and a Google Sheets log you extend into the per-SKU hash store and rejection log this feed sync needs. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to the whole catalog plus every template added later, which pays off fast if you run more than one ecommerce automation.
A clean feed only matters if the store behind it stays current. If your inventory counts drift, the n8n inventory management automation guide covers the low-stock and reorder-threshold logic that keeps availability honest, and the Shopify automation patterns post maps where the feed sync sits next to order and fulfillment flows. Pair them with the Smart Distribution Scheduler and the catalog stays accurate everywhere it's listed.
See ecommerce automation templates →Common questions
How does n8n know a product changed?
How do I stop the same SKU pushing twice?
Can one workflow feed both Google Merchant and Meta catalog?
What breaks a product feed most often?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
Get 3 tested n8n templates, free
The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Built through the same live-instance release process as everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.
- 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
- 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
- 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14
More automation guides

Automate SEO Internal Linking Across Your Site with n8n
Internal linking is one of the highest-ROI on-page SEO levers, and it's the one that rots fastest. Every new post should link to relevant older ones and earn links back, but nobody remembers the forty…

Build a Self-Filling Content Calendar with n8n
Most content calendars die the same way: the planning sheet looks great in January, then a busy week leaves three empty slots, then a busier week leaves ten, and by March nobody trusts it. The fix isn…

Automate Content Translation and Localization with n8n
A blog that ranks in English is leaving traffic on the table in five other markets. The fix sounds simple, translate the posts, and the popular n8n template does exactly the naive version: title in, b…