Skip to content
Criteo
Ad platforms

Criteo feed for Shopify

Criteo is not a marketplace and not a comparison site. It is a retargeting network that builds Dynamic Ads from your Product Catalog in real time, and the catalog is a feed you host. Feedflock turns your Shopify catalog into the Google-format XML that Criteo's own guide asks for, with IDs that match your pixel, and keeps the URL fresh for Criteo's daily imports.

01 · ShopifyProduct in the catalog
Linen shirt SandNordlin · Men's shirtsSKU-2048 · S–XL
Price
$59
In stock
0 pcs
When out of stock
02 · criteo.xmlUpdated just now
<item>
<g:id>SKU-2048</g:id>
<g:item_group_id>8812345678901</g:item_group_id>
<g:title>Linen shirt Sand M</g:title>
<g:description>Soft linen shirt with a regular fit.</g:description>
<g:link>https://shop.example/products/linen-shirt-sand?variant=46123456789012</g:link>
<g:image_link>https://cdn.shop.example/files/linen-shirt-sand.jpg?v=1718000000</g:image_link>
<g:price>59.00 USD</g:price>
<g:availability>out of stock</g:availability>
<g:brand>Nordlin</g:brand>
<g:google_product_category>Apparel &amp; Accessories &gt; Clothing &gt; Shirts &amp; Tops</g:google_product_category>
<g:product_type>Men's shirts</g:product_type>
<g:condition>new</g:condition>
<g:size>M</g:size>
</item>
Category mapping

Your product types. The channel's categories.

The channel files offers under its own category tree. Feedflock suggests a category for each Shopify product type and you just confirm. One mapping covers every product of that type, including products you add later.

Full category path in the feed
One mapping per product type
Override per individual product
Shopify typeproducts
Channel category
Men's shirts
Catalog coverage79 %
−20% off compare-at
Productg:price (regular)g:sale_​price
Linen shirt Sand$59.00$47.20
Mug Fjord 350 ml$18.00$14.40
Trail Pro$139.00$111.20
Backpack Ridge 28 l$89.00$71.20
Soy candle Les$16.00$12.80
$64.20saved across these products
5 / 5products with the sale overlay
Sale prices

A discount is a second price, and Criteo names them backwards.

In Criteo's own vocabulary, price is the final price after a discount and retailprice the standard one: the reverse of Google's names. A Google-format feed carries the same pair as g:price and g:sale_price, and Criteo's locked Google rules do the swap. Feedflock sends g:price as the regular (compare-at) price and g:sale_price as the amount actually charged, so Criteo's layouts can show the strikethrough.

Feed health

Catch feed issues before Criteo does.

Before every generation Feedflock checks that every field the channel requires is filled, and, on templates verified against the channel's own spec, that the values fit its rules. Most problems are fixed with one click, without editing products in Shopify.

Feed quality · criteo.xml
76 / 100
To review: 4
No image on 4 productsimage_link is required. A product missing its ID, name, URL or image is Not Displayable in Criteo and never reaches a banner.
Missing item_group_id on 6 variantsCriteo labels item_group_id Required: it groups a product's variants so one banner doesn't show duplicates.
Empty description on 3 productsdescription is Required: plain text with no HTML, up to 5,000 characters.
Missing product ID on 2 productsid is Required and must exactly match the ID your Criteo pixel sends; changing it later disrupts display and reporting.

Setup

Live in five steps

From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.

  1. Start with a Criteo account and the pixel

    A Criteo Commerce Growth account is opened with Criteo, not self-serve, and the pixel on your site reports the product IDs people view. The feed's id must match those exactly, or retargeting falls apart.

  2. Install Feedflock

    Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.

  3. Pick the Criteo template

    Create a new feed and choose the Criteo template: Google-format RSS 2.0, one item per variant. id, item_group_id, title, description, link, image_link and price come mapped from the start.

  4. Keep the IDs in line with your pixel

    The feed's id defaults to the SKU, else the Shopify variant ID. Criteo warns that any change to product IDs disrupts display and reporting, so pick the value your pixel sends and keep it stable.

  5. Add the feed URL in Criteo

    In Commerce Growth, go to Assets > Product Catalog > Feeds > Add feed and choose Product Feed URL. Test Setup detects the Google structure by itself (3 mappings and 9 locked rules), then Import to catalog. Imports run daily, up to four times a day.

    https://feedflock.appfleece.com/f/demo-criteo/criteo.xml

The feed

What the channel receives

