Skip to content
eMAG
Marketplaces

eMAG feed for Shopify

eMAG Marketplace sells in Romania, Bulgaria and Hungary through one Marketplace API. It does not download a feed file: products and offers arrive as product_offer data, sent to the API in batches. Feedflock prepares that data from your Shopify catalog for eMAG Romania (one offer per variant, with prices net of VAT, the VAT rate ID, the price band, stock and handling time) and regenerates it every hour for your sync to send.

01 · ShopifyProduct in the catalog
Linen shirt SandNordlin · Men's shirtsSKU-2048 · S–XL
Price
259 lei
In stock
0 pcs
When out of stock
02 · emag.jsonUpdated just now
[
{
"id": "243409",
"part_number": "SKU-2048",
"part_number_key": "",
"ean": "8594000123453",
"category_id": "506",
"brand": "Nordlin",
"vendor_category_id": "",
"name": "Linen shirt Sand",
"description": "Relaxed linen shirt with a classic collar.",
"url": "https://shop.example/products/linen-shirt-sand",
"warranty": "0",
"weight": "220",
"images_main": "https://cdn.shop.example/img/linen-shirt-sand.jpg",
"images_secondary": [
"https://cdn.shop.example/img/linen-shirt-sand-back.jpg"
],
"sale_price": "214.05",
"recommended_price": "",
"min_sale_price": "149.835",
"max_sale_price": "321.075",
"vat_id": "1",
"currency_type": "",
"status": "1",
"stock": "0",
"handling_time": "1",
"supply_lead_time": "14"
}
]

Setup

Live in five steps

From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.

  1. Set up your eMAG seller account and API access

    Register on eMAG Marketplace, get an API user and whitelist the IP addresses your sync will call from. eMAG accepts API calls only from listed IPs.

  2. Install Feedflock

    Add Feedflock from the Shopify App Store. It reads your products, variants, stock and tax setup directly through the Shopify API.

  3. Pick the eMAG template

    Create a feed from the eMAG template. part_number, name, brand, ean, net sale_price, stock and handling_time are mapped per variant; the seller product ID comes from the custom.emag_id metafield.

  4. Set the category and VAT IDs

    Enter the leaf category_id from eMAG's category list, as a fixed value or from a metafield, and pin the vat_id from your account's VAT list. Prices go out without VAT; the rate travels as its ID.

  5. Send it with your eMAG sync

    Your sync takes the hourly data, wraps up to 50 offers per request in eMAG's data envelope and posts them to the Marketplace API. Feedflock prepares the content; it does not post to eMAG itself.

    https://feedflock.appfleece.com/f/demo-emag/emag.json
Feed health

Catch feed issues before eMAG does.

Before every generation Feedflock checks that every field the channel requires is filled, and, on templates verified against the channel's own spec, that the values fit its rules. Most problems are fixed with one click, without editing products in Shopify.

Feed quality · emag.json
76 / 100
To review: 4
Gross price in sale_price on 5 productseMAG reads every price field as net; a price with VAT ships the wrong number and skews the min–max price band.
vat_id sent as 21 on 3 productsvat_id is the rate's ID from your account's VAT list, not a percentage: 21 means VAT rate number 21.
part_number over 25 characters on 4 variantseMAG caps part_number at 25 characters and strips spaces, commas and semicolons from it on save.
Shopify variant ID as id on 9 productsShopify's 13–14 digit IDs are far above eMAG's maximum of 16 777 215, so the offer is rejected.

The feed

What the channel receives

emag.json
[
  {
    "id": "243409",
    "part_number": "SKU-2048",
    "part_number_key": "",
    "ean": "8594000123453",
    "category_id": "506",
    "brand": "Nordlin",
    "vendor_category_id": "",
    "name": "Linen shirt Sand",
    "description": "Relaxed linen shirt with a classic collar.",
    "url": "https://shop.example/products/linen-shirt-sand",
    "warranty": "0",
    "weight": "220",
    "images_main": "https://cdn.shop.example/img/linen-shirt-sand.jpg",
    "images_secondary": [
      "https://cdn.shop.example/img/linen-shirt-sand-back.jpg"
    ],
    "sale_price": "214.05",
    "recommended_price": "",
    "min_sale_price": "149.835",
    "max_sale_price": "321.075",
    "vat_id": "1",
    "currency_type": "",
    "status": "1",
    "stock": "0",
    "handling_time": "1",
    "supply_lead_time": "14"
  }
]
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

259 lei

Feed fields

.0.id

243409

.0.part_number

SKU-2048

.0.part_number_key

.0.ean

8594000123453

.0.category_id

506

.0.brand

Nordlin

.0.vendor_category_id

.0.name

Linen shirt Sand

.0.description

Relaxed linen shirt with a classic collar.

.0.url

https://shop.example/products/linen-shirt-sand

.0.warranty

0

.0.weight

220

.0.sale_price

214.05

.0.recommended_price

.0.min_sale_price

149.835

.0.max_sale_price

321.075

.0.vat_id

1

.0.currency_type

.0.status

1

.0.stock

0

.0.handling_time

1

.0.supply_lead_time

14

The channel

Sell on products eMAG already lists

If a product is already in eMAG's catalog, your offer attaches to it by part_number_key or EAN, with no new product page and no wait for content validation.

One API, three countries

The same Marketplace API and the same product_offer structure serve eMAG Romania, Bulgaria and Hungary. Only the locale, currency and VAT IDs differ per platform.

A price band against typos

On the first save eMAG asks for a minimum and maximum price for each offer, so a mistyped price outside the band never goes live.

