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
- Install the free plugin from WordPress.org (and the Pro add-on if you bought it).
- Create your first feed with the three-step wizard.
- Register the feed URL in Google Merchant Center or Meta Commerce Manager.
- 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
- Select — published products that match the feed filters (category, stock status, product type; Pro adds tags, brands, price range, SKU, featured and on-sale).
- Expand — variable products become one item per variation, each carrying the parent’s item group id.
- Map — every channel attribute (title, price, availability, GTIN, Google product category …) is resolved from the WooCommerce field, attribute or static value you chose.
- 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.
- 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
- In WordPress go to Plugins → Add New and search for “Advanced Product Feed for WooCommerce”.
- Install and activate. WooCommerce must already be active.
- A new “Product Feeds” menu appears in the admin sidebar.
Pro add-on
- Download the Pro zip from My Account → Licenses on this site.
- Plugins → Add New → Upload Plugin → choose the zip → Install → Activate. The free plugin must stay active; Pro is an add-on, not a replacement.
- 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
- Copy the feed URL from Product Feeds → All Feeds.
- In Merchant Center open Products → Feeds → Add primary feed, choose the country and language, name the feed and select Scheduled fetch.
- 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).
- Create a feed with Type = Social and Channel = Meta (Facebook & Instagram); CSV is the most widely tested format for Meta, XML also works.
- In Commerce Manager open your catalogue → Data sources → Add items → Data feed → Scheduled feed, paste the URL and choose an hourly or daily fetch.
- 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.
- Open Product Feeds → Category Mapping. Each store category shows a search box and, where the plugin is confident, a SUGGESTED match.
- Click Auto-map categories to apply every suggestion in one go, then review and correct individual rows.
- 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.
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.