> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.omegatheme.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Improve your catalog match rate

# Improve your catalog match rate

Your catalog match rate tells you how many of the products shoppers view, add to cart or buy on your store can be matched to a product in your ad catalog. A low match rate means dynamic ads, retargeting and conversion reports can't tell which product a shopper looked at. This article covers:

1. **How matching works** — the same rule on every channel.
2. **Find the Content ID your pixel sends** — on Facebook and Google.
3. **Compare it with the ID Omega sends** — in the feed's mapping.
4. **Fix the mismatch** — change the ID mapping so both sides agree.

![A catalog with a low match rate](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_ihb11o.png)

## How catalog matching works

Two things describe the same product to an ad channel:

- **Your pixel** — the tracking code on your store. Every time a shopper views a product, adds it to cart or buys it, the pixel sends an event with the product's **Content ID**.
- **Your product feed** — what Omega sends to the channel. Every product in the feed has an **ID**.

The channel matches the two by comparing them as plain text. When the pixel's Content ID and the feed's ID are exactly the same, the event is matched to that product. When they differ even slightly, the event can't be matched and is lost for dynamic ads and product reporting.

|| Matching is exact. `12345 `, `shopify_12345` and `shopify_US_12345_67890` are three different IDs to the channel, even when they describe the same product.

Each channel names the two sides differently:

| Channel | Pixel sends | Feed attribute in Omega |
| ---- | ---- | ---- |
| **Facebook & Instagram** | `content_ids` (Meta Pixel) | **ID** |
| **Google Shopping** | `item_id` / `id` (Google tag) | **Offer ID** |
| **XML feeds** (TikTok, Microsoft, Pinterest, Klaviyo) | Depends on the channel's pixel | **ID** |

By default, Omega sends the Shopify **Variant ID** as the ID, for example `42647978475616`. Most pixels installed by Shopify's own sales channel apps send the Variant ID too, so they match out of the box. Mismatches usually come from a pixel installed by a theme, a tracking app or an agency that sends a different format.

### What your match rate tells you

Before changing anything, look at how low the rate is. A rate of 0% and a rate that is just low have different causes.

| Match rate | Likely cause | What to do |
| ---- | ---- | ---- |
| **0%** | The pixel and the feed use different ID formats, so no event can match any product. This is almost always the ID mapping. | Follow the steps below to compare the two IDs and fix the mapping. |
| **Low, but above 0%** | The ID format is already right, because some events do match. The feed was probably created recently, or you recently added products to it. Meta only matches events against products that are already in the catalog, and it recalculates the rate from past events. | Don't change your mapping. Wait a few days for Meta to process new events against the updated catalog, then check again. |

|| If your rate is low but above 0%, changing the ID makes things worse: every product becomes new to the channel and the rate drops again while Meta relearns it.

## Find the Content ID on your Facebook pixel

