How-To Guide
How to Create (and Verify) a Product Feed in Shopify
The surprising answer: you do not need to create anything. Shopify already built your product feed. The real question is whether it is actually accessible — to Google, to ChatGPT, and to the other AI shopping agents that drive purchase decisions.
/products.json. No app or plugin is required. The feed is blocked far more often than merchants realize — by Cloudflare WAF rules, headless storefront misconfigurations, or Shopify's own password protection. This guide walks through 5 steps to verify it is working and fix it if it is not. Time required: 5 minutes.
The 5-step verification checklist
Open your product feed in an incognito browser
Navigate to https://yourdomain.com/products.json in an incognito window (important — cached sessions can mask redirects). You should see raw JSON starting with {"products":[.
✓ Expected: JSON response with products array
✗ Problem: Password page, 403, 404, or an HTML interstitial
If you see the Shopify storefront password page, your store is in pre-launch mode. Go to Shopify Admin → Online Store → Preferences → Disable password. If you see an error page, proceed to Step 2.
Test the feed with a bot user-agent
AI shopping agents identify themselves with a user-agent string like GPTBot/1.0. Cloudflare and other WAFs treat these differently from browser requests. Run this from your terminal:
curl -sI -A "GPTBot/1.0" https://yourdomain.com/products.json
✓ Expected: HTTP/2 200 and content-type: application/json
✗ Problem: HTTP/2 403, HTTP/2 401, or content-type: text/html (Cloudflare challenge page)
If the browser shows 200 but this curl returns 403 or HTML, Cloudflare's Bot Fight Mode is the culprit. See Step 4 for the fix.
Verify the product count
A feed that loads but returns 0 products is just as broken as a blocked feed. Check the count:
curl -s "https://yourdomain.com/products.json?limit=250" | \ python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['products']), 'products on page 1')"
✓ Expected: number close to your actual published product count (up to 250)
✗ Problem: 0 products, or far fewer than your catalog size
Zero products usually means you are on a headless storefront (Hydrogen on Vercel, Next.js, custom React) that does not proxy /products.json to your Shopify back-end. The new server returns an empty response instead of routing the request to Shopify's servers.
Check robots.txt for AI crawler blocks
Visit https://yourdomain.com/robots.txt and search for lines mentioning GPTBot, ClaudeBot, PerplexityBot, or blanket Disallow: / rules applied to User-agent: *.
User-agent: GPTBot Disallow: / # ← This blocks all ChatGPT crawling — remove or limit to /checkout/
Shopify's default robots.txt (the one it generates) does not block AI crawlers. But custom Liquid robots.txt files added by some apps or theme developers do. If you have a custom robots.txt, review it carefully.
Fix identified blockers
Cloudflare Bot Fight Mode blocking bots: In Cloudflare Dashboard → Security → Bots, disable Bot Fight Mode or create a Skip WAF rule that exempts specific AI user-agents. See our Cloudflare AI crawlers guide for the exact rule syntax.
Headless storefront not proxying /products.json: In your Next.js or Remix project, add a proxy route:
// pages/api/products.js (Next.js pages router)
export default async function handler(req, res) {
const shopifyUrl = `https://${process.env.SHOPIFY_STORE_DOMAIN}/products.json`;
const upstream = await fetch(shopifyUrl + '?' + new URLSearchParams(req.query));
const data = await upstream.json();
res.status(200).json(data);
}
Then add a rewrite in next.config.js to map /products.json to this API route, or handle it in middleware.
Shopify password protection: Disable in Shopify Admin → Online Store → Preferences → Password page. There is no way to make just the feed public while keeping the storefront gated.
What about custom product feeds?
If you need a feed in a specific format — Google Shopping XML, Meta Catalog, or a custom CSV — you have two options:
- Shopify channels (Google & YouTube, Facebook & Instagram): These apps generate the appropriate feed format and sync it directly to the relevant platform. They work in parallel with
/products.jsonand do not replace it. - Feed apps (DataFeedWatch, Omnivore, Nabu): Third-party apps that pull from Shopify's API and output a feed in any format you need. Useful for complex attribute mapping or multi-channel feeds.
For AI shopping agent discoverability, custom feed formats are not helpful — agents access /products.json directly. Focus on keeping the built-in feed public and complete.
How CatalogScan automates this check
Running these 5 steps manually takes about 5 minutes and requires access to a terminal. CatalogScan does all of them in one scan — including the bot user-agent test, product count check, robots.txt parse, and Cloudflare detection — and returns a scored report with prioritized fixes. It also runs the scan from a real server (not localhost), catching network-level blocks that curl from your own IP might not trigger.
Paste your store URL — full audit in under 2 minutes, no account required.
Check my product feed →Common questions
Do I need to install an app to create a product feed in Shopify?
No. Shopify creates /products.json automatically for every store on the Online Store channel. No app is needed to create the feed. Apps are only needed if you want a different format (Google Shopping XML, Meta Catalog) or if your feed needs advanced attribute mapping. For AI agent discoverability, the built-in feed is what matters.
How do I add products to my Shopify product feed?
Products appear in the feed automatically when they are published in your Online Store sales channel. If a product is missing from the feed, check that it is not set to "Draft" status and that it is included in the "Online Store" sales channel (Shopify Admin → Products → click the product → Sales channels). Unpublished or hidden products do not appear in /products.json.
Can I control which products appear in the feed?
You can only control which products appear by publishing or unpublishing them in the Online Store channel. There is no built-in way to exclude specific products from /products.json while keeping them published. If you need fine-grained control, some feed apps offer filtering by tag, collection, or metafield — but those apps output to their own feed URLs, not to the standard /products.json.