Skip to main content

Criteo Product Feed

By Marius Pahomi · Published 2026-08-24 · Last updated 2026-08-29

A Criteo product feed is the source file — CSV, TSV, XML in Google feed format, or JSON — that Criteo ingests to build your Product Catalog, the structured product list behind every Dynamic Ad the platform serves. The distinction matters: the feed is the file you host and Criteo polls; the catalog is what exists inside Criteo after ingestion, and it is the catalog that campaigns actually read. Per Criteo’s own documentation, a Google Shopping or Facebook feed can be reused with no extra formatting, the header must sit in the first row in lower case without spaces, and imports run on a schedule you configure against a URL served over HTTP, FTP, or SFTP.

This guide covers the full path from file to running catalog: which formats Criteo accepts and when reusing an existing feed is actually safe, the fields Criteo requires and the two requirements that surprise teams coming from other channels — currency as a dedicated column and google_product_category as a required field on a non-Google platform — how the OneTag pixel joins browsing events to feed rows through the product id, how ingestion and its four error categories work, and how to diagnose a rejected import. It is the informational companion to our commercial <a href="/channels/criteo">Criteo channel page</a>, which covers FeedArc’s setup flow, and to the <a href="/guides/product-feed-management">product feed management pillar</a>, which covers the discipline across all channels. Where a number is quoted from a specification, it is cited to the primary source and dated, because specifications change.

Find your Google product categories — free, in your browser, no account needed.

Feed versus catalog: what Criteo actually ingests

The two objects, and why the distinction matters

Criteo’s documentation is precise about its two objects. The Product Feed is one or more source files containing your product data. The Product Catalog is the structured list that those files become once imported into the platform. Campaigns, product sets, and Dynamic Ads all read the catalog — never your file directly. Every operational question therefore splits in two: is the problem in the file (a transform or validation defect you fix at generation time), or in the ingestion (an access, download, or parsing failure you fix at the transport layer)?

The split tells you where to look when products go missing. If the exported file contains the row but the catalog does not, the loss happened during ingestion and Criteo’s import log will name the reason. If the file itself lacks the row, no amount of dashboard investigation helps — the defect is upstream, in your feed management pipeline, before Criteo ever saw the data.

Where Criteo fits among your other channel feeds

Criteo is deliberately interoperable: its documentation states that a Google or Facebook product feed can be reused to set up the catalog with no extra formatting required. That makes it one of the cheapest channels to add once a disciplined single-source pipeline exists — the marginal work is a feed URL and a pixel, not a new schema project. The trap is assuming interoperability means identical requirements. Criteo requires google_product_category — a field that is merely conditional on Google itself — and the FeedArc CSV structure carries currency as its own column rather than embedded in the price string.

The practical consequence: a reused Google feed usually imports, but a catalog built only to Meta’s requirements may lack the Google taxonomy field entirely and fail per-product. Treat "reuse your existing feed" as a starting point that still gets validated against Criteo’s own field list before the first campaign spends money.

Limitations
  • This guide covers the Commerce Growth self-service platform. Managed Criteo accounts and the Retail Media product line have additional feed surfaces not documented here.

File formats Criteo accepts

CSV, TSV, XML in Google format, and JSON

Criteo’s setup documentation names CSV and TSV (comma- or tab-separated) and XML in Google feed format as the supported feed formats, and its troubleshooting guide additionally lists JSON among the structures the parser accepts. For delimited files the rules are strict and mechanical: the header must be declared in the first row, in lower case, without spaces. A header of Image_Link or image link is enough to break field mapping — the import may still run, but the column lands unmapped and every product loses its image.

FeedArc emits the CSV structure for Criteo (UTF-8, comma-separated, header row) because delimited files are the easiest to inspect and diff when something goes wrong. If you already run a Google Shopping XML feed and prefer to point Criteo at it unchanged, that is supported — the trade-off is that any Criteo-specific shaping (out-of-stock filtering, category grouping) then has to happen inside Criteo’s own feed rules rather than at generation time.

