WordPress and WooCommerce
how to push a WooCommerce product feed to Google Merchant Center
why Google Merchant disapprovals appear after WooCommerce catalogue edits
Google Merchant Center rejects or limits products when titles, GTINs, images, prices, or availability disagree with the landing page. WooCommerce catalogues change constantly: stock decrement on order, promo prices with scheduling, attribute edits for size charts, and missing identifiers on older SKUs. Plugins that dump a full XML feed once a day leave Shopping ads running on stale availability, which leads to disapprovals and wasted spend. Multilingual and multi-currency shops must emit the right language and currency per target country, not a single PL-only feed for every EU campaign. GTIN and brand gaps are chronic on private-label goods. Category mapping from WooCommerce categories to Google product taxonomy drifts when merchandisers invent new shop categories. Variant products need item_group_id discipline or Merchant treats each size as an unrelated offer. Shipping and tax fields that are accurate at checkout may be absent from the feed, so the free listing looks cheaper than checkout and gets suspended. Without automation that regenerates on catalogue events, validates required fields, and alerts on disapproval spikes, channel ops discovers problems in the Merchant UI days later. By then Shopping campaigns have narrowed delivery. Marketplace-led catalogues create extra drift. If Baselinker or an ERP pushes price into WooCommerce after Merchant has already fetched the morning feed, Shopping ads can disagree with checkout for hours. The automation must either patch Merchant quickly through the Content API or temporarily pause the SKU when a conflict window is detected. Returning customers who see one price in Google and another at checkout generate support tickets that look like coupon bugs but are really feed lag. Regional assortment rules also matter. Some SKUs are sellable domestically but not in the Merchant destination country due to shipping or compliance. Emitting them globally invites policy disapprovals. Encode destination eligibility next to the product, not in a one-off Merchant UI exclusion that nobody mirrors back to WooCommerce. Freshness of image_link matters too: swapping a lifestyle image without updating the feed leaves Merchant on a broken or outdated CDN path and triggers image crawl failures that suppress free listings. Write down owners for each URL pattern before go-live so alerts do not bounce between SEO, paid media, and development without resolution. A named owner shortens mean time to redirect fix more than another dashboard widget.
when to regenerate and resubmit the Merchant Center product feed
Regenerate affected SKUs when product price, stock, visibility, tax class, or primary image changes, and when a scheduled promo starts or ends. Run a full feed rebuild nightly as reconcile. Also trigger after bulk CSV imports and after marketplace sync jobs that rewrite WooCommerce prices. For multi-country targets, rebuild the locale-specific feed when translation fields change in WPML or when a currency rate table used for Merchant prices updates. On inventory zero, push availability out of stock immediately even if the full rebuild is hours away. Priority should favour availability and price correctness over descriptive text updates.
how to build validate and upload a WooCommerce Google Merchant feed
- Select products that are published, purchasable, in stock or backorder according to policy, and not excluded by a Merchant suppress attribute.
- Map WooCommerce fields to Merchant attributes: id, title, description, link, image_link, availability, price, sale_price, brand, gtin or identifier_exists, item_group_id, and google_product_category.
- Validate required attributes per destination country; quarantine SKUs missing GTIN when identifier_exists is false only if policy allows, otherwise block them from the feed and open a merchandising task.
- Write XML or text feed to a stable HTTPS URL protected from casual scraping if needed, or push via Content API for Shopping for faster partial updates.
- Ask Merchant Center to fetch the feed or patch products through the API; store the batch ID and timestamp on a sync log.
- Pull disapproval and pending counts via the Merchant API into a dashboard and alert when the rate exceeds baseline after a catalogue change window.
- On stock reaching zero or a price change above a threshold, send a priority availability or price patch through the Content API without waiting for the nightly full rebuild.
Systems
- WooCommerce
- Google Merchant Center
- Baselinker (optional)
- ERP price source
Tools
- custom PHP feed endpoint
- Content API for Shopping
- WP-Cron
- n8n
data flow from WooCommerce catalogue to Merchant Center
WooCommerce is the catalogue authority. A generator implemented as a custom plugin endpoint, WP-Cron plus static file in uploads, or an n8n workflow reading the REST API builds the feed. For large catalogues, prefer differential Content API updates on webhooked product changes and keep a daily full reconcile file for audit. Google product taxonomy mapping can live in a spreadsheet mirrored to the shop. Price and currency must match the landing page the feed link points to; if you use geolocated pricing, emit separate feeds per Merchant destination. Tools like Make are acceptable for small catalogues; n8n or custom PHP scale better when SKU counts hit tens of thousands and rate limits matter. Keep a quarantine table of SKUs excluded from the feed with reasons (missing image, missing GTIN, landing page noindex, suppressed brand). Merchandisers should work that queue inside WordPress or a shared sheet. Connect alerts to the same ops channel as sync-error-alerts so feed fetch failures are not only visible inside Merchant Center.
fixing Merchant Center disapprovals and feed fetch failures
If feed hosting returns 500 during Merchant fetch, keep the previous successful file immutable until the new build validates, then atomic-swap. If Content API returns quota errors, slow the queue and prioritise availability and price patches over description text. When disapprovals cite mismatched price, freeze promo automation that writes sale_price without updating the landing page template. On image_link failures, fall back to a secondary image only if it meets Merchant rules; otherwise exclude the SKU and notify merchandising. Never silently drop more than a configured percentage of the catalogue without an alert. If Google returns account-level free listing suspensions, stop noisy per-SKU alerts and page a human owner with the account issue. Per-SKU retries will not clear account policy holds. When a landing page is noindexed by mistake, detect it in the validator before upload rather than waiting for crawl-time disapproval.
when a Merchant Center feed automation is not worth it
A ten-SKU boutique that edits products weekly can upload a manual sheet inside Merchant Center. Automation pays off when catalogue churn, ads spend, or SKU count makes stale availability expensive. Also wait if brand, GTIN, and taxonomy data are still so incomplete that every automated build would quarantine most of the shop. If Shopping ads are paused indefinitely and you only need a token presence in Merchant, a monthly manual upload is enough. Revisit automation when ads spend resumes or organic free listings drive material sessions.
KPIs for Google Merchant feed automation
- Share of active SKUs approved in Merchant Center
- Median time from WooCommerce price or stock change to Merchant-visible update
- Disapprovals opened per 1,000 fed SKUs per week
- Feed fetch failures per month
Automation ROI calculator
Enter how often the process runs each month, minutes per run, and your loaded hourly cost. The result is a simulation, not a quote for our work.
Hours = runs × minutes / 60 × recovery %. Time value = hours × rate × realisation %. Avoided errors = runs × error % × cost per error × realisation %. Net = sum − upkeep. Payback = build / net, only when net > 0.
Hours recovered / month: -
Hours recovered / year: -
Time value / month: -
Avoided error cost / month: -
Net / month: -
Payback (months): -
First-year result: -
Frequently asked questions
Practical answers to apply the topic in real execution.
Feed file or Content API?
#How do variable products should appear?
#What about missing GTINs on private label goods?
#How should shipping costs appear in the feed?
#Need an FAQ tailored to your industry and market? We can build one aligned with your business goals.
Let’s discuss