Skip to content
CJ Affiliate
Ad platforms

CJ Affiliate feed for Shopify

CJ Affiliate (the network everyone still calls Commission Junction) is an affiliate network, not a marketplace: publishers pick up your products and promote them for a commission, and your whole product supply is one CSV file in Google's Shopping format that CJ fetches from your URL once a day. Feedflock turns your Shopify catalog into exactly that file (every column spelled the way CJ's spec lists it, condition included, the identifier rule checked) and keeps it current on a stable public URL, regenerated 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 · cj.csvUpdated just now
id,title,description,link,image_link,availability,price,sale_price,condition,brand,gtin,mpn,identifier_exists,item_group_id,google_product_category,product_type,color,size
"SKU-2048","Linen shirt Sand M","Breathable linen shirt with a relaxed regular fit.","https://shop.example/products/linen-shirt-sand?variant=46012345678901","https://cdn.shop.example/img/linen-shirt-sand.jpg","out of stock","59.00 USD","","new","Nordlin","8594000123453","SKU-2048","yes","8812345678901","Apparel & Accessories > Clothing > Shirts & Tops","Men's shirts","Sand","M"
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
Productpricesale_​price
Linen shirt Sand$59.00$47.20
Mug Fjord 350 ml$18.00$14.40
Backpack Ridge 28 l$99.00$79.20
Soy candle Les$22.00$17.60
Wool scarf Fjell$45.00$36.00
$48.60saved across these products
5 / 5products with a sale price
Sale prices

A sale price that appears only when the sale is real.

In CJ's feed, price carries the regular price and sale_price the discounted one, and sale_price goes out only when the product is actually on sale. An always-filled sale_price invents a permanent markdown that every cashback and coupon publisher repeats. Feedflock maps the pair from your compare-at price, so the file tells the truth in both directions.

Feed health

Catch feed issues before CJ Affiliate 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 · cj.csv
75 / 100
To review: 4
Identifier rule broken on 9 productsCJ: a product must have GTIN and brand, or MPN and brand. Otherwise identifier_exists must be "no", and a blank identifier_exists defaults to "yes". Products that break the rule are rejected.
Availability outside CJ's four values on 6 productsavailability knows only "in stock", "out of stock", "preorder" and "backorder", lowercase, with the space. Products without a valid availability are rejected.
id longer than 50 characters on 7 variantsCJ caps id at 50 characters and allows only alphanumerics plus - . # _ / and space. Products with no valid id are rejected, and a duplicate id removes every copy on import.
Empty description on 5 productsdescription is required: CJ rejects products without one, and markup would reach publishers as visible tags. These products have no description in Shopify.

Setup

Live in five steps

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

  1. Open a CJ advertiser account

    Almost every CJ advertiser can register a product feed; only gateway integrations without redirect style are excluded. The feed becomes product data your publishers can search, export and link to.

  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 CJ Affiliate template

    Create a new feed and choose CJ Affiliate. All 36 columns of the Shopping (Google Format) vocabulary are mapped from the start: one row per variant, prices as amount plus ISO code, condition filled, the description stripped to plain text.

  4. Register the feed in CJ

    CJ Account Manager → Campaigns → AD ASSETS → Product Feeds → Register Feed. Format = Shopping (Google format), Data Format = CSV, Quoted Values = Yes, Delivery Method = Fetch from HTTP/S, and the file name exactly as it is served, case-sensitively, extension included. Submit in test mode first.

  5. Read the results e-mail, then go live

    Every import produces a receipt confirmation and a results e-mail with a JSON error attachment. Test mode generates the e-mails without showing anything to publishers; when it is clean, switch the feed to live. CJ fetches the URL once a day.

    https://feedflock.appfleece.com/f/demo-cj/cj.csv

The feed

What the channel receives

cj.csv
id,title,description,link,image_link,availability,price,sale_price,condition,brand,gtin,mpn,identifier_exists,item_group_id,google_product_category,product_type,color,size
"SKU-2048","Linen shirt Sand M","Breathable linen shirt with a relaxed regular fit.","https://shop.example/products/linen-shirt-sand?variant=46012345678901","https://cdn.shop.example/img/linen-shirt-sand.jpg","in stock","59.00 USD","","new","Nordlin","8594000123453","SKU-2048","yes","8812345678901","Apparel & Accessories > Clothing > Shirts & Tops","Men's shirts","Sand","M"
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

