Skip to content

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 formatInternal valueUse it for
CSVcsvSimple exports and large custom catalogs.
JSONjsonCustom sites that can publish structured product data.
Google Merchant XMLgoogle_xmlExisting Google Shopping-compatible RSS feeds.

Add a feed

  1. Publish the feed at a stable URL that IntentFlow can reach.
  2. In the merchant dashboard, open the store and go to Feeds → Add feed.
  3. Enter an optional name and the feed URL, then select the matching format.
  4. Choose a refresh interval: every 15 minutes, hourly, every 6 hours, or daily.
  5. Save the feed. Use Run now on the Feeds page to test it immediately.
  6. 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.

FieldRequiredAccepted value
external_idYesString, maximum 255 characters. A stable ID from the source shop.
titleYesString, maximum 255 characters.
priceYesNumber greater than or equal to zero, without a currency symbol.
urlYesAbsolute URL, maximum 2,048 characters.
subtitleNoString, maximum 255 characters.
descriptionNoString; HTML is retained in the raw value and converted to plain text for search.
categoryNoString, maximum 255 characters. Use >, /, or `
brandNoString, maximum 255 characters.
authorNoString, maximum 255 characters.
isbn, gtin, eanNoString, maximum 32 characters.
sku, mpnNoString, maximum 255 characters.
compare_at_priceNoNumber greater than or equal to zero.
currencyNoThree-letter currency code, such as EUR. The store currency is used when omitted.
image_urlNoAbsolute URL, maximum 2,048 characters.
imagesNoAdditional image values; see the format-specific notes below.
in_stockNo0, 1, true, false, yes, or no.
stock_quantityNoInteger greater than or equal to zero. It takes precedence over in_stock; 0 is out of stock and 1–3 is low stock.
attributesNoCustom 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.

csv
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,black

Extra 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.

json
{
  "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
<?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 &gt; Running</g:product_type>
      <g:google_product_category>187</g:google_product_category>
    </item>
  </channel>
</rss>

The current importer maps these Google fields:

Google elementIntentFlow fieldBehavior
g:idexternal_idRequired by row validation.
g:titletitleRequired by row validation.
g:pricepriceThe first decimal number is extracted; the currency suffix is not imported.
g:linkurlFalls back to the unprefixed item <link>.
g:image_linkimage_urlOptional.
g:product_typecategoryPreferred when present.
g:google_product_categorycategoryUsed only when g:product_type is empty.
g:availabilityin_stockout 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.

Replace placeholder content before publishing.