Reusing a Google or Facebook feed: when it is safe

Reuse is safe when three conditions hold. First, the source feed already carries google_product_category — true for any working Google Shopping feed, frequently false for Meta-only catalogs, and the field is required on Criteo. Second, the identifiers in the reused feed match what your site’s pixel reports — the OneTag join (covered below) is by product id, and a reused feed with different ids than the pixel events retargets nothing. Third, the feed’s update cadence suits Criteo’s campaign model: a file regenerated weekly may be acceptable for a slow catalog on Google, but retargeting serves ads for products shoppers viewed yesterday, so stale availability directly buys clicks to sold-out pages.

When any condition fails, generate a dedicated Criteo feed from the same canonical catalog instead of sharing the file. Same data, channel-shaped output — the pattern the feed management pillar describes as one catalog, many views.

Required fields in the Criteo catalog feed

The seven fields FeedArc treats as required

FeedArc’s channel registry marks seven fields required for Criteo: title, description, link, image_link, price, currency, and google_product_category, with brand, gtin, availability, and sale_price recommended. Two of the required entries are the ones that surprise teams arriving from other channels. currency is a dedicated column carrying an ISO 4217 code — the FeedArc CSV does not embed it in the price string the way Google’s price attribute ("89.00 EUR") does. And google_product_category is required, on a platform that is not Google — the next section covers why that is an advantage rather than a burden.

At generation time FeedArc caps titles at 150 characters and descriptions at 5,000 — enforced limits in the feed generator, so a too-long title is truncated before export rather than rejected after it.

Identifiers: id stability outranks id format

The id column is the join key for everything downstream: OneTag events reference it, the catalog updates match on it, and post-click attribution depends on it staying constant. Criteo tolerates almost any identifier format — what it does not tolerate is churn. If a regeneration renames SKU-4501 to 4501-SKU, Criteo sees a deletion plus an unknown new product: retargeting history evaporates and the ad-serving model restarts learning for that item.

Product identity fields follow the same logic as on other channels — gtin when the product has one, brand for matching and creative display — and because Criteo accepts a reused Google feed, identifier quality work done for Merchant Center (see the GTIN glossary entry) carries over unchanged. FeedArc keeps ids stable across regenerations precisely because this join is silent when it fails: nothing errors, retargeting volume just quietly falls toward zero.

Limitations
  • The required-field list above is FeedArc’s enforcement, derived from its channel registry — it is intentionally stricter than Criteo’s own minimum so that catalogs import cleanly on the first attempt. Criteo’s canonical field list lives in its Product Catalog specifications document and should be checked for categories with special rules.
  • The 150-character title and 5,000-character description caps are FeedArc generation-time limits, not numbers quoted from Criteo’s specification.

google_product_category: the unusual requirement

Why a non-Google channel requires Google’s taxonomy

Most advertising channels define their own category tree. Criteo instead accepts Google’s product taxonomy directly — the same google_product_category values, by ID or full path, that a Merchant Center feed carries. For Criteo the taxonomy feeds the machinery that groups products into coherent dynamic-creative sets and gives the predictive model a category signal for lookalike expansion. For you, it means the categorisation work is done once and serves two channels: the mapping built for Google Shopping satisfies Criteo verbatim.

The failure mode is the store that never sold on Google. Its catalog has internal categories like apparel/mens/shirts and no Google taxonomy at all, so every product arrives at Criteo missing a required field. The fix is a mapping step, not a manual audit: FeedArc’s taxonomy auto-mapping infers the Google category from title, description, and existing category path — the same rule that would prepare the catalog for Merchant Center.

category_id: the optional field worth populating

Alongside the Google taxonomy, Criteo supports a merchant-defined category_id used for product grouping — FeedArc’s channel preset lists it among its recommendations for exactly one reason: dynamic creative templates compose ads from groups of related products, and grouping by your own taxonomy ("summer-linen", "clearance-electronics") produces more coherent creatives than grouping by Google’s generic tree alone.

