Setting up Product Data Feeds
Product Data Feeds publishes your catalogue to shopping channels — Google Shopping, Meta (Facebook) Catalog and Microsoft (Bing) Shopping. It builds a correctly formatted file at a stable web address, and the channel fetches that address on its own schedule. This guide takes about twenty minutes and assumes you already have, or will create, a merchant account on the channel you’re targeting.
Included with TitanCart Pro. Product Data Feeds is part of your Pro subscription — there is no separate purchase and no extension license key to enter. Under Extensions → Installed Extensions it shows an Included in Pro pill instead of a key field. If it isn’t installed yet, install it from Extensions → Extensions Marketplace.
1. Turn the extension on
- Go to Growth → Data Feeds.
- Open the Settings tab and switch Enable Product Data Feeds on.
- Save.
That master switch is what makes feeds serve publicly and refresh on schedule. While it is off, your feed definitions and their settings are kept exactly as they are — nothing is deleted — but every public feed URL returns a not-found response and the scheduled rebuild is skipped.
2. Set your global defaults
Still on the Settings tab, under Default field mapping, fill in the values every new feed should start from. Each feed can override them later.
- Default brand — used as the brand for any product that has no brand of its own. Worth setting; see the identifiers section below for why.
- Condition — New, Refurbished or Used, applied to every item in the feed.
- Google product category — optional. A Google product taxonomy ID or full path, applied to every item.
- Use product code as MPN — on by default. Read the warning in section 5 before leaving it on.
These four are the only global settings. A feed created afterwards inherits them; changing them later does not rewrite feeds that already exist.
3. Create a feed
On the Feeds tab, click + New feed and set:
- Feed name — your own label, e.g. “Google — main catalogue”.
- Channel — Google Shopping, Facebook / Meta Catalog or Bing Shopping.
- Format — read-only. Google and Bing get RSS 2.0 XML in Google’s
g:namespace; Meta gets a catalog CSV. You can’t change it, and you don’t need to. - Refresh schedule — Manual only, Hourly, Daily or Weekly.
- Feed enabled — a per-feed switch, separate from the master switch in Settings. Turning it off stops this one feed serving and skips its schedule, without touching any other feed.
Click Create feed. You land on the saved feed, which now has its own public URL and a run history.
Bing Shopping produces the identical document to Google Shopping — Microsoft ingests Google’s specification. Create it as a separate feed anyway, so each channel has its own URL, its own schedule and its own run history.
4. Choose which products are included
In the Product filters section:
- Product status — pick one of Active, Disabled or Hidden. This is a single choice, not a set of tick-boxes, and it defaults to Active. Almost every feed should stay on Active.
- In stock only — exclude anything not currently in stock.
- Categories — tick specific categories to narrow the feed. Leave every box unticked to include all categories.
Under the category list, the editor reports how many products currently match. Check it before you submit the URL anywhere — a feed that matches nothing still builds successfully and still serves, it is just empty.
Products that are always excluded
Three rules apply on top of your filters and cannot be switched off. If your matched count is lower than you expect, this is usually why:
- Products priced at zero are excluded. Free items never reach a feed.
- Visibility must be Visible or Catalog. Products set to search-only or hidden visibility are dropped. Visibility is not a feed filter and there is no control for it in the feed editor.
- A product with no name in the feed’s language is dropped. Feeds are built from English product content; there is no language selector in the editor. On a store whose products are only translated into another language, this can produce an empty feed that still reports success.
A product also needs a resolvable product page link to be included. It does not need an image — an item with no image will be built and sent, and the channel will reject it at their end.
5. Map your product data to the channel’s fields
The Field mapping section holds the same four controls as the global defaults, applied to this feed only. Leave a field blank to inherit the global default.
Brand, MPN and identifiers — read this before going live
Every channel wants to know what a product actually is, through what Google calls unique product identifiers: GTIN, MPN and brand. This is the single most common reason feeds get items disapproved, and TitanCart’s feed has real limits here.
- The feed does not send GTINs. There is no GTIN field in the generated document at all. If you resell manufactured goods that have barcodes, you cannot supply them through this feed. Google treats a GTIN as required wherever a product is widely manufactured and has one, so expect identifier warnings on resold branded stock.
- “Use product code as MPN” maps your Product Code straight into the MPN field, and it is on by default. An MPN is the manufacturer’s part number. Google’s specification is explicit that internal store SKUs do not belong in identifier attributes. If your product codes are your own internal references rather than real manufacturer part numbers, turn this off.
- When a product has neither a brand nor an MPN, the feed declares that identifiers don’t exist for it. That declaration is only legitimate for genuinely unidentifiable goods — custom, handmade, one-of-a-kind or vintage items. Google may disapprove products that carry it while similar offers elsewhere do have a GTIN, and those items stay disapproved until real identifiers are supplied.
- Setting a Default brand changes that behaviour. Once a brand is present the feed stops declaring that identifiers don’t exist — so on a store selling its own products, filling in Default brand is usually the right move.
If you make your own products, this is straightforward: set a default brand and leave the product code mapped to MPN. If you resell other people’s branded stock, this extension’s feed will not carry the identifiers those channels want, and you may need a dedicated feed tool for that channel.
Availability
Stock state is translated automatically. In stock becomes in_stock; on backorder, or out of stock with backorders still allowed, becomes backorder; everything else becomes out_of_stock. Meta’s equivalents are used for the Meta CSV.
Known limitation. Google requires an availability date alongside any item sent as
backorderorpreorder, and the feed does not send one. Backordered products will be flagged in Merchant Center for the missing attribute. Until this is addressed, the reliable workaround is to keep backorder-eligible products out of the feed — set In stock only on the feed.
Price
The feed advertises the public price a guest would see, including any active catalogue promotion. Where a product has a higher compare-at price, the feed sends the compare-at figure as the regular price and the selling price as the sale price, so the channel can display it as a discount. A promotion restricted to a customer group is never used — a feed price is always the price anyone can get.
Currency comes from your store’s primary currency. There is no currency control on the page.
6. Set the refresh schedule
Feeds rebuild through an hourly WordPress cron sweep, which rebuilds each feed whose own interval has elapsed. Pick the interval per feed:
- Manual only — rebuilds only when you click Regenerate now.
- Hourly, Daily, Weekly — rebuilt automatically so price and stock changes flow through.
Daily is the right answer for most stores. Google fetches a scheduled URL at most once every 24 hours, and Microsoft offers Daily, Weekly or Monthly only — so on those two channels an Hourly TitanCart schedule rebuilds a file nobody collects. Meta is the exception: it fetches as often as hourly, so an Hourly feed is worth it there if your stock moves fast.
Scheduled rebuilds depend on WordPress cron, which only fires when your site gets traffic. On a very quiet site a Daily feed can go days without rebuilding. If that matters, ask your host to run WP-Cron from a real system cron job.
7. Submit the feed URL to the channel
Each feed has a public, tokenised URL. Copy it with the Copy button — it appears both on the feed’s row in the list and in Output & history inside the editor. The URL never changes, so you submit it once and the channel re-fetches it from then on.
Open it in your own browser first. It should display or download the XML or CSV. If it loads for you it will load for the channel — and if the feed has never been built, opening it builds it on the spot, so the channel’s first fetch always finds a document.
Google Shopping
- In Merchant Center, open Settings, then Data sources.
- On the Product sources tab, choose Add product source, then Add products from a file.
- Paste the feed URL, then use Edit schedule to set the fetch frequency and time.
Merchant Center Next renamed things: what used to be a “feed” is now a primary data source, and the old Feeds tab is Products → Data sources. Leave the username and password fields blank — TitanCart feed URLs are protected by the token in the address, not by a password.
Meta (Facebook / Instagram) Catalog
- In Commerce Manager, open your catalogue and go to Data sources.
- Add a data source using a scheduled feed and paste the URL.
- Set the fetch frequency. Meta allows up to hourly.
Microsoft (Bing) Shopping
- Verify your website domain first, through Bing Webmaster Tools or a UET tag, and wait for your Merchant Center store to be approved. You cannot create a feed before this is done.
- Go to Tools → Merchant Center → Manage stores, open your store and select the Feeds tab.
- Choose Create feed, select Automatically download file from URL as the input method, and paste the URL.
- Set the download frequency to Daily.
How to verify on the channel’s side
After you submit a feed, confirm the channel actually accepted it. Do this the day after the first scheduled fetch, not immediately.
- Check TitanCart’s own record first. Open the feed and look at Recent runs under Output & history. Each row shows when the rebuild ran, what triggered it (manual, cron or api), whether it succeeded, how many items it emitted and the error text if it failed. The Items count there is the number of products the channel will see.
- Open the feed URL in a browser and confirm it returns a document rather than an error page.
- In the channel, open the data source you added and check its processing status — it should report a fetch time and an item count. Compare that count against the Items figure from the run history. A large gap means the channel is rejecting items rather than failing to fetch.
- Review the item-level issues the channel reports. Missing identifiers, missing category, image problems and availability mismatches are the usual ones. Fix them on the product or in the feed’s field mapping, click Regenerate now, and wait for the next fetch.
- Allow time for review. Products typically appear only after the channel has fetched, processed and approved them, which can take a few days on a new account.
Troubleshooting
- The Enable toggle won’t switch on — this needs an active Pro subscription. If Pro is current and the switch is still locked, check Extensions → Installed Extensions shows the Included in Pro pill.
- The feed is empty, or has fewer items than expected — check the matched-product count in the editor. Then check the always-excluded rules in section 4: zero-priced products, products whose visibility isn’t Visible or Catalog, and products with no English name are all dropped silently.
- The channel can’t fetch the URL — open it yourself. If it fails for you it will fail for them. Confirm both the master switch in Settings and the feed’s own Feed enabled switch are on; either one being off makes the URL return not-found. Also make sure nothing on your site blocks the crawlers — Google fetches as Googlebot and AdsBot-Google, and a security plugin or robots rule that blocks them will break the fetch.
- The feed isn’t updating — confirm the schedule isn’t Manual only, check the newest row in Recent runs for its timestamp and trigger, and remember that scheduled rebuilds need WordPress cron, which needs site traffic.
- Items rejected for a missing or invalid identifier — set a Default brand. If your product codes are internal references rather than manufacturer part numbers, also turn Use product code as MPN off. The feed cannot send GTINs, so barcode-level identifier warnings on resold branded stock cannot be resolved from here.
- Backordered items flagged for a missing availability date — a known limitation. Set In stock only on the feed to keep them out of it.
- A run shows Error — hover the Error column in Recent runs for the full message. The usual causes are an unwritable uploads folder or a very large catalogue timing out.
- You deleted a feed by mistake — deleting removes the definition, its run history and its cached file, and the public URL stops working immediately. A new feed gets a new URL, so you would have to resubmit it to the channel. To pause a feed instead, switch Feed enabled off.