criteo.xml
<item>
  <g:id>SKU-2048</g:id>
  <g:item_group_id>8812345678901</g:item_group_id>
  <g:title>Linen shirt Sand M</g:title>
  <g:description>Soft linen shirt with a regular fit.</g:description>
  <g:link>https://shop.example/products/linen-shirt-sand?variant=46123456789012</g:link>
  <g:image_link>https://cdn.shop.example/files/linen-shirt-sand.jpg?v=1718000000</g:image_link>
  <g:price>59.00 USD</g:price>
  <g:availability>in stock</g:availability>
  <g:brand>Nordlin</g:brand>
  <g:google_product_category>Apparel &amp; Accessories &gt; Clothing &gt; Shirts &amp; Tops</g:google_product_category>
  <g:product_type>Men's shirts</g:product_type>
  <g:condition>new</g:condition>
  <g:size>M</g:size>
</item>
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

$59

Feed fields

g:id

SKU-2048

g:item_group_id

8812345678901

g:title

Linen shirt Sand M

g:description

Soft linen shirt with a regular fit.

g:link

https://shop.example/products/linen-shirt-sand?variant=46123456789012

g:price

59.00 USD

g:availability

in stock

g:brand

Nordlin

g:google_product_category

Apparel & Accessories > Clothing > Shirts & Tops

g:product_type

Men's shirts

g:condition

new

g:size

M

The channel

Ads built from your catalog, in real time

Criteo's Dynamic Ads and Showcase ads are assembled from the Product Catalog. Nothing is ever listed on a Criteo-owned site; the feed is ad inventory across Criteo's publisher network.

Your Google feed already qualifies

Criteo's own guide says it: already using a Google or Facebook product feed? You can reuse the same file, no extra formatting required. Test Setup maps it automatically.

Sold out leaves the banners, not the feed

Items marked out of stock are excluded from the banners by Criteo itself, so the feed can always carry the whole catalog, and a restock comes back on its own with the next import.

The feed

  • The Google RSS 2.0 body Criteo's own guide shows: one item per variant, every attribute g:-prefixed, the spelling Criteo's XML sample uses
  • id defaults to the SKU (else the variant ID) and item_group_id to the numeric product ID, so the two can never collide, a collision Criteo calls undefined behavior
  • Variant-aware titles up to Criteo's 500 characters, and descriptions sent as plain text with the HTML stripped
  • g:price keeps the regular price and g:sale_price the amount actually charged, the pair Criteo's locked rules read as retailprice and price
  • Availability in Criteo's spaced values in stock / out of stock / preorder; sold-out variants stay in the feed and Criteo keeps them out of the banners
  • Categories from Google's taxonomy, which Criteo accepts as an ID or a full path, with your own product_type alongside
  • A readiness check lists required fields that came out empty before Criteo marks the products Not Displayable, and fetch tracking warns you if the imports stop

Deep dive

01

A URL Criteo polls, not a file you upload

  • Three connection types; Product Feed URL is the one a hosted feed fits
  • CSV or XML in the Google Feed format, ZIP or GZ compression supported
  • Imports run daily by default, up to four times a day in UTC, with manual import anytime
  • A stability threshold blocks an import that loses too many products at once
Technical details

Criteo offers three ways to connect a catalog: an e-commerce-platform integration (Shopify among 35+), a Product Feed URL it polls, and Criteo's own FTP. The feed URL is the one that gives you control of the file. The feed must be CSV or XML in the Google Feed format, and ZIP or GZ compression is supported across all connection types.

Criteo imports the catalog every day, you can schedule up to four imports a day (UTC), and a manual import can be launched at any time. Two safety rails sit on the merchant's side: if your server filters by IP, Criteo's ranges 178.250.0.0/21 and 2a02:2638::/32 need allow-listing, and the Feed Stability threshold blocks an import in which too many products would become non-displayable at once, until you review it. Feedflock hosts the file on a stable URL and regenerates it every hour, so every import picks up current prices and stock.

02

A Google feed, because Criteo says so

  • Criteo's own tip: a Google or Facebook feed can be reused as-is
  • Its XML sample is a Google Shopping feed, not a Criteo-shaped one
  • Test Setup turns a Google feed into 3 mappings and 9 locked rules
  • The mappings rename title → name, link → producturl, image_link → bigimage
Technical details

Criteo's setup guide says it three times: a feed for the URL connection must be CSV or XML in the Google Feed format, a Google or Facebook feed can be reused with no extra formatting, and the guide's own XML sample is a Google RSS 2.0 document. There is no Criteo XML dialect of its own.