Treat the two fields as serving different masters. google_product_category is for Criteo’s models and is required; category_id is for your creative grouping and is optional. Populating category_id from the store’s native category path is a one-line transform rule and is worth doing at setup rather than retrofitting later — regrouping an established catalog reshuffles which products appear together in ads, which briefly disturbs performance while the model re-learns. If you skip it at launch, add it during a planned quiet period, not mid-campaign.

OneTag: how browsing events join to feed rows

The catalog gives Criteo products; the pixel gives it shoppers

A Criteo catalog on its own is inert. Retargeting requires the second half of the integration: the Criteo OneTag pixel installed across the store — product pages, listings, cart, and the order-confirmation page. OneTag fires events (product viewed, added to cart, transaction completed) parameterised with a product identifier, and Criteo joins that identifier against the id column of your catalog. The join is the entire retargeting mechanism: no matching id, no audience, no ads.

This is why the feed and the pixel cannot be owned by different teams with different naming conventions. The classic silent failure is a pixel implementation that reports the platform’s internal database id while the feed exports the public SKU — both perfectly valid identifiers, joined on nothing. The catalog imports successfully, the pixel fires successfully, every individual health check passes, and retargeting volume is zero. Verify the join explicitly: fire a test event, then confirm the reported id exists verbatim in the exported feed.

Consent, and what happens to the events without it

OneTag is a behavioural tracker, and in the EU it fires under consent rules: a visitor must affirmatively consent before events can be used for retargeting, with the IAB Transparency and Consent Framework as the integration standard between your consent-management platform and Criteo. Without a consent signal the events cannot build retargeting audiences — so a store with a broken CMP integration sees the same symptom as a broken id join: healthy catalog, firing pixel, missing volume.

Keep the two failure modes distinguishable in your monitoring. An id-join failure suppresses retargeting for everyone; a consent failure suppresses it for the subset of traffic in consent jurisdictions. If EU volume is missing while other regions retarget normally, look at the CMP integration before touching the feed. The feed side’s only obligation here is currency coherence: transaction events should carry the same currency as the corresponding feed rows so revenue attribution reconciles.

Limitations
  • Consent-framework behaviour summarised here reflects the EU/TCF integration pattern; regional privacy regimes differ and change. For current per-jurisdiction requirements, consult Criteo’s own privacy documentation rather than relying on this guide.

Ingestion: protocols, scheduling, and the import loop

How Criteo fetches: HTTP, FTP, SFTP, on a schedule

Criteo pulls rather than accepts pushes: you host the feed at a stable location, Criteo fetches it on the configured schedule. The troubleshooting documentation names HTTP, FTP, and SFTP as the supported protocols, and the setup flow configures scheduled imports — daily is the documented baseline for keeping the catalog current. The operational requirement hiding in that sentence is availability at import time: a feed URL that regenerates on demand and occasionally times out under load will produce intermittent import failures that look random until you correlate them with the fetch schedule.

A hosted feed URL — FeedArc’s model — sidesteps the availability problem by serving a pre-generated file rather than computing the export during the fetch. Whatever hosting you use, the invariant is the same: generation and serving should be decoupled, so a slow generation run delays freshness by one cycle instead of failing the import outright.

Matching fetch cadence to catalog volatility

The right import frequency is a property of your catalog’s change rate, not a universal constant. Stable assortments with slow price movement are well served by the daily schedule. Fast-moving categories — fashion drops, flash pricing, thin stock positions — justify a tighter loop, because every hour between a sell-out and the next import is an hour Criteo may retarget shoppers toward a product they can no longer buy.

Note what the cadence does not fix: an hourly import of a stale file achieves nothing. The full freshness chain is store → canonical catalog → generated feed → Criteo import, and the slowest link sets the real latency. If the feed regenerates nightly, an hourly Criteo fetch simply re-reads the same file 23 times. Align the generation schedule and the import schedule deliberately, and monitor the timestamp gap between them — the operating-cadence section of the feed management pillar covers this loop across channels.

