01 · Definition
What is the product retailer ID?
The product retailer ID (product_retailer_id) is the identifier a business assigns to each item in the catalogue behind its WhatsApp catalog. Meta Commerce Manager shows it as the item's content ID, a product feed carries it in the id column, and the Catalog API calls it retailer_id; Meta recommends using your own SKU. On the WhatsApp Business Platform the same value appears as product_retailer_id — the field you put in a message to say which product to show, and the field WhatsApp sends back when a customer asks about or orders that product.
It is not the long numeric ID Meta assigns to every catalogue item, and it is not the catalog_id. Messages always pair the two: catalog_id says which catalogue, product_retailer_id says which item in it. A single-product message sends one in action.product_retailer_id, a multi-product message lists one per item in sections[].product_items, a single-product template takes the pair in a product header parameter, and a multi-product template lists IDs in its MPM button's action.sections at send time. If the pair matches no item in the connected catalogue, the API returns an error and nothing is sent.
On the way back the ID appears in two kinds of inbound payload on the messages webhook. An order message, the in-chat cart a customer sends, lists order.product_items[], each with product_retailer_id, quantity, item_price and currency. A text message the customer sends by tapping Message business on a product carries context.referred_product with the catalog_id and product_retailer_id of the item they were viewing. Because the business chose the ID, both payloads map straight onto its own stock, pricing and order records — as long as the ID never changes.
Key takeaways
- The product retailer ID is the business's own ID for a catalogue item, its content ID and usually its SKU, not Meta's numeric item ID.
- Every product message pairs catalog_id with product_retailer_id; an unknown ID makes a single-product send fail and is dropped from a multi-product list.
- Order webhooks list product_retailer_id, quantity, item_price and currency per item, so a stable SKU maps orders straight onto stock.
- Give each purchasable variant its own ID and never re-key the catalogue, or saved campaigns and in-flight carts stop resolving.
02 · Specifications
The product retailer ID: key facts and limits
| Field in messages and webhooks | product_retailer_id |
|---|---|
| Name in Commerce Manager | Content ID (feed column id) |
| Recommended value | Your SKU, one per purchasable variant |
| Length | Up to 100 characters (Meta feed spec) |
| Uniqueness | Within one catalogue — always paired with catalog_id |
| Catalogues per WABA | 1, shared by its phone numbers |
| Returned in | order.product_items[] and context.referred_product |
03 · Operation
How does the product retailer ID work?
Assign the ID when the item is created
Every item added in Commerce Manager, through a data feed or with the Catalog API gets a retailer ID. Use the SKU: unique within the catalogue, up to 100 characters in Meta's feed spec, and never reused for a different product.
Connect the catalogue to the WhatsApp Business Account
A WhatsApp Business Account can have only one catalogue connected, though that catalogue can serve several of its phone numbers. Every
product_retailer_idyou send resolves against that one catalogue.Reference it when you send
Interactive
productandproduct_listmessages carrycatalog_idplus one or moreproduct_retailer_idvalues. A single-product template receives the pair in aproductparameter of its header; a multi-product template takes the IDs, plus athumbnail_product_retailer_id, in its MPM button'saction.Read it back from webhooks
Orders arrive as messages with
type: "order"andorder.product_items[].product_retailer_id; product enquiries arrive as text messages withcontext.referred_product.product_retailer_id.Join it to your own records
Look the ID up in your product table, keyed by
catalog_idand retailer ID, to check stock, re-price from your source of truth, route the chat to the right team and create the order.
04 · Code samples
The product retailer ID in code
curl -X POST "https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"messaging_product": "whatsapp","recipient_type": "individual","to": "919812345678","type": "interactive","interactive": {"type": "product_list","header": { "type": "text", "text": "Kurtas in your size" },"body": { "text": "Both colours are back in M." },"action": {"catalog_id": "{CATALOG_ID}","sections": [{"title": "Cotton kurtas","product_items": [{ "product_retailer_id": "KUR-CHK-BLU-M" },{ "product_retailer_id": "KUR-CHK-GRN-M" }]}]}}}'
A multi-product message: `catalog_id` once, then one `product_retailer_id` per item. Use your SKU, never Meta's numeric item ID.
05Playground
A working model of Product Retailer ID. Use its controls to replay it step by step.
Route product enquiries by their retailer ID
Only agents with the required skill are eligible; the least busy of them wins.
Incoming · 0 left
- All 8 conversations have been routed.
Conversation 8 of 8 · Skills-based
No referred_productgoes toFarah
No skill needed, so the least-busy agent, Farah, takes it.
- Full
Meera
3 of 3 open
- Sarees
- SAR-KAN-014needs Sarees
- SAR-BAN-002needs Sarees
- SAR-CHN-031needs Sarees
- Full
Arjun
2 of 2 open
- Kurtas
- KUR-CHK-BLU-Mneeds Kurtas
- KUR-LIN-WHT-Lneeds Kurtas
- Full
Farah
2 of 2 open
- Footwear
- Kurtas
- JUT-MOJ-07needs Footwear
- No referred_product
Waiting · 1
- 88231 (old feed ID)needs Unmapped ID
| Strategy | Routed | Waiting | Skill mismatches |
|---|---|---|---|
| Skills-based | 7 | 1 | 0 |
| Round-robin | 7 | 1 | 3 |
Conversation 8 of 8, No referred_product: No skill needed, so the least-busy agent, Farah, takes it.
06 · Worked example: A re-keyed catalogue in Surat
Example: A re-keyed catalogue in Surat
An ethnic-wear seller in Surat moves its online store to a new platform, and the new feed exports numeric IDs instead of the old style-colour-size SKUs. Overnight, every multi-product message saved in its campaign tool fails with a product-not-found error, and carts from messages sent the day before list IDs its warehouse system cannot match. The fix is to set the feed's id back to the SKU and keep a temporary old-to-new map in the order handler, so in-flight carts still resolve while the catalogue settles.
07 · Cautions
Common mistakes with the product retailer ID
Sending Meta's item ID instead
The long number in a Commerce Manager item URL is Meta's own object ID. Messages expect the retailer ID you assigned; send the other one and the API reports that no matching product exists.
Re-keying the catalogue
A platform migration or feed rebuild that generates new IDs breaks saved campaigns, template sends and carts already in customers' chats. Keep IDs stable, and if a change is unavoidable, map old IDs to new ones in your order handler for a transition period.
One ID for several variants
If every size of a kurta shares one retailer ID, the order webhook cannot tell M from L. Give each purchasable variant its own ID and group variants with the feed's
item_group_idinstead.Trusting the webhook price
item_pricereflects the catalogue when the cart was built, and catalogues can lag your store. Re-price and check stock from your own records before you ask for payment.Case and whitespace drift
Treat the ID as an exact string. A spreadsheet export that lower-cases values or adds a trailing space creates IDs that look identical to a person but match nothing; normalise them at export time.
08 · Rationale
Why does the product retailer ID matter?
The retailer ID is the join key between WhatsApp and the rest of your commerce stack. Make it your stable SKU, the same value your website, ads events and warehouse use, and every order webhook and product enquiry lands on the right stock record, price and team without a lookup table. Let it drift when a feed is rebuilt and carts start arriving that name products your systems have never heard of.
09 · Recommended practice
Best practices for the product retailer ID
- Use the same value as
content_idsin your Meta Pixel and Conversions API events, so ads and WhatsApp share one product identity. - Prefer readable, structured SKUs such as line-style-colour-size: logs, alerts and routing rules become legible at a glance.
- Store
catalog_idwith every order so a later catalogue switch never orphans your order history. - Route product enquiries by the ID's product line — the chat already says which item the customer means.
10 · Questions and answers
Product Retailer ID FAQs
- Is the product retailer ID the same as the SKU?
- Usually, but only because businesses choose it that way: it is whatever you set as the item's content ID. Meta recommends the SKU, and any stable value that is unique within the catalogue works.
- Where do I find an item's retailer ID?
- In Commerce Manager, look for the item's content ID. In a product feed it is the
idcolumn, and through the Catalog API it is the product item'sretailer_idfield. - What happens if I send an ID that is not in the catalogue?
- A single-product message fails with an error and is not sent. In a multi-product message, unmatched items are left out of the list and the rest can still go out; if none match, the send fails. Either way, treat the error as a sign your sender and catalogue have drifted apart.
- Can two catalogues use the same retailer ID?
- Yes. Uniqueness is only required within one catalogue, which is why every message and webhook pairs
product_retailer_idwithcatalog_id. - Why does the API say my product does not exist?
- Almost always because the ID and catalogue do not match. Check that you sent your own retailer ID rather than Meta's numeric item ID, that
catalog_idis the catalogue connected to this WhatsApp Business Account, and that the string matches exactly, including case and trailing spaces.