$59

Feed fields

id

SKU-2048

title

Linen shirt Sand M

description

Breathable linen shirt with a relaxed regular fit.

link

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

availability

in stock

price

59.00 USD

condition

new

brand

Nordlin

gtin

8594000123453

mpn

SKU-2048

identifier_exists

yes

item_group_id

8812345678901

google_product_category

Apparel & Accessories › Clothing › Shirts & Tops

product_type

Men's shirts

color

Sand

size

M

The channel

A network of publishers sells for you

Cashback, content, coupon and product-search sites search your feed, subscribe to an export of it, and place tracked links to individual products. CJ builds the tracking; you supply the catalogue, and the CSV is how it reaches them.

Your Google feed is almost ready

In CJ's own words, the Shopping (Google Format) feed follows the Google Merchant Center spec, and a Google feed works in CJ "with just a few modifications": add condition, drop the Google-only columns, keep the exact column names.

Commissioning down to the item

If your CJ pixel passes SKUs, the feed's id (matched case-sensitively) powers item-level commissioning and product lists. One feed becomes the product layer of your whole affiliate program.

The feed

  • All 36 columns of CJ's Shopping (Google Format) vocabulary, spelled exactly as CJ lists them. The column order is free, but the names must match
  • condition included and mapped by default. CJ requires it and Google does not, which is the first item on CJ's own error list
  • Prices as amount plus ISO code in the cell (59.00 USD), dot decimal, never a thousands separator: the shape that matches the US price format on the registration form
  • The identifier rule checked at generation: brand + GTIN or brand + MPN, and identifier_exists = no where the catalogue has neither
  • One row per variant with unique, at most 50-character ids, because a duplicate id removes every copy when CJ imports the file
  • Descriptions stripped to plain text, because CJ escapes markup instead of rendering it and visible tags would reach every publisher
  • shipping stays the price-only compound column shipping(price), unmapped by default so no publisher is promised free shipping you do not offer
  • Fetch tracking shows when CJ last downloaded the feed and alerts you if the daily fetches stop

Deep dive

01

Your Google feed, with five CJ-only differences

  • condition is required ("CJ requires this and Google does not"), mapped to new by default
  • id is capped at 50 characters and restricted to alphanumerics plus - . # _ / and space
  • Six Google-only columns (shipping_label, adwords_redirect, promotion_id…) are accepted but discarded; the template emits none
  • An unknown column is a warning, never a rejection: CJ accepts the feed without that value
Technical details

CJ's Shopping (Google Format) feed follows the Google Merchant Center specification. In CJ's own words, a Google feed can be reused "with just a few modifications". The modifications are concrete: condition is required, id is shorter and stricter than Google's, and the six AdWords columns Google uses for its own settings are accepted and thrown away, so the template simply never sends them.

Two syntactic details are easy to miss. Compound columns carry their sub-attributes in the header itself: the shipping column is literally named shipping(price), because CJ asks you to declare the sub-attributes you use even when it is only the price. And while the column order is free, the column names must match the spec exactly; the template's header is pinned against CJ's published field list, and a column CJ does not know costs a warning, not a rejection.

02

The file name is part of the protocol

  • The file name registered on the form must match the served file exactly: case-sensitive, extension included
  • A mismatch produces silence: no receipt e-mail, no error e-mail. CJ calls it the most common cause of "no confirmation"
  • CJ fetches the URL once a day, and only when the file's Last-Modified date has moved
  • Test mode sends the import result e-mails without saving the feed or showing it to publishers
Technical details

CJ identifies an incoming file by the name you typed on the registration form, not by the URL alone. The name is case-sensitive, includes the extension, and must stay constant, with no date stamps. Get it wrong and nothing tells you: no import confirmation, no results notification. It is the single most common setup failure on CJ's own troubleshooting page, which is why the registration step of this page spells it out.

Reporting is by e-mail, not HTTP: every import produces a receipt confirmation and a results e-mail with a JSON attachment listing line-level errors. CJ fetches a hosted URL once per day; the schedule cannot be changed, and more frequent updates mean pushing to CJ's SFTP instead. The fetch is conditional on the file's Last-Modified date, so Feedflock regenerates the file as your catalogue changes and tracks every download, alerting you if they stop.

03