Reading the import log like an engineer

Criteo surfaces ingestion results under Assets → Product Catalog → Imports, and its troubleshooting guide groups errors into four categories that map cleanly onto layers of the stack: Credentials (authentication to your feed source failed), Downloads (the file could not be retrieved — missing file, network fault, timeout), FTP services (transfer-level failures specific to FTP/SFTP), and Parsing (the file arrived but could not be read as valid CSV, XML, or JSON).

The category tells you which team owns the fix. Credentials and FTP errors belong to whoever manages the hosting; Downloads to infrastructure and availability; Parsing to the feed generator. Only parsing errors ever implicate the file’s content — and a parsing error on a previously-working feed almost always means the generator emitted something structurally new: an unescaped delimiter inside a product title, a BOM, a truncated write. Diff the current file against the last successfully imported one before touching anything else.

Limitations
  • Error-category behaviour is summarised from Criteo’s troubleshooting documentation as fetched 2026-08-24; the platform UI and category groupings evolve, and the in-product import log is authoritative over this summary.

Troubleshooting a rejected or shrunken catalog

Whole-file failures versus per-product rejections

Separate the two failure scales before diagnosing. A whole-file failure — nothing imported — is an ingestion problem: one of the four error categories above, visible in the import log, fixed at the transport or format layer. A per-product rejection — the import ran but the catalog is smaller than the feed — is a field-level validation problem: rows missing required fields, malformed prices, broken image URLs.

The most common per-product cause on Criteo specifically is the missing google_product_category, because it is the one required field that stores without Google Shopping history have never populated. The second is the malformed or absent currency value in CSV feeds assembled by hand from a Google-style export, where the currency lived inside the price string. Both are systematic — they reject entire classes of products, not random rows — so the catalog count drops in large steps, which is itself the diagnostic signature distinguishing them from scattered data-quality noise.

Pre-flight validation: catch it before Criteo does

Every rejection Criteo reports is a rejection that was detectable before the file was served. Pre-flight feed validation — checking each generated row against the destination’s field requirements at export time — turns import-day surprises into build-time errors. FeedArc runs Criteo’s field rules (required-field presence, length limits, availability values) against every row before the feed URL updates, so a defect in the transform fails the generation run rather than silently shrinking the live catalog.

The economics justify the discipline: a rejected import is discovered on Criteo’s schedule, at the next fetch, after which campaigns run on the previous catalog for at least one more cycle. A failed pre-flight check is discovered on your schedule, immediately, with the failing rows named. The gap between those two feedback loops — hours to days — is the window in which budget is spent advertising a catalog that no longer matches reality.

Optimizing the feed for Criteo’s model

Filter out-of-stock rows; keep everything else

Two opposing pressures shape what belongs in a Criteo feed, and getting each right matters when you optimize a product feed for Criteo. Exclude unavailable products: retargeting is memory-based, so a shopper who viewed a product yesterday can be shown it today even if it sold out overnight — paying for clicks that land on a dead product page. FeedArc’s Criteo preset applies exactly one filter by default, excluding rows with out-of-stock availability, and the tighter the import cadence, the tighter that filter tracks reality.

Beyond availability, resist the urge to curate. Criteo’s own channel guidance in the FeedArc registry is to include as many products as possible: the predictive model builds audiences and creative sets from catalog breadth, and long-tail items contribute signal even when they rarely serve. The correct Criteo catalog is close to the full sellable assortment minus unavailable rows — narrower than that, and you are starving the model of its raw material.

The attributes that improve dynamic creatives

Dynamic Ads are assembled from feed attributes, so attribute quality is creative quality. Images matter most: Criteo composites image_link into generated display creatives, and clean product shots on plain backgrounds composite better than lifestyle photography with busy contexts. Titles render on the creative itself, so front-load the identifying words — brand, product type, key attribute — the way you would for any channel where titles truncate. sale_price alongside price lets the creative render the strikethrough discount framing, which is the single highest-leverage attribute pair for promotion periods.

