Skip to content
AdRoll
Ad platforms

AdRoll feed for Shopify

AdRoll, part of NextRoll, turns your catalog into retargeting and prospecting banners: Dynamic Creative ads that show people the exact products they viewed, across the web. Nothing is listed on an AdRoll-owned site; the feed is the catalog behind the banner, and AdRoll insists it lives on a public URL it can crawl. Feedflock builds that feed from your Shopify catalog in the Google format AdRoll reads natively, with product IDs that match your pixel, and regenerates it as often as every hour.

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 · adroll.xmlUpdated just now
<item>
<g:id>8236409175213</g:id>
<g:title>Linen shirt Sand</g:title>
<g:description>Breathable linen shirt with a relaxed regular fit.</g:description>
<g:link>https://shop.example/products/linen-shirt-sand</g:link>
<g:image_link>https://cdn.shop.example/img/linen-shirt-sand.jpg</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>
</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
Productprice (compare-at)sale_​price
Linen shirt Sand$59.00$47.20
Mug Fjord 350 ml$18.00$14.40
Backpack Ridge 28 l$85.00$68.00
Soy candle Les$14.00$11.20
Wool scarf Fjell$29.00$23.20
$41.00saved across these products
5 / 5products with the sale overlay
Sale prices

A sale is two prices, and the banner can show both.

AdRoll's field table pairs price with sale_price: “discounted price, if applicable”. Feedflock sends the compare-at price as g:price and the discounted price as g:sale_price, so a dynamic ad can show the saving, and the promotion ends the moment you remove the compare-at price. A full-price product carries one price only.

Feed health

Catch feed issues before AdRoll 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 · adroll.xml
74 / 100
To review: 4
Missing image_link on 3 productsThe product has no featured image. image_link is required: the dynamic ad builds itself from it, so a product without one has nothing to show.
Product IDs may not match the pixelThe feed's id must equal the pixel's adroll_custom_data value exactly, case-sensitive, with no extra spaces. AdRoll calls a match rate under 40% a fault. Check both sides in the browser console.
No link on 2 productsProducts that aren't published to your Online Store have no storefront URL. link is required: it is the page the banner sends people to.
No Google category on 9 productsgoogle_product_category is recommended and feeds AdRoll's Product Group column. Map your product types to Google's taxonomy paths.

Setup

Live in five steps

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

  1. Set up AdRoll and its pixel

    Create your AdRoll account and put the AdRoll pixel on your product pages. It must report each viewed product's ID in adroll_custom_data. Without it, the best feed personalizes nothing.

  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 AdRoll template

    Create a new feed and choose AdRoll. The output is Google's RSS 2.0 with the g: namespace, one item per product, with all five required fields mapped: id, title, link, image_link and price. The id defaults to the numeric Shopify product ID, the value your pixel most likely sends.

  4. Map your categories

    google_product_category takes a full path from Google's taxonomy; map your product types on the Categories tab. A compare-at price splits into g:price plus g:sale_price automatically.

  5. Hand AdRoll the feed URL

    Share the hosted URL with AdRoll support or your account manager, or, with API access, register it through the product feed endpoints, which read the Google Base format directly. If your server filters traffic, allowlist AdRoll's crawler (IP 54.69.18.100). Then check Creatives → Product Feeds.

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

The feed

What the channel receives

adroll.xml
<item>
  <g:id>8236409175213</g:id>
  <g:title>Linen shirt Sand</g:title>
  <g:description>Breathable linen shirt with a relaxed regular fit.</g:description>
  <g:link>https://shop.example/products/linen-shirt-sand</g:link>
  <g:image_link>https://cdn.shop.example/img/linen-shirt-sand.jpg</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>
</item>
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

$59

Feed fields

g:id

8236409175213

g:title

Linen shirt Sand

g:description

Breathable linen shirt with a relaxed regular fit.

g:link

https://shop.example/products/linen-shirt-sand

g:price

59.00 USD

g:availability

in stock

g:brand

Nordlin

g:google_product_category

Apparel & Accessories > Clothing > Shirts & Tops

The channel

The exact product, back in front of its viewer

Dynamic Creative builds banners from your feed: previously viewed, recommended and top products, personalized across devices. The feed is the entire catalog behind the ad.

Retargeting and prospecting from one file

AdRoll is a prospecting network as much as a retargeting one, and the same product feed fills both kinds of creative. One file covers the whole funnel.

Your Google feed already speaks the language

AdRoll's field table is written in Google's vocabulary, and a Google Base feed can be registered automatically through AdRoll's API. There is no new format to learn.

The feed

  • Google's RSS 2.0 with the g: namespace, exactly the format AdRoll's autoconfigure reads
  • One item per product, as AdRoll asks, with the cheapest sellable variant standing for the row
  • The id defaults to the numeric Shopify product ID, the same value {{ product.id }} puts in the pixel's adroll_custom_data, so feed and pixel match out of the box
  • The compare-at price goes to g:price and the discounted price to g:sale_price, both in AdRoll's “59.00 USD” form; a full-price product sends one price only
  • Availability is AdRoll's exact two values, in stock and out of stock, spelled with spaces, so a sold-out product stays in the feed instead of disappearing
  • Only AdRoll's ten published fields go out. A gtin or a condition element would travel down the wire unread, because AdRoll parses only what it has a parser configuration for
  • The readiness check lists required fields that come out empty (a product without an image or a link) before you hand over the URL
  • A stable hosted URL, regenerated as often as every hour, with fetch tracking that warns you if AdRoll's crawler stops coming

Deep dive

01