When a Google-structured feed arrives, Test Setup builds a ready-to-use configuration with 3 mappings and 9 predefined rules, locked because they align Google's structure with Criteo's specification. The mappings cover the three names where Criteo's vocabulary differs: title becomes name, link becomes producturl, image_link becomes bigimage. Every other field name is the Google name, which is exactly the spelling Feedflock emits.

03

IDs, variants and the pixel

  • id, at most 50 ASCII characters, must exactly match the ID the pixel reports
  • Changing product IDs disrupts display and reporting
  • item_group_id groups variants and must never equal any id
  • gtin takes 8, 12, 13 or 14 digits; mpn is required when there is no GTIN
Technical details

The pairing that matters on Criteo is to the pixel: the feed's id must exactly match the ID your website pixel reports for the same product, and Criteo warns that any change to product IDs disrupts display and reporting. The template defaults id to the SKU, falling back to the Shopify variant ID. Each variant of a product needs its own distinct id, grouped under a shared item_group_id, and the two ranges must never meet, because an id equal to an item_group_id is undefined behavior and updates may be ignored.

Criteo labels gtin and mpn Required, with a condition attached: the MPN is required for products without a GTIN, and products with neither may not be eligible for all features (they are still displayable). The template therefore treats them as a conditional pair rather than hard requirements: gtin comes from the Shopify barcode (8, 12, 13 or 14 digits) and mpn stays empty unless you map a real manufacturer number.

04

Prices, discounts and stock

  • A period decimal, no thousands separator, ISO currency in the value: 59.00 USD
  • Criteo's price is the final price after a discount; retailprice is the standard one
  • In the Google format that pair is g:sale_price and g:price, and the template sends both
  • in stock / out of stock / preorder, spelled with spaces; sold-out items stay in the feed
Technical details

Prices are written with a period decimal separator and no thousands separator, with the ISO currency code in the value, as in Criteo's own samples: 59.00 USD. Criteo's naming is the reverse of Google's: its price is the final price after a discount and retailprice the standard price before one. In a Google-format feed that pair is exactly g:sale_price and g:price, which Criteo's XML sample carries, so the template keeps Google's meanings (g:price holds the regular price, g:sale_price the amount actually charged) and Criteo's locked rules do the swap.

Availability is one of three values spelled with spaces: in stock, out of stock, preorder. A sold-out variant stays in the feed marked out of stock, and Criteo excludes it from the banners itself. It counts as Not Displayable, alongside anything missing its ID, name, URL or image. Criteo publishes no file-size or item cap; the only limit is 256 KB of data per product.

The takeaway

One hosted URL in the Google format Criteo asks for, IDs that match your pixel and an hourly refresh behind Criteo's daily imports. Your Shopify catalog stays the source of truth for every Dynamic Ad.

Claude · ChatGPT

Or set up your Criteo feed in chat

Connect Feedflock to Claude or ChatGPT and ask. It creates the feed as a draft, maps your categories to Criteo's own tree and tells you what is still missing. You approve every change.

feedflock · mcp

Create a Criteo feed for my store and map my categories.

I'll create it as a draft and show you each change before I make it.

FAQ

Yes. Criteo's own tip is that a Google or Facebook feed can be reused as-is, and Test Setup maps it automatically. A dedicated Criteo feed is still worth it when you want control: extra fields, filters, custom labels or a second market.
Daily by default, on a schedule you can raise to four imports a day (UTC), and a manual import can be launched at any time. Feedflock regenerates the file every hour, so each import picks up current prices and stock.
The one your pixel sends. The template defaults to the SKU, else the Shopify variant ID. Keep it stable, because changing product IDs disrupts display and reporting, and never let id equal item_group_id: Criteo calls that undefined behavior.
It stays in the feed marked out of stock. Criteo excludes it from the banners itself and counts it as Not Displayable; when you restock, the next import makes it displayable again.
Criteo's e-commerce-platform integration installs its app and reads your Shopify catalog directly, with no feed at all. Choose the feed when you want control over fields, exclusions and custom labels, or when your Criteo account was set up with the Product Feed URL connection.
Yes. Filter in Feedflock by collection, tag, price or stock so the products never reach the feed. On Criteo's side, the Blocked Products page and feed Rules handle exclusions after import.

Get on every marketplace that matters this afternoon.

Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.

.myshopify.com