
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.

Setup
Live in five steps
From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.
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.
Install Feedflock
Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.
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.
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.
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
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.
The feed
What the channel receives
<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>

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
How the BestPrice feed works
- One
XMLfile pulled from aURLyou 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.
Mandatory means present, even empty
- Every mandatory element must exist in each record, even when it has no value
ISBNis mandatory for books, as books without one cannot be classifiedMPNandEANdrive 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.
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.
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.
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
Related feeds
Explore all 101 channelsGet on every marketplace that matters this afternoon.
Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.