IVO
Back to help center
Merchant Integration

Feed integration: XML, JSON and CSV

A complete guide to connecting IVO with a product feed, including fields, mapping, stock, locations and code examples.

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

  1. Open Merchant dashboard.
  2. Go to Products and then Import history, or go to Settings and then Integrations.
  3. Click Integrate a feed or New Integration.
  4. Choose Feed (XML, JSON, CSV).
  5. Enter the feed URL, run the preview, check the mapped products and save.

Requirements

  • The feed must be available at a public http or https URL.
  • 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

  1. IVO downloads the feed and detects the format.
  2. For JSON and XML, IVO looks for a product list such as products, product, offers, offer, RSS channel.item or the largest nested product array.
  3. For CSV, IVO detects comma, semicolon, tab or pipe delimiters and reads rows by header name.
  4. The preview reads up to 10 sample products and shows the source keys found in the feed.
  5. IVO suggests field mapping automatically from common names and, when useful, from the sample values.
  6. You can adjust the mapping manually before saving.
  7. When the integration runs, products are sent in batches of 100 and processed by the merchant import system.
  8. 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,Silver

Recommended fields

IVO fieldRequiredMeaningCommon source names
merchant_internal_idNo, but strongly recommendedYour SKU or stable product ID. Used to update the same offer on future syncs.sku, id, code, article, merchant_internal_id
nameYesProduct name. Include brand, model and important variant details.name, title, product_name, denumire
priceYesPositive selling price. It may include currency, for example 15999 MDL.price, pret, g:price
currencyNoCurrency code. Defaults to MDL if not supplied.currency, valuta, moneda
availabilityNoStock quantity. Numeric values are used as quantities. 0, false, out of stock and unavailable mean no stock.availability, stock, quantity, qty
descriptionNoLong product description.description, descriere, long_description
brandNoManufacturer or brand.brand, marca, manufacturer
eanNoBarcode / GTIN / EAN.ean, gtin, barcode
categoryNoYour category path or product type. It helps AI choose the right IVO category.category, categorie, product_type
imageNo, recommendedMain and additional image URLs. Multiple fields can map to the same IVO image field.image, images, image_link, image_1, gallery
variant_optionNoVariant attributes such as color, size, memory, material, pattern, age group or gender.color, size, material, memory
weight, volumeNoLogistic 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_chisinau to the Chisinau point and stock_balti to 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

  • name is mandatory.
  • price is 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, LEU and MDL become MDL. 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 Case or Cable. 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.

Was this article helpful?

Share quick feedback so we can improve it.

Related articles

Merchant Integration

Merchant API reference

Full reference for the merchant API: authentication, every endpoint, and what each input and output field means.

Merchant Integration

Extensions: how they work

A generic overview of how IVO marketplace extensions typically install, authorize, sync, and report status.

Merchant Integration

Magento 2 extension: installation

Install the IVO Marketplace Magento 2 extension and connect your store to IVO.

Merchant Integration

OpenCart 4 extension: installation

Install the IVO Marketplace OpenCart extension and connect your store to IVO.