
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.

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.
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.
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.
Setup
Live in five steps
From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.
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.
Install Feedflock
Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.
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.
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.
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
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"

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
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.
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
URLonce 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.
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
ISOcode in the cell (59.00USD), 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 +
GTINor 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.
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.
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
Related feeds
Explore all 101 channelsGet on every marketplace that matters this afternoon.
Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.