Drawing 1 · Interactive
Turn a catalogue change into a batch request
Minifying strips the whitespace people need and machines don’t, so every request is smaller.
Pretty-printed JSON.
- Bytes before
- 526
- Bytes after
- 391
- Saved
- 26%
- 526 → 391 bytes: 26% smaller.
- Only whitespace between tokens was removed — spaces inside strings are data and stay.
- Minify what goes over the wire; keep the pretty version for people.
What is a product feed?
A product feed is how product data travels from a business's own store, ERP or inventory system into the Meta catalogue its WhatsApp Business Account uses. In its classic form it is a file — CSV, TSV, XML (RSS or Atom) or a Google Sheet — with one row per item, which Meta Commerce Manager fetches from a URL on a schedule (hourly, daily or weekly) or accepts as a one-off upload. Each run updates the catalogue, and that WhatsApp Catalog in turn drives the storefront, the catalog message, the single-product and multi-product message types, and the in-chat cart.
Every row uses Meta's product columns. The required ones are id, title, description, availability (such as in stock or out of stock), condition, price written as a number followed by an ISO 4217 currency code (1299.00 INR), link, image_link and brand. Optional columns such as sale_price, item_group_id for variants and additional images add detail. The id column is the content ID that WhatsApp calls the product retailer ID, so the feed decides which identifiers your order webhooks will carry.
Feeds are not the only route into a catalogue. The Catalog Batch API (POST /{CATALOG_ID}/items_batch) creates, updates or deletes items asynchronously, typically within minutes, and suits stock-outs and price changes between scheduled runs; e-commerce platform integrations run their own sync. Many businesses combine a nightly full feed with API updates for stock. In short, the product feed is the pipe, the product retailer ID is the key each row carries, and Commerce Manager is where you check the result — including every upload's errors and warnings.
Key takeaways
- A product feed is the scheduled file or API sync that keeps a Meta catalogue's items, prices and stock in line with your store.
- Meta's required columns are id, title, description, availability, condition, price, link, image_link and brand.
- The feed's id becomes the product_retailer_id that WhatsApp messages and order webhooks carry, so it must never change.
- Scheduled feeds suit full refreshes; the Catalog Batch API (items_batch) suits price and stock changes between runs.
- Run a partial file as an update, never as a replace, or the items it leaves out can be removed from the catalogue.
Operating sequence
How does a product feed work?
Export the right rows
Generate the file from your store or ERP with Meta's columns, one row per purchasable variant, with your SKU in
id. Leave out items you cannot sell instead of sending them with bad data.Host it and schedule the fetch
Publish the file at a stable HTTPS URL (password protection is supported), then add it as a data source in Commerce Manager or with
POST /{CATALOG_ID}/product_feeds, choosing an hourly, daily or weekly schedule.Choose replace or update
A complete file should run as a replace, so products you drop disappear. A partial file — only prices, or only changed items — must run as an update or a supplementary feed, or everything missing from it can be removed.
Push urgent changes through the API
Between runs, send stock-outs and price changes with the Catalog Batch API's
items_batchendpoint, then check the returned handle withcheck_batch_request_statusuntil it reports finished.Read every upload's errors
Each run records errors and warnings: missing required fields, prices that do not parse, images Meta cannot fetch, policy rejections. Review them in Commerce Manager or through the feed's
uploadsedge, and fix the source rather than patching items by hand.
Specifications
A product feed: key facts and limits
- File formats
- CSV, TSV, XML (RSS or Atom), Google Sheets
- Scheduled fetch
- Hourly, daily or weekly from a URL
- Required columns
- id, title, description, availability, condition, price, link, image_link, brand
- Price format
- Number + ISO 4217 code, e.g. 1299.00 INR
- id column
- Becomes product_retailer_id; up to 100 characters
- Between runs
- Catalog Batch API: POST /{CATALOG_ID}/items_batch
- Batch size
- Up to 5,000 requests per call; Meta suggests under 3,000
- Run modes
- Replace (complete file) or update (partial file)
Implementation
A product feed in code
# A stock-out and a sale price between scheduled feed runscurl -X POST "https://graph.facebook.com/v26.0/{CATALOG_ID}/items_batch" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"item_type": "PRODUCT_ITEM","requests": [{ "method": "UPDATE","data": { "id": "CUSHION-IKAT-BLU", "availability": "out of stock" } },{ "method": "UPDATE","data": { "id": "DIYA-BRASS-SET4", "sale_price": "1099.00 INR" } }]}'# → {"handles":["AczS7Pqp..."],"validation_status":[]}# An empty handles list means nothing was ingested: read validation_status# Processing is asynchronous: poll the handle for status and per-item errorscurl "https://graph.facebook.com/v26.0/{CATALOG_ID}/check_batch_request_status?handle={HANDLE}" \-H "Authorization: Bearer {ACCESS_TOKEN}"
The id in data is the same value as the feed's id column and WhatsApp's product_retailer_id. Only the fields you send are changed.
Failure modes
Common mistakes with a product feed
Running a partial file as a replace
A prices-only or changed-items file uploaded as a replace can remove every item it does not list, and product messages break overnight. Use an update run or a supplementary feed for anything less than the full catalogue.
IDs that change between exports
A platform migration or export setting that rewrites
idcreates new items and orphans the old ones: saved product messages fail and order webhooks carry IDs your warehouse cannot match. Pinidto the SKU.Prices without a currency code
1299orRs. 1,299does not parse;1299.00 INRdoes. Use a dot for decimals, no thousands separators, and the same format forsale_price.Image URLs Meta cannot fetch
Images behind a login, blocked by a firewall or bot rule, or redirecting to an error page fail the item. Serve them from public HTTPS URLs and test them from outside your own network.
A schedule slower than your stock
A weekly feed for fast-moving stock means customers order what sold out days ago. Match the schedule to how often stock changes, and push stock-outs through the batch API in between.
Example: An Indore home-décor store's vanishing catalogue
An Indore home-décor store with about 2,600 SKUs exports a nightly CSV from its store platform, which Commerce Manager fetches at 2 am as a replace feed. During the Diwali sale, prices change several times a day, so the backend also sends sale prices and stock-outs through items_batch as they happen. One morning a third of the catalogue is gone from WhatsApp: someone had uploaded a prices-only file to the main feed as a replace. The team re-runs the full export, moves price files to an update schedule, and adds an alert that fires when a run's item count drops sharply or its error count jumps. (Figures illustrative.)
Design intent
Why does a product feed matter?
A WhatsApp catalogue is only as accurate as its last sync. When the feed lags, customers add sold-out items to carts, see yesterday's prices and order products the business no longer stocks — and each of those carts turns into a support conversation that starts with an apology. A reliable feed with stable IDs, a schedule that matches how fast stock moves and someone watching its errors is what lets product messages and the in-chat cart be trusted, by customers and by the team that packs the orders.
Recommended practice
Best practices for a product feed
- Generate the feed from the same database your checkout uses, not from a spreadsheet someone edits by hand.
- Keep one row per purchasable variant and group variants with item_group_id.
- Alert when a scheduled run fails or its item count drops sharply, not only when someone notices missing products.
- Mark sold-out items out of stock instead of deleting them, so their IDs and links keep working — and a back-in-stock alert can fire the moment the feed flips them back.
- Keep products the WhatsApp Commerce Policy does not allow out of the feed, rather than waiting for them to be rejected.