How does it work?
Dynamic Product Catalog makes your campaigns more impactful by showcasing personalized product recommendations from your Product Catalog.
Each product links to its product detail page, giving shoppers a seamless path from discovery to purchase.
For brands with five or more SKUs, Dynamic Product Catalog creates more relevant shopping experiences and consistently drive higher performance, with advertisers typically seeing a 10–25% lift in conversion metrics.
Getting started
To use a dynamic product catalog, first configure your Product Catalog via the Catalog Manager.
There are three ways to add your Product Catalog.
To choose from these,
- In Axon Ads Manager, click the tag icon (
) to open the Catalog manager.
- Next to the name of the catalog, click the pencil icon (
) to open the Edit Catalog page.
- Choose from one of the three Data source options:
- From Axon Pixel
- Import from a file
- Connect Shopify
The following sections describe these three options.
1. From Axon Pixel (inferred method)

Inferred catalogs are the default method of catalog creation for non-Shopify sites that don’t otherwise provide a CSV stream.
This method uses information registered in pixel events to build the product catalog.
For finer control over which items are included in your catalog, choose methods 2 and 3.
Important data requirements for inferred method
- Verify that your pixel sends
item_id and item_variant_id with all purchase and view_item events, with the proper hierarchy
item_id: represents the parent item independent of its variants.
Multiple item_variant_ids may share the same item_id.
item_variant_id: for example a size or color variation of the parent item.
Every variant in your catalog must have an item_variant_id that is not shared by any other variant or item.
item_id and item_variant_id values passed with purchase events should match those passed with view_item events.
- Ensure
image_url is passed with view_item events, and that the URL links to a high quality image with a proper file extension.
item_category_id is a highly recommended field.
2. Import from a file (CSV feed)

CSV stream catalogs give you finer control over which products are in your product catalog.
There are two ways you can integrate a CSV streamed catalog:
- Data feed provider: You can insert a catalog CSV feed generated through a feed provider, by leveraging one of the partners listed on the Third-party catalog feeds page.
- Custom CSV file: You can provide an endpoint to Axon from which it downloads the product catalog in a
.csv format on a daily basis.
To do this:
- Add your catalog information to the Catalog CSV template.
- Upload your CSV to a publicly accessible location.
See this example.
- Update this CSV whenever your catalog changes (AppLovin recommends that you update daily).
AppLovin syncs your catalog stream once per day.
- Ensure
salesPrice never exceeds price, as this causes catalog sync issues due to data integrity concerns.
- Ensure that no fields contain commas (you may use commas only to separate fields).
Important data requirements for the CSV feed method
- Verify that your pixel sends
item_id and item_variant_id with all purchase events, with the proper hierarchy
item_id: represents the parent item independent of its variants.
Multiple item_variant_ids may share the same item_id.
item_variant_id: for example a size or color variation of the parent item.
Every variant in your catalog must have an item_variant_id that is not shared by any other variant or item.
- These fields (
item_id and item_variant_id) passed with purchase events should match the values sent in the CSV in their respective columns (itemId and id)
3. Connect Shopify