Prices, sale prices and the identifier rule

  • price carries the regular price (the compare-at price when the variant is on sale); sale_price the discounted one
  • Amount plus ISO code in the cell (59.00 USD), or a bare amount with the feed-level currency: dot decimal, no thousands separator
  • price is rounded to two decimals, sale_price truncated: CJ's own asymmetric rule
  • Identifiers: brand + GTIN or brand + MPN, else identifier_exists = no. Breaking the rule rejects the product
Technical details

CJ lets you pass a bare amount and apply the currency set on the registration form, or pass the amount with its ISO code. The template sends the code, because the form's currency cannot be edited after the feed is created. One product must stay in one currency across price, shipping and tax. The decimal format is a feed-level setting, and CJ's own warning is blunt: pick the EU comma format and submit 1,000, and publishers see a price of 1.

The identifier rule is the one thing that rejects products wholesale: your product must have GTIN and brand, or MPN and brand. If it is missing brand and either of the two, identifier_exists must be no, and a blank identifier_exists defaults to yes. GTIN accepts 8, 10, 11, 12, 13 or 14 digits, including the 10- and 11-digit lengths Google does not take. Whether prices include VAT is the one thing the spec never says; the template sends the Shopify price your customer actually pays.

04

Categories, custom labels and item-level commissioning

  • google_product_category is Google's tree. CJ takes the numeric ID or the full path, in 16 languages including Czech
  • The field is optional but required for product reporting in Insights; a wrong value is ignored, not rejected
  • product_type is your own path, up to 750 characters: free text, comma- or slash-separated
  • Product lists for item-level commissioning read product_type, google_product_category and custom_label_0-4
Technical details

CJ publishes no category tree of its own: google_product_category takes an exact string from Google's taxonomy, either the numeric ID or the full path, and CJ passes both to publishers. It is optional, but without it there is no product reporting in Insights. Sixteen taxonomy languages are supported (en-US, de-DE, cs-CZ among them), while enumerated values and column names are always English.

The registration form does the rest, and several of its answers cannot be edited later: the feed name, the target country, the currency and the content language are fixed at creation. For item-level commissioning, product lists must exist before the first import, and they read from product_type, google_product_category or the custom labels. That is why the template carries your product type and leaves custom_label_0 and custom_label_1 ready for tags and collections.

The takeaway

One URL, fetched once a day, and a CSV that speaks CJ's Shopping vocabulary column for column: condition included, the identifier rule checked, prices in the form publishers read. Your Shopify catalog stays the single source of truth for every publisher in the network.

Claude · ChatGPT

Or set up your CJ Affiliate feed in chat

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

feedflock · mcp

Create a CJ Affiliate 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

Almost. CJ's Shopping (Google Format) feed follows the Google spec, and CJ says a Google feed works with a few modifications. The Feedflock CJ template applies them for you: condition is added (CJ requires it, Google does not), the six Google-only columns are left out, id stays within 50 characters, and the shipping column uses CJ's compound header form shipping(price).
Once per day, for every fetch method, and the schedule cannot be changed. CJ pulls the file only when its Last-Modified date has moved since the last import. If you need updates more than once a day, CJ's own answer is pushing to its SFTP instead. Feedflock regenerates the file as often as every hour, so the daily fetch always reads current prices and stock.
Almost certainly the file name. CJ identifies the file by the name you registered (case-sensitive, extension included, constant over time), and a mismatch produces no receipt and no error e-mail at all. CJ calls this the most common cause of the problem. Register the name exactly as the file is served, and submit in test mode first so the results e-mail confirms the match on day one.
The summary table names id, title, description, link, availability, price and condition, with brand required for new products and gtin or mpn under the identifier rule. Feedflock maps eight from the start: the seven plus image_link, because an affiliate row with no image is a row no content publisher can place.
No. Commissions live in your CJ program and its product lists, which read the feed's product_type, google_product_category or custom labels. What the feed must carry is an id that matches the SKUs your CJ pixel sends, exactly and case-sensitively, or item-level commissioning never fires.
CJ's spec never says. The only mention of VAT in the whole document is in the shipping sub-attributes. Feedflock sends the Shopify price your customer actually pays, with the ISO currency code in the cell, and one product keeps one currency across price, shipping and tax, as CJ requires.
Yes. Filter by collection, tag, vendor, price or stock level, or leave out individual variants. The CSV is one row per variant, so excluding a size or colour removes exactly that row.

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