Skip to content

Documentation

Documentation

Install the plugin, build your first feed, connect it to a channel and keep it fresh on a schedule.

Advanced Product Feed builds product feeds from your WooCommerce catalogue and serves them from a stable URL that Google Merchant Center, Meta and the other channels fetch on their own schedule. This documentation covers the free plugin and the Pro add-on; sections that need Pro are marked.

Start here

  1. Install the free plugin from WordPress.org (and the Pro add-on if you bought it).
  2. Create your first feed with the three-step wizard.
  3. Register the feed URL in Google Merchant Center or Meta Commerce Manager.
  4. Pick a refresh schedule so prices and stock stay current.

Requirements

Component Minimum
WordPress 6.5
WooCommerce 7.0
PHP 7.4 (8.1 or newer recommended)
Writable uploads folder Feed files are written to wp-content/uploads/apfw-feeds/

Getting started

Getting started

A product feed is a file — XML or CSV — that lists your products in the exact structure a shopping channel expects. The plugin reads WooCommerce, applies your filters and attribute mapping, writes the file in batches and serves it from a URL. The channel fetches that URL on its own schedule; you never upload anything by hand.

How a feed is built

  1. Select — published products that match the feed filters (category, stock status, product type; Pro adds tags, brands, price range, SKU, featured and on-sale).
  2. Expand — variable products become one item per variation, each carrying the parent’s item group id.
  3. Map — every channel attribute (title, price, availability, GTIN, Google product category …) is resolved from the WooCommerce field, attribute or static value you chose.
  4. Write — items are appended to a temporary file 200 products at a time and the finished file replaces the previous one atomically, so the URL never serves a half-written feed.
  5. Serve — the feed is available at /apfw-feed/{token}.xml (or .csv) with correct content type, ETag and Last-Modified headers.

Free and Pro

The free plugin includes three feeds, the Google Shopping and Meta channels, XML and CSV output, simple and variable products, daily and weekly schedules and public feed URLs. The Pro add-on is installed alongside it and unlocks unlimited feeds, seventeen further channels, TSV/TXT/JSON, grouped and external products, the full filter set, taxonomy/custom-field/ACF mapping, hourly refresh, private URLs and localisation. See the full comparison.

Installation

Free plugin

  1. In WordPress go to Plugins → Add New and search for “Advanced Product Feed for WooCommerce”.
  2. Install and activate. WooCommerce must already be active.
  3. A new “Product Feeds” menu appears in the admin sidebar.

Pro add-on

  1. Download the Pro zip from My Account → Licenses on this site.
  2. Plugins → Add New → Upload Plugin → choose the zip → Install → Activate. The free plugin must stay active; Pro is an add-on, not a replacement.
  3. Open Product Feeds → License, paste your key and click Activate. Every Pro feature unlocks immediately; existing feeds and their URLs are untouched.

Updating

The free plugin updates through WordPress.org. Pro checks this site twice a day and offers updates on the Plugins screen while your licence is active; the download is delivered over a signed, expiring link.

Staging sites

A licence seat is bound to a site URL. Deactivate the licence on a staging copy before cloning it to production, or buy a plan with enough seats for both.

Creating your first feed

Go to Product Feeds → Add New. The wizard has three steps.

Step 1 — Setup: where products go

  • Country — the target market. It drives currency, tax and shipping expectations for Google.
  • Type and channel — Advertising (Google Shopping, Bing, Dynamic Remarketing …), Social (Meta, TikTok, Pinterest, Snapchat, X), Marketplace (Amazon, Merkandi, Vivino) or Custom.
  • Name — only shown in your admin.
  • Limit which products are included — optional filters; leave closed to export the whole catalogue.

Step 2 — Fields: confirm product data

Every attribute the channel accepts is listed in tiers — Required, Recommended, Apparel, Advanced — with a smart default already selected (title → product name, price → regular price, availability → stock status, brand → the brand taxonomy if one exists, and so on). Change any source, choose a static value, or add a custom output field.

Step 3 — Preview: check & launch

A live preview renders products the way the channel will show them, the feed-health scan lists missing required fields, and Delivery options set the output format, schedule and visibility. Save & Generate writes the file and shows the feed URL.

After generation

The feeds list shows the channel, format, status, product count, schedule, last generation time and the URL with View and Copy buttons. Regenerate at any time with the refresh action.

Channels

Google Merchant Center

Google Merchant Center accepts the RSS 2.0 XML feed the plugin generates by default. CSV works too if you prefer.

Registering the feed

  1. Copy the feed URL from Product Feeds → All Feeds.
  2. In Merchant Center open Products → Feeds → Add primary feed, choose the country and language, name the feed and select Scheduled fetch.
  3. Paste the URL, set a fetch time shortly after your plugin schedule runs, and save. Google fetches the file daily; the first review can take up to 3 business days.

Attributes covered