If you integrated the Shopify app pixel, you can sync your product catalog by using the Connect Shopify method in the Catalog Manager.
A benefit of this method is that your catalog is updated with the latest products on your site, including product pricing and availability.
How to enable dynamic catalog in your campaigns
After you sync your Catalog by using one of the above methods, activate Enable Dynamic Catalog when you create your campaign and choose which Catalog to use.
Glossary
| Term | Definition |
|---|
| catalog | A catalog holds the products you intend to sell. AppLovin recommends that you have only one catalog for all your products. |
| variant | Variants are individual SKUs to sell. Every SKU should be its own variant. The catalog manager considers variants that have the same itemId to be variants of the same item. For example, a Red Small Shirt, Red Large Shirt, and Blue Large Shirt by the same brand are each their own variant but share the same itemId. |
The Variant object
| Field | Type | Required? | Description |
|---|
additionalImageUrls | String[] | no | Additional images associated with the variant. Valid extensions are .jpg, .jpeg, and .png. Use semicolon characters rather than commas to separate items in this array. |
additionalVideoUrls | String[] | no | Additional videos associated with the variant. Valid extension is mp4. Use semicolon characters rather than commas to separate items in this array. |
ageGroup | String | no | One of ADULTS, ALL_AGES, INFANT, KIDS, NEWBORN, or TODDLER |
brand | String | no | Ignored if another variant exists with the same itemId. Must be no longer than 256 characters. |
categoryId | Integer | yes | Google category ID |
description | String | yes | A short description of the variant. The description should be concise and informative, no longer than 8192 characters. |
gender | String | no | One of FEMALE, MALE, or UNISEX |
id | String | yes | The ID of the variant. This must match the item_variant_id in your pixel. Must be no longer than 64 characters. |
isAvailable | Boolean | yes | Whether the variant is available or out of stock |
isBundle | Boolean | yes | Whether the variant is a collection of multiple items sold together |
itemId | String | yes | The ID shared across variants of an item. This must match the item_id in your pixel. Must be no longer than 64 characters. |
multipackQuantity | Number | no | The number of identical items in a single pack |
name | String | yes | The name of the variant. Must be no longer than 1024 characters. |
numberOfReviews | Number | no | The total number of reviews of the variant |
price | Decimal | yes | The price of the variant. If the variant is on sale, price should be the original price before the sale. |
primaryImageUrl | String | yes | The primary image associated with the variant, shown by default when the variant displays. Valid extensions are .jpg, .jpeg, and .png. Must be no longer than 2048 characters. |
primaryVideoUrl | String | no | The primary video associated with the variant, shown by default when the variant displays. Valid extension is mp4. Must be no longer than 2048 characters. |
rating | Decimal | no | The rating of the variant, on a scale from 0 to 5. null if there is no rating. |
rewardEndDate | DateTime | no | When the rewardPercent validity ends. Format this as a UTC time according to ISO-8601, without a time zone offset (for example: 2025-01-07T00:00:00). If rewardStartDate and rewardEndDate are both null, the rewardPercent is not active. If only rewardEndDate is null, the rewardPercent is active beginning at the rewardStartDate. |
rewardPercent | Number | no | The percent-reward that a customer receives for purchasing the variant, expressed as a number between 0 and 100 |
rewardStartDate | DateTime | no | When the rewardPercent begins to be valid. Format this as a UTC time according to ISO-8601, without a time zone offset (for example: 2025-01-01T00:00:00). If rewardStartDate and rewardEndDate are both null, the rewardPercent is not active. If only rewardEndDate is null, the rewardPercent is active beginning at the rewardStartDate. |
salePrice | Decimal | no | The on-sale price of the variant. null if the variant is not on sale. |
salePriceEndDate | DateTime | no | When the salePrice validity ends. Format this as a UTC time according to ISO-8601, without a time zone offset (for example: 2025-01-07T00:00:00). If salePriceStartDate and salePriceEndDate are both null, the salePrice is not active. If only salePriceEndDate is null, the salePrice is active beginning at the salePriceStartDate. |
salePriceStartDate | DateTime | no | When the salePrice begins to be valid. Format this as a UTC time according to ISO-8601, without a time zone offset (for example: 2025-01-01T00:00:00). If salePriceStartDate and salePriceEndDate are both null, the salePrice is not active. If only salePriceStartDate is null, the salePrice is active until the salePriceEndDate. |
webUrl | String | yes | The product landing page URL. This page must have the pixel running and fire a view item event. |
If an entry in your CSV data contains double quote characters ("), this can cause errors in the CSV parser if you do not properly escape those characters.
You escape a double quote character by preceding it with a backslash (\), for example:
If an entry in your CSV data contains double quote characters ("), this can cause errors in the CSV parser if you do not properly escape those characters.
You escape a double quote character by preceding it with a backslash (\), for example: