WooCommerce sells products and does not describe them to anyone else. There is no product feed in it — no Google Shopping XML, no Meta catalogue file, nothing a price comparison site can read. Every WooCommerce store advertising anywhere has had to add that file with a plugin.
FeedRobin Connector is ours, and it is free in the official WordPress plugin directory: GPL, no account, no upsell wall. This page is what it does, what it refuses to do, and how to point a channel at the URL it gives you.
Install it in three steps
1. In WordPress, go to Plugins → Add New, search FeedRobin Connector, install and activate. WooCommerce has to be active — the plugin declares it as a requirement and will not run without it.
2. Open WooCommerce → FeedRobin. Your feed URL is already there; it carries a random token, so it is unguessable rather than public, and it is served with a noindex header so search engines leave it alone.
3. Copy the URL into whatever reads it — Merchant Center's data source, Meta's catalogue, Microsoft's feed field. That is the whole job. If the URL ever leaks, the settings screen makes a new one and the old address stops working immediately.
If the URL answers “not found”, open Settings → Permalinks and press Save once — WordPress rebuilds its rewrite rules. The plugin also serves a query-string version for stores on plain permalinks.
What goes into the feed
Variations as separate items. A shopper buys the blue Large, not the parent product, and the variation is what carries the price, the stock and the barcode. Each one goes out on its own with the parent's id as item_group_id, which is how a channel knows your blue Large and your red Small are one product rather than two.
Prices with tax, and sale prices only while the sale is running. A sale price that is set but outside its date range is not the price being charged, and publishing it is the fastest route to a price mismatch suspension.
Barcodes from WooCommerce's own GTIN field (added in WooCommerce 9.2). Where a product genuinely has none, the feed says identifier_exists=false rather than leaving the channel to guess — which is what Google asks for.
Brand, from wherever your store keeps it. WooCommerce only grew a brand taxonomy in 9.4, so older stores keep it in Perfect Brands, YITH or a plain brand attribute. All four are read.
Colour and size as their own fields, resolved to the name a shopper sees rather than the slug — a channel can filter on a field, it cannot filter on a word inside your title. Plus the full category path, the image gallery, stock status including backorder, and shipping weight.
What it deliberately does not touch
Your custom labels. All five belong to your campaign segmentation in Google Ads. A feed that quietly fills one can change how bidding you already run groups its products.
Your SKU is never sent as an MPN. A SKU identifies the product in your shop, not at its manufacturer. Claiming otherwise is the kind of thing that gets a whole catalogue flagged.
Your products. Nothing is written to them. The plugin stores one option — the token in your feed URL — and deletes it on uninstall. It also makes no outbound requests of any kind: your catalogue is not sent anywhere, including to us, unless you press Connect yourself.
The trap it was built around
The feed is generated at the moment it is fetched rather than written to a file on a schedule, which is what keeps it current — and which is also what makes it vulnerable to something most feed plugins never meet. A full-page cache wraps the request in an output buffer and stores whatever is in that buffer at the end as “the page”. With a streamed response, that is the last chunk: eighteen bytes, </channel></rss>, served to every fetch afterwards.
We found it on a test store dressed like a real one — Storefront, an SEO plugin, WP Super Cache — and the symptom is the nastiest kind: a well-formed XML document with zero products, so no channel reports a broken feed. The plugin now sets DONOTCACHEPAGE and closes any buffer a cache has already opened before it writes a byte:
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( 'DONOTCACHEPAGE', true );
}
while ( ob_get_level() > 0 ) {
ob_end_clean();
}The whole failure, and how to check a feed you already have for it in sixty seconds, is in the guide on feeds that stop arriving.
When the plugin is enough, and when it is not
It is enough if you sell on Google, Meta or Microsoft and your product data is already clean: those three read the same Google-format file, and the URL is yours to paste anywhere. Nothing about it expires, and it does not ask you to sign up for anything.
It is not enough when you need the other formats or the checking: Heureka, Compari and Árukereső want their own XML dialects, idealo wants a CSV with per-carrier shipping columns, and ChatGPT wants OpenAI's format. Rules that fix titles or exclude products, and a score that tells you what a channel will reject before it does, are the other half. That is what FeedRobin adds on top of the same feed — and the free feed check runs on the plugin's URL without an account, so you can see the difference before deciding anything.
Questions merchants ask
Is the plugin really free?
Yes — GPL, in the official WordPress directory, with no locked features and no account. The feed URL it creates works on its own; FeedRobin is a separate paid service you can ignore.
Is my feed URL public?
It is unguessable rather than secret. The URL carries a random token and the response is sent with a noindex header, so it is not crawled or listed. Everything in the feed is already on your storefront. If the URL leaks, create a new one from the settings screen and the old one stops working immediately.
Will it slow my store down?
The feed is only built when something fetches it, in batches of 200 products, and never while a shopper is on the site. Nothing is added to your storefront pages.
Does it work with a caching plugin?
Yes. The feed sets DONOTCACHEPAGE, which WP Super Cache, W3 Total Cache, LiteSpeed and WP Rocket all honour, and closes any output buffer they have opened. That matters because a cached feed does not look broken — it looks empty.
Do I have to use FeedRobin with it?
No. Paste the URL into Merchant Center and you are done. The plugin makes no outbound requests and sends nothing anywhere unless you press Connect yourself.
Sources
The plugin's own listing and readme: FeedRobin Connector on WordPress.org. Field definitions come from Google's product data specification, and the barcode field from WooCommerce's 9.2 release notes. The page-cache failure is our own, found on a WooCommerce install running WP Super Cache in September 2026.