Feed Formats
Use a hosted product feed when a store can expose its catalog at a stable HTTP or HTTPS URL. IntentFlow downloads the document and upserts products by external_id. The URL must return the feed directly with a successful HTTP response; redirects and ordinary public HTTP authentication behavior are handled by the HTTP client, but custom request headers and credentials are not currently configurable.
IntentFlow supports three feed formats:
| Dashboard format | Internal value | Use it for |
|---|---|---|
| CSV | csv | Simple exports and large custom catalogs. |
| JSON | json | Custom sites that can publish structured product data. |
| Google Merchant XML | google_xml | Existing Google Shopping-compatible RSS feeds. |
Add a feed
- Publish the feed at a stable URL that IntentFlow can reach.
- In the merchant dashboard, open the store and go to Feeds → Add feed.
- Enter an optional name and the feed URL, then select the matching format.
- Choose a refresh interval: every 15 minutes, hourly, every 6 hours, or daily.
- Save the feed. Use Run now on the Feeds page to test it immediately.
- Open Logs to check processed, valid, and invalid row counts. A structural error fails the run; invalid individual products are recorded as failed rows.
Keep external_id stable and unique within a store. A later row with the same ID updates the existing product instead of creating another one.
Canonical product fields
CSV and JSON feeds use these field names. Field names are case-sensitive in JSON. CSV headers are trimmed, lowercased, and may start with a UTF-8 BOM.
| Field | Required | Accepted value |
|---|---|---|
external_id | Yes | String, maximum 255 characters. A stable ID from the source shop. |
title | Yes | String, maximum 255 characters. |
price | Yes | Number greater than or equal to zero, without a currency symbol. |
url | Yes | Absolute URL, maximum 2,048 characters. |
subtitle | No | String, maximum 255 characters. |
description | No | String; HTML is retained in the raw value and converted to plain text for search. |
category | No | String, maximum 255 characters. Use >, /, or ` |
brand | No | String, maximum 255 characters. |
author | No | String, maximum 255 characters. |
isbn, gtin, ean | No | String, maximum 32 characters. |
sku, mpn | No | String, maximum 255 characters. |
compare_at_price | No | Number greater than or equal to zero. |
currency | No | Three-letter currency code, such as EUR. The store currency is used when omitted. |
image_url | No | Absolute URL, maximum 2,048 characters. |
images | No | Additional image values; see the format-specific notes below. |
in_stock | No | 0, 1, true, false, yes, or no. |
stock_quantity | No | Integer greater than or equal to zero. It takes precedence over in_stock; 0 is out of stock and 1–3 is low stock. |
attributes | No | Custom label/value data; see the format-specific notes below. |
Any other CSV column or JSON property is preserved as an additional product attribute when its value is non-empty. Attribute values are stored as strings and may be at most 1,000 characters.
CSV
CSV feeds must be UTF-8, use a comma delimiter, and put the header on the first row. Fields containing commas, quotes, or line breaks must use standard CSV quoting. The required headers are external_id, title, price, and url; category is optional. Blank lines are ignored.
external_id,title,description,category,brand,price,currency,url,image_url,in_stock,color
sku-1001,"Road Runner, Blue",Lightweight road shoe,Shoes > Running,Acme,99.99,EUR,https://shop.example/products/sku-1001,https://cdn.example/sku-1001.jpg,true,blue
sku-1002,Trail Runner,All-terrain shoe,Shoes > Trail,Acme,119.00,EUR,https://shop.example/products/sku-1002,https://cdn.example/sku-1002.jpg,false,blackExtra columns such as color become product attributes. In a CSV attributes cell, provide pairs separated by semicolons or commas and separate each name from its value with : or =, for example color: blue; size=42.
JSON
A JSON feed is either a top-level array of products or an object whose products property contains that array. Every array item must be an object. Non-object items are ignored; a document without an array fails the import.
{
"products": [
{
"external_id": "sku-1001",
"title": "Road Runner, Blue",
"description": "Lightweight road shoe",
"category": "Shoes > Running",
"brand": "Acme",
"price": 99.99,
"currency": "EUR",
"url": "https://shop.example/products/sku-1001",
"image_url": "https://cdn.example/sku-1001-main.jpg",
"images": [
"https://cdn.example/sku-1001-side.jpg"
],
"in_stock": true,
"attributes": {
"color": "blue",
"size": "42"
}
}
]
}Use an object for attributes. Arrays and objects supplied as other custom properties are JSON-encoded and stored as string attributes. JSON booleans are accepted for in_stock and normalized to true or false.
Google Merchant XML / Google Shopping
Select Google Merchant XML for an RSS 2.0 Google Shopping product feed. The document must contain <channel> and <item> elements and declare Google's product namespace exactly as shown below.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Example Shop</title>
<link>https://shop.example</link>
<description>Example Shop product catalog</description>
<item>
<g:id>sku-1001</g:id>
<g:title>Road Runner, Blue</g:title>
<g:description>Lightweight road shoe</g:description>
<g:link>https://shop.example/products/sku-1001</g:link>
<g:image_link>https://cdn.example/sku-1001.jpg</g:image_link>
<g:availability>in stock</g:availability>
<g:price>99.99 EUR</g:price>
<g:brand>Acme</g:brand>
<g:product_type>Shoes > Running</g:product_type>
<g:google_product_category>187</g:google_product_category>
</item>
</channel>
</rss>The current importer maps these Google fields:
| Google element | IntentFlow field | Behavior |
|---|---|---|
g:id | external_id | Required by row validation. |
g:title | title | Required by row validation. |
g:price | price | The first decimal number is extracted; the currency suffix is not imported. |
g:link | url | Falls back to the unprefixed item <link>. |
g:image_link | image_url | Optional. |
g:product_type | category | Preferred when present. |
g:google_product_category | category | Used only when g:product_type is empty. |
g:availability | in_stock | out of stock and out_of_stock become false; every other value becomes true. |
Other Google elements—including g:description, g:brand, identifiers, additional images, sale price, and shipping data—are not currently mapped by the Google XML parser. If those fields are important to search or enrichment, publish the feed as CSV or JSON using the canonical field names instead.
Custom-site implementation checklist
- Serve the feed as UTF-8 from a stable HTTP or HTTPS URL.
- Return a successful response within two minutes. IntentFlow retries a failed request twice before marking the run failed.
- Generate absolute product and image URLs.
- Keep IDs stable across runs and never reuse an ID for a different product.
- Emit plain numeric prices in CSV/JSON. Google XML may append a currency code.
- Validate a sample feed with Run now, then inspect Logs before enabling a frequent schedule.
- Update the document atomically so IntentFlow never fetches a half-written feed.
For manually uploaded CSV files, see Importing Products. For import status concepts, see Product Imports.