A public URL AdRoll crawls

  • The feed must be a public URL AdRoll can periodically crawl: XML, CSV, JSON or TXT, zip or gzip allowed
  • One file for the whole catalog; extra registered feeds merge into the same catalog, they don't split it
  • The crawler identifies itself: IP 54.69.18.100, User-Agent “AdRoll Dynamic Creative Feed Parser bot”
  • Sync timing is set per feed; the one interval AdRoll states is weekly for automatic setups
Technical details

AdRoll treats the hosted URL as a requirement, not an option: the feed must be a public URL it can periodically crawl, in XML, CSV, JSON or TXT form, optionally compressed with zip or gzip, encoded in UTF-8. The whole catalog belongs in one file; register several and their products merge into a single catalog. The crawler publishes its identity, IP 54.69.18.100 and the User-Agent “AdRoll Dynamic Creative Feed Parser bot”, so a filtering server can allowlist it.

Feedflock hosts the file on a stable URL and regenerates it on your schedule, as often as every hour, so every AdRoll sync reads current prices and stock. One caveat from AdRoll's own rules: don't restructure a live feed. Rearranging columns or changing the file type without telling support can break the parser configuration and hurt ad performance.

02

Google's format, AdRoll's ten fields

  • A Google Base feed can be registered automatically: AdRoll's autoconfigure reads it directly
  • Five required fields: product ID, title, link, image link and price
  • Five recommended: description, sale price, availability, Google category and brand
  • AdRoll reads only what it has a parser configuration for; extra attributes are carried and ignored
Technical details

AdRoll says it in one sentence: if your product feed uses the Google Products Feed (aka Google Base) format, it can be set up automatically. The help centre's field table is written in Google's vocabulary (title, description, link, image_link, price, sale_price, availability, google_product_category, brand), with product_id the only name that is not Google's. The template emits Google's <g:id>, which a manually configured parser can be pointed at anyway: a parser configuration's path is simply the tag name in the feed.

The required set is five (product ID, title, link, image link and price), with description, sale price, availability, category and brand recommended. Nothing beyond those ten is worth sending. AdRoll parses a field only once it has a parser configuration for it, so a gtin or a condition element would travel down the wire and be ignored.

03

One row per product, and the pixel makes the match

  • AdRoll asks for product-level rows: one unique entry per distinct product
  • The cheapest sellable variant stands for the row
  • The ID must equal the pixel's adroll_custom_data value exactly, case-sensitive, with no extra spaces
  • AdRoll grades the match as a rate; under 40% is a named fault
Technical details

This is the one channel where the feed is deliberately not variant-level. AdRoll asks for one unique entry per distinct product, because a product page fires a single ID into the pixel's adroll_custom_data and the feed must carry one row that matches it. Feedflock renders one item per product, with the cheapest sellable variant standing for the row.

That match is the whole integration: if the pixel-captured ID doesn't match an ID in the feed, personalization fails. AdRoll grades it as a match rate and calls anything under 40% a fault. The template's default id is the numeric Shopify product ID (the value a theme's {{ product.id }} puts in the pixel), and AdRoll's own debugging recipe is to compare the two in the browser console, case-sensitively. On Shopify, AdRoll's native integration can sync the catalog without a feed at all; this template is for control over the file, or for shops not on that integration.

04

Prices, availability, and the fields AdRoll doesn't have

  • Price is an amount, a space and the ISO code (“19.99 USD”), one currency per feed
  • VAT is never mentioned; send the price the landing page charges
  • Availability knows two spaced values, and a sold-out product stays in the feed marked out of stock
  • There is no shipping field, no GTIN, no condition: a retargeting banner quotes none of them
Technical details

AdRoll states a value shape in exactly two places. The price is an amount, a space and the ISO 4217 code (19.99 USD), with one currency per feed. Availability is exactly in stock or out of stock, spelled with spaces; there is no preorder or backorder. VAT is never mentioned, so the feed sends what the landing page charges, which is also AdRoll's own best practice, because a banner that disagrees with the page wastes ad spend.

Just as notable is what the field table lacks: no shipping element, no barcode, no condition. Temporary unavailability is handled by availability, not removal. AdRoll recommends marking a product out of stock rather than blacklisting it, because a blacklist can outlive the restock.

The takeaway

AdRoll's dynamic ads are only as personal as the match between your pixel and your feed. Feedflock keeps that match intact: one item per product, IDs the pixel recognizes, on a URL AdRoll can always crawl.

Claude · ChatGPT

Or set up your AdRoll feed in chat

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

feedflock · mcp

Create a AdRoll 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. AdRoll's autoconfigure reads the Google Base format directly, and the help centre names Google Merchant Center as a source it can most likely use. The AdRoll template emits the same RSS 2.0 shape, trimmed to the ten fields AdRoll actually parses, so nothing extra goes on the wire.
The schedule is shown per feed in the Product Feed Overview (Sync Schedule, Last Sync, Next Sync) rather than published as one number. The one interval AdRoll states: automatic feed setups update weekly. Feedflock regenerates the file as often as every hour, so each sync reads current prices and stock.
The one your pixel sends. The template defaults to the numeric Shopify product ID, which is what a theme's {{ product.id }} puts in adroll_custom_data. Change it only if your pixel sends something else, such as the SKU. The match must be exact and case-sensitive, and AdRoll calls a match rate under 40% a fault.
No. Mark them out of stock: AdRoll recommends exactly that over blacklisting for temporary unavailability, because a blacklist can survive the restock. The template derives the value from Shopify's stock status.
If you connect AdRoll with your Shopify store, it synchronizes the catalog on its own and you need no feed URL. A hosted feed is the path for control (your own field values, product selection and format) and for shops not on that integration.
Two ways. In Feedflock, filter the feed by collection, tag, price or stock. On AdRoll's side, exclusion is blacklisting: you send support your Advertiser EID and a precise list of product IDs. For a temporary stock-out, prefer availability over either.

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