1. Install the [Meta Ads Data Advisor](https://chromewebstore.google.com/detail/meta-ads-data-advisor/fdgfkebogiimcoedlicjlajpkdmockpc) extension in Google Chrome.
2. Open a product page on your online store, choose a variant, and click the Pixel Helper icon.
3. Expand the **ViewContent** event and look at **content\_ids**. That value is the Content ID your pixel sends.
4. Note the product and variant you opened, so you can compare the same one in Omega.

![Meta Pixel Helper showing content_ids on ViewContent](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_1fmzq4m.png)

| You can also check in **Meta Events Manager**: open your pixel, go to **Test events**, enter your store URL and browse a product. Each event shows its **content_ids**.

## Compare it with the ID Omega sends

Start with the data Omega actually sent to the channel for that variant:

1. In Omega Feed, open the feed for that channel and go to the **Products** tab.
2. Click **Add filter** (the filter icon) and enter the variant ID of the product you opened on your store.
3. Click the product in the list to open its detail page.
4. In the **Preview** card, read **ID** (Facebook and XML) or **Offer ID** (Google). This is the final value in your feed after every mapping and rule is applied. The **Data sync to channel** table (**Data generated** for XML feeds) shows the same value next to the other attributes.
5. Compare it with the Content ID from your pixel.

![Find your product on Feed Products Tab](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_3yxraw.png)
![The ID and Offer ID in the product detail Preview card](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_16ar4x.png)

| If the two values match, the feed isn't the cause, so don't change your settings. Check **Troubleshooting** at the end of this article instead.

Only when the two values differ, look at where the feed's ID comes from:

1. Go to the **Configuration** tab and scroll to **Product attributes mapping**. Use the product picker above the table to preview the same product.
2. Find the **ID** row (Facebook and XML) or the **Offer ID** row (Google). The **Preview** column shows the value the current mapping produces for that product.

![The ID row in Product attributes mapping with its Preview](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_6zc40a.png)

| What your pixel sends | What Omega sends | Result |
| ---- | ---- | ---- |
| `42647978475616` | `42647978475616` | Match — nothing to fix |
| `8123456789` | `42647978475616` | Pixel sends Product ID, feed sends Variant ID |
| `ABC-RED-M` | `42647978475616` | Pixel sends SKU, feed sends Variant ID |
| `shopify_US_8123456789_42647978475616` | `42647978475616` | Pixel adds a prefix, country and Product ID |

To tell a Product ID from a Variant ID, open the product in Shopify admin and choose a variant: the URL ends in `/products/<product ID>/variants/<variant ID>`.

## Fix the mismatch with mapping

Change the feed's ID so it produces exactly what the pixel sends.

1. In **Product attributes mapping**, click the edit icon on the **ID** or **Offer ID** row. **Edit attribute mapping** opens.
2. In **Default value**, build the ID from variables and plain text. Type or pick a variable to insert it; anything else you type is sent as is.
3. Check the **Preview** next to it. It must equal your pixel's Content ID character for character.
4. Click **Save** in the modal, then **Save** the feed and let it sync.

|| Editing a mapping value needs the **Scale** plan or higher. On lower plans **Default value** shows a lock badge.

Use the row that matches your pixel:

| Your pixel sends | Set Default value to |
| ---- | ---- |
| Variant ID, e.g. `42647978475616` | **Variant ID** (the default) |
| SKU, e.g. `ABC-RED-M` | **SKU** |
| Product ID, e.g. `8123456789` | **Product ID** |
| `shopify_US_8123456789_42647978475616` | `shopify_` **Market - Country** `_` **Product ID** `_` **Variant ID** |

- **SKU** works only when every variant has a unique SKU in Shopify. Variants with an empty or duplicate SKU get the same ID and overwrite each other on the channel.
- **Product ID** gives every variant of a product the same ID, so the channel keeps only one of them. Use it only for products without variants.
- **Market - Country** inserts the feed's target country code, such as `US`. If you run one feed per country, each feed produces its own country's IDs automatically.

||| Changing the ID of an existing feed makes the channel treat every product as new. Products go through review again, and their past performance and approval history don't carry over. Change it once, when you are sure of the format, not by trial and error.

After the next sync, give the channel a day or two to process new events before checking the match rate again.

## Troubleshooting

### My pixel sends different IDs on different pages

Some themes or apps send the Product ID on product pages and the Variant ID at checkout. Match the ID on the events that matter most for your ads, usually **ViewContent** / **view\_item** and **Purchase**. If they disagree, fix the pixel setup first; a feed can only match one format.

### I don't see content\_ids or item\_id at all

Your pixel isn't sending product data, so no feed ID can match it. Check that the pixel is connected through Shopify's sales channel app or your tracking app, and that it fires **ViewContent** / **view\_item** on product pages.

### The Preview matches but the match rate is still low

The match rate is calculated from past events, so it improves only as new events come in after your fix. The same applies to a new feed, or a feed you just added products to: give Meta a few days to catch up. Also check that the product is actually in the feed: products excluded by **Product source**, or disapproved by the channel, can't be matched.

### I have two feeds on the same channel

Each feed has its own mapping. Fix the **ID** or **Offer ID** in every feed that sends products to the same catalog or Merchant Center account.