id, title, description, link, image_link, additional_image_link, availability, price, sale_price, sale_price_effective_date, brand, gtin, mpn, identifier_exists, condition, google_product_category, product_type, item_group_id, color, size, gender, age_group, material, pattern, shipping, shipping_weight, tax, multipack, is_bundle, adult, energy_efficiency_class and more. Pro adds custom_label_0–4 and the advanced shipping and return attributes (handling times, transit times, carrier shipping, dimensions, ships_from_country, return policy labels).

Common review issues

Merchant Center message Fix in the plugin
Missing value [gtin] / limited performance Map GTIN to a product attribute or set identifier_exists to false for products without one.
Invalid or missing google_product_category Map your store categories on the Category Mapping screen; use Auto-map for suggestions.
Price mismatch Refresh more often (daily, or hourly with Pro) and check that the feed uses the same tax display as your product pages.
Image too small Google wants at least 100×100 px (250×250 for apparel). Map image_link to the full-size image (default).

Meta (Facebook & Instagram)

Meta Commerce Manager reads the same feed for Facebook Shops, Instagram Shopping and dynamic ads. The plugin’s Meta channel outputs the Facebook catalogue specification (id, title, description, availability, condition, price, link, image_link, brand, google_product_category, item_group_id, sale_price and more).

  1. Create a feed with Type = Social and Channel = Meta (Facebook & Instagram); CSV is the most widely tested format for Meta, XML also works.
  2. In Commerce Manager open your catalogue → Data sources → Add items → Data feed → Scheduled feed, paste the URL and choose an hourly or daily fetch.
  3. Meta validates the file and reports item-level errors under Diagnostics; the preview in Step 3 shows how each product will look before you submit.

Pro channels & formats

Pro registers seventeen more channels. Each one carries its own specification: required and optional attributes, allowed values, defaults and a channel-styled preview.

Channel Notes
Google Local Inventory, Local Products Store-code based inventory and local product data for “Buy in store” listings.
Google Dynamic Search Ads, Dynamic Remarketing Page feeds and remarketing feeds for Google Ads.
Google Promotions, Bing Promotions Document-level promotion feeds (one record per feed).
Google Product Reviews Exports approved WooCommerce reviews in Google’s product review schema.
TikTok, Pinterest, Snapchat, X Social catalogue feeds for shops and dynamic ads.
Microsoft Bing Microsoft Merchant Center; accepts the Google format with Bing-specific attributes.
Amazon, Merkandi, Vivino Marketplace listing files; Amazon uses SKU as product-id by default.
OpenAI JSON product feed for ChatGPT shopping.
Custom Choose any fields and add your own columns or elements.

Formats

XML (RSS 2.0) and CSV are free. Pro adds TSV, TXT (tab-delimited) and JSON. All writers stream to disk and support resuming mid-file.

Building a feed

Attribute mapping

Mapping tells the plugin which WooCommerce data fills each channel attribute. Defaults are chosen per channel; you only change what you need.

Sources

Source Examples Tier
Standard WooCommerce fields name, description, short description, SKU, regular/sale price, stock status, weight, dimensions, permalink, images, categories Free
Product attributes pa_color, pa_size, custom product attributes such as GTIN or Brand Free
Static value “new”, “TRUE”, a fixed shipping label Free
Taxonomies any registered product taxonomy Pro
Custom fields (post meta) _gtin, _mpn, any meta key Pro
ACF fields Advanced Custom Fields values, including relationship and taxonomy fields Pro
Fallback values a second source used when the first is empty Pro

Variations

A variation inherits any value it does not carry itself — description, brand, categories, images — from its parent, and always receives the parent id as item_group_id.

Custom output fields

Add any attribute the channel supports that is not in the list, or extra columns for a custom feed. Pro-only attributes (custom labels, advanced shipping) are validated server-side, so they cannot be added by hand in the free plugin.

Category mapping

Google (and the channels that reuse its taxonomy — Meta, Bing, Pinterest) want each product placed in Google’s own category tree. The plugin bundles the full taxonomy, so mapping works offline.

  1. Open Product Feeds → Category Mapping. Each store category shows a search box and, where the plugin is confident, a SUGGESTED match.
  2. Click Auto-map categories to apply every suggestion in one go, then review and correct individual rows.
  3. Unmapped categories are fine — Google assigns one automatically — but apparel, media and regulated products should be mapped explicitly.

Pro: child categories without their own match inherit the nearest mapped parent, so you can map “Kitchen” once and every sub-category follows.

Filtering products

Filters decide which products enter a feed. Coarse filters run in SQL; value-dependent ones run per product after prices are resolved.

  • Free: include/exclude categories, stock status, product type, skip products without an image, skip products without a price.
  • Pro: include/exclude tags, brands, minimum and maximum price, SKU contains, featured only, on-sale only.

Password-protected and unpublished products are never exported. Hidden catalogue visibility is respected for the Meta channel.

Running feeds

Scheduling & large catalogues

Schedules

Each feed has its own schedule: Manual, Daily or Weekly at a time you choose in the site’s timezone (Pro adds Hourly and Twice daily). An hourly heartbeat finds due feeds and queues them with Action Scheduler, the background job runner bundled with WooCommerce, so generation never runs inside a visitor’s page load.

Large catalogues

