In OpenAI Product Feed campaigns, grouping products only through standard fields such as category, price, or availability may not always be sufficient. E-commerce brands often want to divide their products according to more specific criteria related to their advertising strategy.
For example:
-
High-margin products
-
Best-selling products
-
New-season products
-
Products with strong availability
-
Products with high campaign priority
-
Products belonging to a specific collection
-
Low-performing products with excess inventory
The ads_metadata field in the OpenAI feed structure is a flexible metadata field that can be used for these types of advertising-focused product labels.
You can think of this field as being similar to custom labels in Google Merchant Center or internal labels in Meta Ads product feeds. Our Custom Labels and Internal Label article, where we explain these concepts in detail, can also be a useful starting point.
What is ads_metadata?
ads_metadata is an optional field used to add advertising-related information to products within an OpenAI product feed.
According to the OpenAI product feed specification, ads_metadata is submitted as a JSON object. The keys and values contained in this object must be strings.
A simple example:
{
"bidding_tier": "high",
"product_line": "summer_collection"
}
This structure allows brands to add custom labels that can be used in advertising campaigns in addition to standard product feed fields.
Why is ads_metadata important?
Filtering products only through existing fields may not always be sufficient in Product Feed campaigns.
For example, your product feed may contain the following category information:
Women's Clothing > Dresses
However, your advertising strategy may require you to manage the following product groups within the “Women’s Dresses” category separately:
-
High-margin products
-
Products with strong availability
-
New-season products
-
Best-selling products
-
Products suitable for a summer campaign
This is where ads_metadata becomes useful. By labeling products according to your campaign strategy, it helps you create more controlled product groups during Ad Group setup.
How can ads_metadata be approached like a custom label?
In Google Shopping, custom label fields are used to group products in advertising campaigns and manage bidding strategies with greater control. Similarly, ads_metadata can be used to add advertising-focused signals to products in OpenAI Product Feed campaigns.
The following table compares the custom label approach with the use of ads_metadata:
| Use case | Google custom label example | OpenAI ads_metadata example |
|---|---|---|
| Margin group | custom_label_0 = high_margin |
"margin_group": "high_margin" |
| Season | custom_label_1 = summer |
"season": "summer" |
| Performance group | custom_label_2 = best_seller |
"performance_group": "best_seller" |
| Stock level | custom_label_3 = high_stock |
"stock_level": "strong" |
| Campaign priority | custom_label_4 = priority |
"campaign_priority": "high" |
This approach allows performance marketing teams to manage products through more meaningful groups.
How is ads_metadata submitted technically?
According to the OpenAI product feed specification, ads_metadata is submitted as an object. The keys and values within this object must be strings.
Correct usage
{
"ads_metadata": {
"bidding_tier": "high",
"product_line": "essentials",
"margin_group": "high_margin",
"stock_level": "strong"
}
}
Incorrect usage
{
"ads_metadata": {
"bidding_tier": 3,
"is_priority": true,
"tags": ["summer", "dress", "campaign"]
}
}
In this example, bidding_tier is submitted as a number, is_priority as a boolean, and tags as an array. These values therefore do not comply with the required string key-value structure.
A more appropriate version would be:
{
"ads_metadata": {
"bidding_tier": "3",
"is_priority": "true",
"tags": "summer_dress_campaign"
}
}
How can ads_metadata be represented in a CSV or flat file?
In the File Upload structure, the ads_metadata field should be treated as a JSON object. In flat-file formats such as CSV or TSV, this field can generally be submitted as a JSON string.
Example:
| item_id | title | price | availability | ads_metadata |
|---|---|---|---|---|
| SKU123 | Strappy Midi Dress | 2499 TRY | in_stock | {"bidding_tier":"high","product_line":"summer_collection","stock_level":"strong"} |
| SKU124 | Linen Shirt | 1899 TRY | in_stock | {"bidding_tier":"medium","product_line":"linen_collection","margin_group":"high_margin"} |
| SKU125 | Basic T-Shirt | 699 TRY | in_stock | {"bidding_tier":"low","product_line":"basics","campaign_priority":"always_on"} |
The important point is that the JSON structure must be valid and all values must be submitted as strings.
ads_metadata use case 1: Bidding tier
The bidding_tier field can be used to divide products according to their advertising priority and bidding strategy.
| Product group | ads_metadata example | Use case |
|---|---|---|
| High-priority products | "bidding_tier": "high" |
Higher bids or a separate Ad Group |
| Medium-priority products | "bidding_tier": "medium" |
Balanced bids or targeting in a separate Ad Group |
| Low-priority products | "bidding_tier": "low" |
More controlled budget usage |
Example:
{
"ads_metadata": {
"bidding_tier": "high"
}
}
This structure can be used to manage high-priority products within a separate Ad Group.
ads_metadata use case 2: Product line
The product_line field can be useful for brands that want to create campaigns based on collections, seasons, or product ranges.
| Product line | Example use |
|---|---|
summer_collection |
Summer collection products |
linen_collection |
Linen products |
premium_basics |
Premium basic products |
new_arrivals |
Newly added products |
Example:
{
"ads_metadata": {
"product_line": "summer_collection"
}
}
This field can be especially useful for e-commerce brands selling fashion, home and living, cosmetics, or seasonal products.
ads_metadata use case 3: Margin group
Not all products have the same level of profitability. For certain products, it may be more appropriate to increase or reduce advertising spend.
The margin_group field can be used to separate products according to margin level.
| Margin group | ads_metadata |
|---|---|
| High margin | "margin_group": "high_margin" |
| Medium margin | "margin_group": "medium_margin" |
| Low margin | "margin_group": "low_margin" |
This structure may be preferred by teams that want to manage campaign budgets according to profitability rather than only sales volume.
ads_metadata use case 4: Stock level and campaign capacity
The availability field in the OpenAI product feed indicates whether a product is in stock. However, for some brands, inventory status involves more than an in_stock or out_of_stock distinction.
For example:
-
The product is in stock, but only a small quantity remains
-
The product has high inventory levels
-
A large quantity is stored in the warehouse and needs to be sold
-
The product has a long replenishment lead time
-
The product can support higher demand during a campaign period
Fields such as stock_level or fulfillment_priority can be used for these distinctions.
{
"ads_metadata": {
"stock_level": "strong",
"fulfillment_priority": "campaign_ready"
}
}
This structure can help reduce the inclusion of products that may experience availability problems during advertising campaigns.
ads_metadata use case 5: Performance group
Products can also be labeled according to historical performance signals.
| Performance group | Description |
|---|---|
best_seller |
Best-selling products |
high_ctr |
Products with a high click-through rate |
high_conversion |
Products with a high conversion rate |
low_conversion |
Products that receive traffic but do not generate conversions |
new_product |
New products that do not yet have performance data |
Example:
{
"ads_metadata": {
"performance_group": "best_seller"
}
}
This structure helps brands manage products not only according to category, but also according to their performance potential.
ads_metadata use case 6: Campaign priority
Certain product groups may become strategically more important during specific periods.
For example:
-
End-of-season products
-
Black Friday products
-
New collection products
-
Gift-season products
-
Excess inventory
Fields such as campaign_priority or campaign_theme can be used in these situations.
{
"ads_metadata": {
"campaign_priority": "black_friday",
"campaign_theme": "gift_season"
}
}
This structure makes it easier to filter products quickly during campaign periods.
Recommended field structure for ads_metadata
The following structure can be a useful starting point for many e-commerce brands:
| ads_metadata key | Example values | Use case |
|---|---|---|
bidding_tier |
high, medium, low |
Bidding and budget priority |
product_line |
summer_collection, premium_basics |
Collection or product range |
margin_group |
high_margin, medium_margin, low_margin |
Profitability group |
stock_level |
strong, medium, limited |
Inventory level |
performance_group |
best_seller, high_conversion, new_product |
Performance segment |
campaign_priority |
seasonal, clearance, always_on |
Campaign priority |
lifecycle_stage |
new_arrival, mature, end_of_life |
Product lifecycle stage |
Using all of these fields is not required. The most appropriate structure should be selected according to the brand’s campaign management strategy.
What should be considered when using ads_metadata?
Because ads_metadata is a flexible field, using it without a clear plan can create confusion.
Key considerations include:
-
Key names should be standardized.
-
Different values should not be used for the same meaning.
-
Values should be submitted in lowercase and in a consistent format.
-
Using underscores instead of spaces creates a more consistent structure, such as
best_sellerinstead ofbest seller. -
Non-string values should be converted into strings.
-
Too many metadata fields should not be added.
-
Marketing, e-commerce, and technical teams should use the same terminology.
-
Labels should be updated regularly.
-
Labels associated with completed campaigns should be removed.
Example of inconsistent usage:
{
"ads_metadata": {
"stock_level": "High",
"stockStatus": "strong",
"stock_segment": "yüksek"
}
}
A more appropriate structure:
{
"ads_metadata": {
"stock_level": "strong"
}
}
How can Ad Groups be structured using ads_metadata?
Product filters are used when creating Ad Groups in OpenAI Product Feed campaigns. If standard feed fields are not sufficient to group products in the required way, the ads_metadata field can support this segmentation.
Example Ad Group structure:
| Ad Group | Possible ads_metadata filter |
|---|---|
| High-priority products | bidding_tier = high |
| Summer collection | product_line = summer_collection |
| Best-selling products | performance_group = best_seller |
| Products with strong availability | stock_level = strong |
| End-of-season campaign | campaign_priority = clearance |
This structure makes campaign setup more manageable.
How can Optifeed support this process?
Optifeed is an AI-powered product feed optimization platform that helps e-commerce brands prepare their product data for advertising platforms and AI shopping experiences.
For fields such as ads_metadata to work effectively, products need to be segmented correctly. Optifeed helps brands group products according to signals such as performance, availability, price, margin, category, season, or campaign priority.
With Optifeed, brands can:
-
Transfer custom label and internal label strategies into the OpenAI product feed structure.
-
Label products according to campaign priority.
-
Create
ads_metadatafields for OpenAI product feeds. -
Keep availability, price, and category data up to date.
-
Make product titles and descriptions easier to understand through AI Enrich.
-
Manage multichannel feeds for platforms such as Google, Meta, TikTok, and OpenAI.
The objective is not simply to populate a metadata field correctly from a technical perspective. The real objective is to transform product data into a more useful structure that supports the campaign strategy.
