What this integration does
The Feed (XML, JSON, CSV) integration lets IVO read your product catalog from a public URL. You publish one feed file on your website or server, then IVO fetches it, previews the products, maps your fields to IVO fields and synchronizes the catalog through the normal merchant import pipeline.
Use this option when you can generate a catalog export but you do not want to install a platform plugin or call the Merchant API yourself.
Where to configure it
- Open Merchant dashboard.
- Go to Products and then Import history, or go to Settings and then Integrations.
- Click Integrate a feed or New Integration.
- Choose Feed (XML, JSON, CSV).
- Enter the feed URL, run the preview, check the mapped products and save.
Requirements
- The feed must be available at a public
httporhttpsURL. - The URL must return the feed content directly, not an HTML page, login page or download interstitial.
- IVO must be allowed to access it with the User-Agent
IVO.md (+https://ivo.md/help/merchant-integration/ivo-md-crawler). - The feed should be UTF-8 encoded. CSV feeds should keep the first row as headers.
- Every product should have at least a name and a valid positive price.
- Use a stable SKU or internal ID whenever possible. This lets IVO update the same offer instead of treating it as a new product.
How IVO processes the feed
- IVO downloads the feed and detects the format.
- For JSON and XML, IVO looks for a product list such as
products,product,offers,offer, RSSchannel.itemor the largest nested product array. - For CSV, IVO detects comma, semicolon, tab or pipe delimiters and reads rows by header name.
- The preview reads up to 10 sample products and shows the source keys found in the feed.
- IVO suggests field mapping automatically from common names and, when useful, from the sample values.
- You can adjust the mapping manually before saving.
- When the integration runs, products are sent in batches of 100 and processed by the merchant import system.
- Existing offers are updated by merchant internal ID; new products enter the product import and review flow.
Supported formats
JSON
JSON may be a direct array or an object containing a product list. Common accepted roots are products, product, offers and offer.
{
"products": [
{
"sku": "SKU-1001",
"name": "Laptop 14 Ultra",
"price": "15999 MDL",
"currency": "MDL",
"availability": 7,
"brand": "ExampleBrand",
"ean": "5940000000011",
"category": "Laptopuri",
"description": "Laptop compact cu 16 GB RAM si SSD 512 GB.",
"images": [
"https://example.com/images/sku-1001-1.jpg",
"https://example.com/images/sku-1001-2.jpg"
],
"color": "Silver",
"memory": "16 GB"
}
]
}XML
XML can be a simple catalog or an RSS / Google Shopping style feed. Namespaces such as g:title are accepted; IVO normalizes them during parsing.
<products>
<product>
<id>SKU-1001</id>
<name>Laptop 14 Ultra</name>
<price>15999</price>
<currency>MDL</currency>
<availability>7</availability>
<brand>ExampleBrand</brand>
<ean>5940000000011</ean>
<category>Laptopuri</category>
<description>Laptop compact cu 16 GB RAM si SSD 512 GB.</description>
<image>https://example.com/images/sku-1001-1.jpg</image>
<image_2>https://example.com/images/sku-1001-2.jpg</image_2>
<color>Silver</color>
</product>
</products>CSV
CSV must have headers on the first row. IVO detects ,, ;, tab and |. Put image URLs either in separate columns such as image_1, image_2, or in one image column separated by spaces or commas.
sku,name,price,currency,availability,brand,ean,category,image_1,image_2,color
SKU-1001,Laptop 14 Ultra,15999,MDL,7,ExampleBrand,5940000000011,Laptopuri,https://example.com/1.jpg,https://example.com/2.jpg,SilverRecommended fields
| IVO field | Required | Meaning | Common source names |
|---|---|---|---|
merchant_internal_id | No, but strongly recommended | Your SKU or stable product ID. Used to update the same offer on future syncs. | sku, id, code, article, merchant_internal_id |
name | Yes | Product name. Include brand, model and important variant details. | name, title, product_name, denumire |
price | Yes | Positive selling price. It may include currency, for example 15999 MDL. | price, pret, g:price |
currency | No | Currency code. Defaults to MDL if not supplied. | currency, valuta, moneda |
availability | No | Stock quantity. Numeric values are used as quantities. 0, false, out of stock and unavailable mean no stock. | availability, stock, quantity, qty |
description | No | Long product description. | description, descriere, long_description |
brand | No | Manufacturer or brand. | brand, marca, manufacturer |
ean | No | Barcode / GTIN / EAN. | ean, gtin, barcode |
category | No | Your category path or product type. It helps AI choose the right IVO category. | category, categorie, product_type |
image | No, recommended | Main and additional image URLs. Multiple fields can map to the same IVO image field. | image, images, image_link, image_1, gallery |
variant_option | No | Variant attributes such as color, size, memory, material, pattern, age group or gender. | color, size, material, memory |
weight, volume | No | Logistic or product measurements when relevant. | weight, greutate, volume |
Field mapping
In the preview step, IVO shows raw source keys from your feed on the left and IVO fields on the right. If your feed uses standard names, mapping is usually automatic. If your feed uses custom names, select the target field manually.
Multiple source keys may map to the same IVO field. This is useful for images, descriptions and variant options. For example, image_1, image_2 and gallery can all map to image; color and size can both map to variant_option.
Merchant points and stock strategy
Every synced offer must belong to a stock strategy. Choose one of these approaches:
- One default merchant point: all products from the feed are attached to one selected location.
- Detected stock fields: map different stock columns to different merchant points, for example
stock_chisinauto the Chisinau point andstock_baltito the Balti point. - All products available in all points: IVO creates availability for every merchant point and uses a default availability value.
If you enable Out of stock on missing, products previously imported by this same feed but missing from the latest feed will be set to stock 0. Enable it only when your feed is complete on every run.
Defaults and price modifier
Defaults fill values that are absent from the feed: currency, availability, brand, category, description or image. The price modifier changes prices during import. For example, 10 increases feed prices by 10%, and -5 decreases them by 5%.
Validation rules
nameis mandatory.priceis mandatory and must be greater than zero.- If no SKU exists, IVO generates a stable internal ID from the name, price, brand and EAN, but a real SKU is safer.
- Currency is normalized.
LEI,LEUandMDLbecomeMDL. Other currencies should use a three-letter code. - The integration sync has a safety cap of 5000 mapped products per run.
- Images should be absolute URLs reachable by IVO.
PHP example: generate JSON feed
<?php
header('Content-Type: application/json; charset=utf-8');
$products = [
[
'sku' => 'SKU-1001',
'name' => 'Laptop 14 Ultra',
'price' => 15999,
'currency' => 'MDL',
'availability' => 7,
'brand' => 'ExampleBrand',
'ean' => '5940000000011',
'category' => 'Laptopuri',
'description' => 'Laptop compact cu 16 GB RAM si SSD 512 GB.',
'images' => [
'https://example.com/images/sku-1001-1.jpg',
'https://example.com/images/sku-1001-2.jpg',
],
'color' => 'Silver',
'memory' => '16 GB',
],
];
echo json_encode(['products' => $products], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);Node.js example: generate JSON feed
import express from 'express';
const app = express();
app.get('/ivo-feed.json', (req, res) => {
res.type('application/json');
res.json({
products: [
{
sku: 'SKU-1001',
name: 'Laptop 14 Ultra',
price: 15999,
currency: 'MDL',
availability: 7,
brand: 'ExampleBrand',
ean: '5940000000011',
category: 'Laptopuri',
description: 'Laptop compact cu 16 GB RAM si SSD 512 GB.',
images: [
'https://example.com/images/sku-1001-1.jpg',
'https://example.com/images/sku-1001-2.jpg'
],
color: 'Silver',
memory: '16 GB'
}
]
});
});
app.listen(3000);Python example: generate CSV feed
from flask import Flask, Response
import csv
import io
app = Flask(__name__)
@app.get('/ivo-feed.csv')
def ivo_feed():
rows = [
{
'sku': 'SKU-1001',
'name': 'Laptop 14 Ultra',
'price': '15999',
'currency': 'MDL',
'availability': '7',
'brand': 'ExampleBrand',
'ean': '5940000000011',
'category': 'Laptopuri',
'image_1': 'https://example.com/images/sku-1001-1.jpg',
'image_2': 'https://example.com/images/sku-1001-2.jpg',
'color': 'Silver'
}
]
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
return Response(output.getvalue(), mimetype='text/csv; charset=utf-8')Common mistakes
- Using product names that are too generic, such as
CaseorCable. Add brand, model and variant details. - Changing SKU values between syncs. Keep them stable.
- Publishing relative image paths such as
/image.jpg. Use full URLs. - Protecting the feed with a login or blocking the IVO crawler.
- Enabling Out of stock on missing while sending only a partial feed.
- Putting multiple unrelated products under the same variant group. Only group true variants of the same product.
After saving
The first sync starts after the enabled integration is saved. You can later open Settings > Integrations and use the sync action manually. Product progress and errors are visible in Products > Import history.