Skip to content
vviinn DocsDocs Beta

How to Prepare a Product Feed

Connecting a catalog is the first thing every new site needs, and the file itself is usually where people get stuck first — not because the format is complicated, but because it’s easy to assume it’s stricter than it is. vviinn’s column names follow Google Merchant Center’s naming (gtin, availability, image_link, and so on), which leads a lot of people to prepare a Google Shopping XML feed. That’s the wrong file: vviinn never parses XML.

What it actually reads is any delimited text file with a header row — the same shape a spreadsheet export or a database dump already comes in. There’s no template to fill in and no schema to upload separately; the file’s own header row is the schema, matched against the columns vviinn recognizes.

flowchart LR
    A["Feed file<br/>any delimiter, any extension"] -->|Start Import| B["Delimiter and id column<br/>detected from the header row"]
    B --> C[Product Catalog]

What happens on import. It leaves out column mapping and custom fields, both covered below.

You’ll need a site already created in Panel — see First Steps if you don’t have one yet.

The smallest feed that imports successfully is a plain text file with a header row containing at least an id column, and one data row per product:

id,title,price,availability
SKU-001,Running Shoe,79.90,in_stock

Add the file’s URL under Site → Data source in Panel, then Start Import. For the full list of columns vviinn recognizes, their types, and value formats, see Product Feed — this page only covers the format itself and the questions that come up while preparing one.

The most common case, and the one every platform’s product export already produces. Comma-separated, with the header row as the first line.

Works the same way — the delimiter is detected from the header row, not assumed from the file extension. A tab-separated .txt export needs no conversion.

Add more than one Source in Panel and they’re merged into one catalog on import. If two feeds might reuse the same product IDs, give each one an id_prefix so they don’t collide; if they share a category taxonomy but mean different things by it, a product_type_prefix keeps them apart the same way. Both are per-feed settings, available via the API — ask support@vviinn.com if you need them exposed for your account.

A column in your file that isn’t one of vviinn’s recognized names is ignored, not rejected — it needs to be defined first, under Site → Data source → Fields. Once defined, the same file with that column in it picks the values up automatically; no separate upload. See Custom fields.

There’s no XML format — only delimited text

Section titled “There’s no XML format — only delimited text”

vviinn’s column vocabulary mirrors Google Merchant Center’s, but that’s naming convention only — the import pipeline has no XML parser. Sending a Google Shopping XML feed fails; convert it to CSV (or any other delimited format) first.

The file must have an id column, spelled exactly that

Section titled “The file must have an id column, spelled exactly that”

This isn’t just a required field — it’s how the delimiter itself gets detected. vviinn scans the header row for a single punctuation character that, used as the separator, produces a column literally named id. No id column means the file can’t be parsed at all, regardless of what else is in it.

.csv, .txt, no extension at all — none of it matters. Only the actual delimiter and header row inside the file are read. A .txt file that happens to be comma-separated is handled identically to a .csv file.

A handful of columns have maximum lengths (for example title at 1,500 characters, id at 50). A value over the limit for its column is left out of that import entirely rather than cut short — worth knowing if a product is missing a field you know your feed sent.

Does my feed need to be a Google Shopping XML file? No. vviinn only reads delimited text (CSV, TSV, and similar) — there’s no XML support, despite the column names matching Google Merchant Center’s.

What file extension should I use? Whatever your export already produces. Extension is never checked — only the file’s actual content.

What’s the one column I absolutely need? id. The header row must contain a column with exactly that name, or the file can’t be parsed at all.

Can I use tabs or semicolons instead of commas? Yes — the delimiter is detected automatically from the header row.

How do I stop two feeds’ product IDs from colliding? Give each feed its own id_prefix.