These are the same title, image, and pricing disciplines covered in depth in the product feed optimization guide — Criteo simply consumes them through a different renderer. The channel-specific addition is grouping: coherent category_id groups produce coherent multi-product creatives, as covered in the taxonomy section above.

Limitations
  • Recommendations in this section describe mechanism (how the feed drives audiences and creatives), not measured performance deltas — Criteo does not publish attribute-level lift figures, and FeedArc fabricates no benchmark numbers (Rule 06).

From first import to steady state

The first-import checklist

The first import is the highest-defect event in the feed’s life, because every systematic problem fires at once. Run it as a checklist rather than a hope: the feed URL serves the current file over a supported protocol; the header row is lower case, no spaces; every row carries the seven required fields; ids match what OneTag reports on the live site; the import completes in the log without errors in any of the four categories; and — the step most teams skip — the imported catalog count equals the exported row count. A first import that lands 8,400 of 9,000 rows is not a success with a footnote; it is 600 named defects the import log will enumerate for you.

Only after the counts reconcile is the integration actually done. Campaign setup on a partially imported catalog bakes the gap into the baseline, where it becomes invisible until someone audits months later.

Steady state is a monitoring loop, not a finished task

After the first clean import, the Criteo feed enters the same three-loop cadence every channel feed needs: a fast loop watching that each scheduled import succeeded, a daily loop watching the catalog count delta (the single most information-dense feed-health metric — sudden steps down mean a new systematic rejection), and a periodic loop re-checking that the id join still holds after platform migrations, SKU renumbering, or pixel re-implementations.

None of this is Criteo-specific engineering — it is standard feed management applied to one more destination, and the pillar guide covers the general discipline. What is Criteo-specific is the cost profile of neglect: because retargeting spends against yesterday’s browsing events, a stale or shrunken catalog does not merely lose reach the way a search-feed defect does — it actively pays for traffic to products that are gone. The monitoring loop is what keeps that failure mode theoretical.

How FeedArc generates the Criteo feed

What the CRITEO preset does on every export

FeedArc’s Criteo channel definition encodes everything this guide describes as an executable preset rather than a documentation page. On every export it emits the CSV structure with the lower-case header row, carries currency as a dedicated column (defaulting from your store region, EUR for the platform’s French home market), populates google_product_category through the same taxonomy auto-mapping that serves Google Shopping, applies the out-of-stock filter before a single row is written, enforces the 150-character title and 5,000-character description caps by truncation at generation time, and validates every row against the required-field list before the hosted feed URL updates.

The id column passes through from your canonical catalog untransformed and stays stable across regenerations, so the OneTag join survives every export. The result is that Criteo’s fetch always finds a pre-generated, pre-validated file — the generation-versus-serving decoupling the ingestion section argued for.

One catalog in, every channel out

The Criteo feed is one output of the same pipeline that shapes your catalog for every other destination — the same canonical product data, transformed per channel, validated per channel’s rules, and served on per-channel URLs. Adding Criteo to an existing FeedArc setup is configuration, not integration work: select the channel, confirm region and currency, review the preset’s filter, and paste the generated URL into Criteo’s catalog setup. The taxonomy mapping, if it exists for Google Shopping, is reused; if it does not, the auto-mapping rule builds it.

That is the practical payoff of the feed-versus-catalog distinction this guide opened with: because the feed is just a shaped view of the canonical catalog, the marginal cost of one more channel approaches zero while correctness stays centralised. The commercial details — plans, sync frequency by tier, and the setup walkthrough — live on the Criteo channel page.

See FeedArc on your own feed

FeedArc generates the Criteo CSV automatically — currency as its own column, google_product_category mapped by the same rule that serves Google Shopping, out-of-stock rows filtered before export, and stable product ids so the OneTag join never silently breaks.

Frequently asked questions

Sources & References

Start with FeedArc

Apply this playbook to your own product feed in minutes. Free to start, no credit card needed.