Generation is a resumable state machine. Products are read in keyset-paginated batches (the batch size is a setting, default 200), mapped and appended to a temporary file. Every step runs inside a time budget derived from the server’s max_execution_time and saves its position; if a step is cut off by a timeout, a fatal error or a server restart, the next step resumes from the last saved product and byte offset, and the file is truncated back to that offset so nothing is duplicated. Memory is released between batches and a step ends early when usage approaches 85% of the PHP limit. When the last product is written, the temporary file replaces the live one atomically.

In practice this means a 500,000-product store on shared hosting with a 60-second limit generates its feed in many short background steps, and the previously published feed keeps being served until the new one is complete.

Live progress

When you click Generate in the admin the browser drives the same steps and shows a progress bar (batch, products processed, items written). Closing the tab does not lose the run — it continues in the background and the feeds list keeps showing its progress.

Feed URLs & privacy

Each feed gets a permanent URL of the form https://your-store.com/apfw-feed/{token}.xml. The token is a random UUID generated once per feed; it never changes when you edit, regenerate, upgrade or downgrade, so the URL you register with a channel keeps working.

  • Correct Content-Type per format, Last-Modified and ETag headers, and 304 responses so channels only download when the file changed.
  • HEAD and Range requests are honoured and large feeds are served pre-compressed when the client accepts gzip.
  • Feed files live in a protected uploads directory and are only reachable through the feed URL.
  • Pro: private feeds require a secret key parameter (?key=…) that you can rotate per feed; logged-in shop managers can always open them.

Sites using plain permalinks are served through an equivalent query-string URL.

Multi-currency & multilingual

Pro detects the currency and translation plugins you already use and offers per-feed currency and language choices only when a provider is installed, so a feed never relabels unconverted prices.

  • Multi-currency: WooCommerce Multilingual & Multicurrency (WCML), Aelia Currency Switcher, WOOCS, CURCY. Prices are converted with the provider’s rates at generation time.
  • Multilingual: WPML, Polylang. The whole generation pass runs in the feed’s language, so titles, descriptions, attributes and permalinks all come out translated.

Account & help

Licence & activation

Your licence key

Keys look like APFW-XXXXX-XXXXX-XXXXX-XXXXX. They are emailed after purchase and always available under My Account → Licenses on this site, together with the latest Pro download.

Activating

On the customer site open Product Feeds → License, paste the key and click Activate. The plugin registers the site with our licence server, which signs its reply; the plugin verifies the signature, so a fake server cannot unlock Pro.

Seats

A plan includes a number of sites. Each activation takes a seat bound to that site’s URL; re-activating the same site is free. To move a licence, deactivate it on the old site (Product Feeds → License → Deactivate) or release the seat from My Account → Licenses.

Renewals and expiry

Licences include one year of updates and support. We email you 14 days and 1 day before expiry. After expiry the Pro features lock and updates stop; your feeds keep being served and the free features keep working. Renewing from My Account extends the same key.

Offline grace

The plugin re-checks the licence twice a day. If our server cannot be reached, Pro keeps working for seven days before locking.

Troubleshooting

The feed has 0 products

Most often the filters are excluding everything: “Skip products without an image” removes products with no featured image, and Google requires image_link. Check Product Feeds → Logs — with Pro debug logging on, the log names each skipped product and why.

The feed URL returns 404

Visit Settings → Permalinks and click Save once to flush rewrite rules. The plugin also self-heals the rule on the next request.

Generation never finishes

Open Product Feeds → Status: it shows the step budget, max_execution_time and whether Action Scheduler is available. Background steps need WP-Cron or a real cron hitting wp-cron.php; check WooCommerce → Status → Scheduled Actions for pending apfw_generate_feed actions.

Merchant Center says “fetch failed”

Make sure the URL is reachable without login, is not blocked by a firewall or Cloudflare bot rule, and responds within 60 seconds — the plugin serves pre-compressed files and supports Range requests for this reason.

Pro features are locked although I activated

Product Feeds → License shows the exact status: expired, disabled, site limit reached, or unreachable server. Re-check forces a new validation.

Developer reference

The plugin is built to be extended. Every tier gate and every data point passes through a filter or action prefixed apfw_.

Useful hooks

Hook Purpose
apfw_product_query_args Adjust the WP_Query arguments used to select products.
apfw_include_product Final say on whether a product enters a feed.
apfw_resolve_value Resolve custom mapping source types.
apfw_register_channels, apfw_register_formats Add channels and output writers.
apfw_feed_generated, apfw_feed_generation_failed React to finished or failed runs (notifications, cache purges).
apfw_generation_step_budget Seconds of work per background step.
apfw_csv_escape_formulas Disable the spreadsheet formula guard.

REST API

Namespace apfw/v1: feeds CRUD, generate, generate/start, generate/step, generate/progress, import/export, reference data (categories, attributes, taxonomy search) and settings, all requiring the manage_woocommerce capability.

Last updated September 2, 2026

Start with the free plugin. Upgrade when you need more channels.

Pro activates on top of the free plugin — same feeds, same URLs, nothing to migrate.