The feed

  • The eMAG template maps every key eMAG requires: id, part_number, category_id, name, brand, sale_price, min and max price, vat_id, status, stock and handling_time
  • Prices go out net of VAT as eMAG requires, divided by the rate from your own Shopify tax setup, with the rate carried as its ID
  • The seller product ID is read from a metafield, because Shopify's variant IDs exceed eMAG's integer range
  • The required min and max price band is prefilled at 70 % and 150 % of the net price, and adjustable
  • Sale prices come from compare-at: recommended_price above sale_price shows the offer as a promotion
  • Stock is clamped at zero and a sold-out variant stays active with stock 0, the way eMAG expresses sold out

Deep dive

01

How products reach eMAG

  • eMAG does not download a feed file from a URL: its Marketplace API takes data in the request
  • Offers go in batches of up to 50 per request, with HTTP Basic credentials from whitelisted IPs
  • Stock can be updated on its own, without resending the whole offer
  • Feedflock prepares the product_offer data every hour; your sync sends it
Technical details

eMAG is not a comparison site that downloads a feed from a URL. Its Marketplace API takes product and offer data in the body of each request (up to 50 offers per request, authenticated with HTTP Basic credentials and accepted only from IP addresses you whitelist), and stock can be updated on its own.

Feedflock prepares the per-variant product_offer data, every key the API needs, and regenerates it every hour, so the sync that sends it always works from your current catalog. The sending itself is done by your sync, not by Feedflock.

02

Product and offer in one object

  • One product_offer carries the product documentation and the sellable offer together
  • Updating an offer needs only id, status, sale_price, vat_id, stock and handling_time
  • A new product also needs category_id, name, part_number and brand, and enters content validation
  • min_sale_price and max_sale_price are required on the first save
Technical details

One product_offer carries two halves: the product documentation (name, brand, part_number, description, images, ean and category_id) and the sellable offer (sale_price, vat_id, stock, handling_time and status). Updating an existing offer needs only the offer keys plus your id; a new product also needs category_id, name, part_number and brand, and then enters eMAG's content validation.

On the first save eMAG also asks for min_sale_price and max_sale_price. The seller product ID must be an integer up to 16 777 215, which Shopify's variant IDs far exceed, so the template reads it from a metafield you assign.

03

Net prices and the VAT ID

  • Every price is without VAT, up to four decimals and always above zero
  • The VAT rate travels separately as an ID from your account, never as a percentage
  • On eMAG Romania prices are in lei, and currency_type is left out
  • Feedflock computes the net prices from your Shopify tax rates
Technical details

All prices are without VAT, with up to four decimals and always above zero; the VAT rate travels separately as an ID from your account's VAT list, never as a percentage inside the price. On eMAG Romania prices are in lei, the platform's own currency, so currency_type stays empty.

Feedflock computes the net prices from the VAT rate in your Shopify tax settings, so a gross price never slips into a net field. recommended_price is the compare-at price, net as well, and must be higher than sale_price to show as a promotion.

04

Matching to eMAG's catalog

  • Attach to an existing product with its part_number_key or a single EAN
  • Creating a new product is the fallback, and it enters content validation before it can sell
  • category_id must be a leaf category, and the category decides whether EAN or warranty is mandatory
  • Sold out is stock 0, not status 0
Technical details

If the product already exists in eMAG's catalog, attach your offer with its part_number_key or a single EAN instead of creating a duplicate. Creating a new product is the fallback, and it enters content validation before it can sell.

category_id must be a leaf category from eMAG's list, and the category decides whether an EAN or a warranty is mandatory. An offer is for sale only with stock above 0 and status 1, so a sold-out variant stays active with stock 0.

The takeaway

A template that already speaks eMAG's product_offer structure, with net prices, the price band and stock regenerated every hour. Your Shopify catalog stays the single source of truth, and your eMAG sync always sends its current state.

Claude · ChatGPT

Or set up your eMAG feed in chat

Connect Feedflock to Claude or ChatGPT and ask. It creates the feed as a draft, maps your categories to eMAG's own tree and tells you what is still missing. You approve every change.

feedflock · mcp

Create a eMAG feed for my store and map my categories.

I'll create it as a draft and show you each change before I make it.

FAQ

No. eMAG's Marketplace API takes the data in each request, in batches of up to 50 offers, from IP addresses you whitelist. Feedflock prepares and refreshes the product_offer data every hour; a sync on your side sends it to eMAG.
eMAG Romania: prices in lei, Romanian VAT. The same API and the same data structure serve eMAG Bulgaria and Hungary, where only the locale, currency and VAT IDs differ.
eMAG reads every price field as net, with VAT carried separately as a rate ID. The template computes net prices from your Shopify tax setup for exactly this reason: the gross price would ship the wrong number.
Every offer needs a stable seller product ID (an integer up to 16 777 215, which a Shopify variant ID exceeds, so keep it in a metafield) plus a part number of up to 25 characters, mapped from the variant SKU. To attach to an existing eMAG product, add its part_number_key or a single EAN.
recommended_price above sale_price shows the offer as a promotion; equal or lower is no discount. The template maps it from Shopify's compare-at price, converted to net.
Not into the offer. The delivery fee is a setting in your eMAG seller account; the offer carries only handling_time, the number of days until the order ships, 0 for the same day.
Yes. Filter by collection, tag, price or stock level, or exclude individual variants, for example products without an EAN in a category that requires one.

Get on every marketplace that matters this afternoon.

Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.

.myshopify.com