Skip to main content
Lifetime license included with every purchase
n8n workflowsproduct feedecommerce automationmerchant center

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.

Nn8n Marketplace Team·August 4, 2026·Updated August 4, 2026·7 min read

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/update and 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.

Read the push response, always

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

NodePurpose
WebhookCatch products/update / inventory events
Schedule TriggerPoll WooCommerce for modified products
SetNormalize, then map per destination
Crypto / CodeHash feed fields for the diff guard
IF / SwitchValidate attributes, route per channel
HTTP RequestPush to Merchant Center and Meta Catalog
Google SheetsHash store, push log, rejection log

Getting started

  1. Wire the Shopify products/update webhook (or the WooCommerce poll) into a Webhook node.
  2. Add a Set node that normalizes each product into the flat internal schema.
  3. Add the validation IF that routes incomplete items to a review sheet.
  4. Build the hash diff against a Google Sheets SKU store.
  5. Add per-destination Set mappers and HTTP Request pushes for Merchant and Meta.
  6. Log each push, skip, and rejection back to Sheets with a timestamp.
  7. 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
Skip the build

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.

Get the Smart Distribution Scheduler

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
FAQ

Common questions

How does n8n know a product changed?
Shopify fires products/update and inventory_levels/update webhooks; WooCommerce needs a REST hook or a Schedule trigger that polls the products endpoint. n8n catches the event, reads the changed fields, and only the changed product moves through the rest of the flow. You don't re-push the whole catalog on every edit.
How do I stop the same SKU pushing twice?
Keep a Google Sheets row per SKU with a hash of its feed-relevant fields. Before pushing, compare the new hash to the stored one. If they match, skip. If they differ, push and update the hash. This diff check is what keeps a noisy webhook from hammering Merchant Center with no-op updates.
Can one workflow feed both Google Merchant and Meta catalog?
Yes. Normalize each product into one internal schema with a Set node, then fan out to a Switch or two HTTP Request branches that map the common shape into Merchant Center and Meta Catalog field names separately. The mapping differs per destination; the source-of-truth product object stays single.
What breaks a product feed most often?
Missing required attributes. Google Merchant rejects items lacking GTIN, price, availability, or image_link, and the rejection is silent unless you read the response. Add a validation step that checks required fields before the push and routes incomplete products to a review sheet instead of failing the run.
Stop reading. Start running.

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.

Free — $40 value

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