Skip to content
BestPrice.gr
Price comparison

BestPrice.gr feed for Shopify

BestPrice.gr is Greece's number-two price comparison site after Skroutz, and its crawler pulls your XML feed from a public URL roughly every two hours. Feedflock renders your Shopify catalog into that XML: every mandatory element present on every record, one record per colour with the sizes joined, availability always one of the nine fixed Greek values.

01 · ShopifyProduct in the catalog
Linen shirt SandNordlin · Men's shirtsSKU-2048 · S–XL
Price
49 €
In stock
0 pcs
When out of stock
02 · bestprice.xmlUpdated just now
<product>
<productId>9087654321</productId>
<mpn>SKU-2048</mpn>
<ean>8594000123453</ean>
<brand>Nordlin</brand>
<title>Linen shirt Sand</title>
<price>49.00</price>
<productURL>https://shop.example/products/linen-shirt-sand</productURL>
<imageURL>https://cdn.shop.example/img/linen-shirt-sand.jpg</imageURL>
<additional_image>https://cdn.shop.example/img/linen-shirt-sand-back.jpg</additional_image>
<stock>Y</stock>
<availability>Παράδοση σε 4-7 ημέρες</availability>
<category_path><![CDATA[Clothing > Men's shirts]]></category_path>
<color>Sand</color>
<size>S,M,L,XL</size>
<weight>0.3Kg</weight>
</product>

Setup

Live in five steps

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

  1. Register as a BestPrice merchant

    Open a merchant account at merchants.bestprice.gr. The feed URL is registered in the Merchant Panel under feed settings, and that is also where your general shipping rules live.

  2. Install Feedflock

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

  3. Pick the BestPrice template

    Create a new feed and choose the BestPrice template. Every mandatory element (productId, title, price, productURL, imageURL, brand, availability and category path) is mapped from the start.

  4. Tune title, identifiers and availability

    BestPrice wants the manufacturer in the title, so switch to the Brand + title mapping if yours lack it. Send at least one of MPN or EAN for classification, and keep availability on the nine spec values.

  5. Validate, then register the URL

    Run the file through BestPrice's own XML Validator, then paste the feed URL into the Merchant Panel. Make sure the four bot IPs and the BestPriceBot user agent can reach it.

    https://feedflock.appfleece.com/f/demo-bestprice/bestprice.xml
Feed health

Catch feed issues before BestPrice.gr 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 · bestprice.xml
76 / 100
To review: 4
No MPN or EAN on 8 productsBestPrice classifies on MPN and EAN and the spec's identifier row is mandatory, so send at least one. They fill from the Shopify SKU and barcode.
Availability outside the nine values on 5 productsAnything outside the nine fixed strings is mapped onto them, not rejected, but with no control over the result. The template's suggestions are all exact values.
Bare category path on 7 productsBestPrice wants the full breadcrumb down to the leaf, not just the final category. An incomplete path delays classification or excludes the product.
Missing size on 4 clothing productsSize is mandatory for clothing and footwear and must carry every available size of the colour, comma-separated.

The feed

What the channel receives

bestprice.xml
<product>
  <productId>9087654321</productId>
  <mpn>SKU-2048</mpn>
  <ean>8594000123453</ean>
  <brand>Nordlin</brand>
  <title>Linen shirt Sand</title>
  <price>49.00</price>
  <productURL>https://shop.example/products/linen-shirt-sand</productURL>
  <imageURL>https://cdn.shop.example/img/linen-shirt-sand.jpg</imageURL>
  <additional_image>https://cdn.shop.example/img/linen-shirt-sand-back.jpg</additional_image>
  <stock>Y</stock>
  <availability>Παράδοση σε 1-3 ημέρες</availability>
  <category_path><![CDATA[Clothing > Men's shirts]]></category_path>
  <color>Sand</color>
  <size>S,M,L,XL</size>
  <weight>0.3Kg</weight>
</product>
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

49 €

Feed fields

productId

9087654321

mpn

SKU-2048

ean

8594000123453

brand

Nordlin

title

Linen shirt Sand

price

49.00

productURL

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

stock

Y

availability

Παράδοση σε 1-3 ημέρες

category_path

Clothing > Men's shirts

color

Sand

size

S,M,L,XL

weight

0.3Kg

The channel

Greece's number-two comparison

BestPrice.gr is the second Greek price comparison site, next to Skroutz. A shop that lists on both covers the Greek comparison market with two XML feeds.

Sold out is a status, not a delisting

The availability value Εξαντλήθηκε exists precisely so a discontinued or unavailable product can stay in the feed. Selling out is a status change, not a removal.

Your own categories, no tree to learn

BestPrice publishes no category tree. You send the full path of your own shop taxonomy and BestPrice maps it at onboarding. The tag names are yours to choose too.

The feed

  • Every mandatory element present on every record, even empty, exactly as the spec demands for fields that have no value
  • One record per colour with every size of that colour joined into <size>, and each colour keeps a stable productId
  • Availability only ever one of the nine fixed Greek values, with the 1–3 day dispatch window as the safe default for warehouse stock
  • The <date> file timestamp in the exact YYYY-MM-DD HH:MM format, regenerated as often as every hour for the ~2-hour crawler
  • Weight ships with its unit ("0.3Kg"), and <shipping> stays out so the shipping rules in your Merchant Panel apply
  • Titles, brands and category paths escaped or wrapped in CDATA, with no unescaped & or <, the usual cause of an "Invalid XML Structure" rejection

Deep dive

01

How the BestPrice feed works

  • One XML file pulled from a URL you register in the Merchant Panel
  • The BestPrice crawler fetches it roughly every 2 hours, so regenerate hourly or daily
  • New products appear within about 3 working days of retrieval
  • Images are fetched once, so a replaced photo needs an update request in the Partner Platform
Technical details

BestPriceBot pulls one XML file from a public URL, roughly every two hours. There is no authentication; access control is meant to be an allowlist of the four published bot IPs or a firewall rule on the BestPriceBot user agent. The encoding must be UTF-8 or ISO-8859-7, consistently across the whole file.

The URL itself is registered in the Merchant Panel and must be updated there if it ever moves. New products go live within about three working days of retrieval, and images are fetched once, not on every crawl, so replacing a photo at the same URL takes an update request in the Partner Platform. Feedflock hosts the file on a stable URL and regenerates it hourly, so every crawl reads the current state.

02

Mandatory means present, even empty

  • Every mandatory element must exist in each record, even when it has no value
  • ISBN is mandatory for books, as books without one cannot be classified
  • MPN and EAN drive the automatic classification, so send at least one
  • A product with no photo sends an empty image field, never a placeholder
Technical details

BestPrice's rule is unusual: every mandatory field must be present in each record even when it has no value (ISBN excepted for non-books). An empty image field is the documented way to say "no photo yet"; a placeholder image is not. The template emits the mandatory elements unconditionally for exactly this reason.

Identifiers do the classifying. MPN and EAN are what BestPrice matches and categorises on, and the spec's identifier row is mandatory, so at least one of the two should be on every record. The productId must stay glued to the same product forever: reusing it for a different product is forbidden, and changing it makes the product new again, and reviews, statistics and click history are lost.

03

Colours split, sizes join

  • Each colour of a model is a separate record with its own productId
  • Sizes of one colour list comma-separated in <size>, mandatory for clothing and footwear
  • Outside fashion, every variant must be its own record
  • The template groups per colour; one group-key change switches to per-variant
Technical details

BestPrice pulls the two variant axes in opposite directions. Colours split: a product available in several colours is a separate record per colour, each with its own productId. Sizes join: every available size of that colour lists in one comma-separated <size> field, and for clothing and footwear that field is mandatory.

Outside fashion the rule is stricter: every variant (capacity, length, voltage) must be its own record. The template's default groups per product and colour, which is what clothing and footwear need; a non-fashion catalog switches the feed's group key to the variant id and gets one record per variant.

04

Shipping: two scalars and a panel

  • <shipping> is a per-product flat cost, only when it is location-independent; 0 means free
  • <weight> goes in grams or with its unit, and is mandatory once a weight rule exists
  • An empty shipping field means the Merchant Panel's general rules apply
  • There is no carrier element and no carrier vocabulary anywhere in the spec
Technical details

The feed's whole delivery vocabulary is two optional per-product scalars. <shipping> is a fixed cost, and only when it applies regardless of the destination; 0 means free delivery everywhere. <weight> goes in grams or as a number with its unit, and becomes mandatory as soon as you define a weight-based shipping rule in the Merchant Panel.

Everything else (weight and price ladders) lives in the Merchant Panel, and leaving <shipping> empty is exactly how those general rules stay in charge. That is why the template ships the element unmapped: a merchant with one flat nationwide rate sets it per feed, everyone else keeps the rules they already configured on BestPrice's side.

The takeaway

One URL, a crawler that reads it every two hours, and an XML built field for field from BestPrice's own spec. Your Shopify catalog stays the single source of truth, and BestPriceBot always reads its current state.

Claude · ChatGPT

Or set up your BestPrice.gr feed in chat

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

feedflock · mcp

Create a BestPrice.gr 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

The crawler visits and retrieves the XML file roughly every 2 hours, and BestPrice asks you to regenerate it ideally every hour, or daily at minimum. Feedflock regenerates the file on your schedule, as often as every hour, on a stable URL.
BestPrice runs its own XML Validator at merchants.bestprice.gr/xml-validator, and it reports the exact position of a structural error. The usual cause of an "Invalid XML Structure" rejection is an unescaped & or < outside CDATA, or a mixed encoding.
Yes, the manufacturer must appear in the title even though <brand> carries it too. The template sends your Shopify title as it is; if your titles lack the brand, switch to the Brand + title mapping. No all-caps titles and no promotional phrases like "free shipping".
One of the nine fixed Greek strings, from "Σε απόθεμα" and "Παράδοση σε 1-3 ημέρες" to "Κατόπιν παραγγελίας" and "Εξαντλήθηκε". A shop with no physical pickup point should use the 1–3 day window rather than "Σε απόθεμα". A value outside the nine is mapped onto them, not rejected, but you lose control over the wording.
It can stay in the feed with availability "Εξαντλήθηκε". That value exists precisely so an unavailable or discontinued product can remain listed. The optional <stock> flag carries Y or N; left empty, the product is automatically treated as "Κατόπιν παραγγελίας" (to order).
Only a flat per-product cost that is independent of the destination; 0 means free shipping. Anything else stays empty, and an empty field means the general rules from your Merchant Panel apply. If you use weight-based rules there, the <weight> element becomes mandatory in the feed.

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