This page is also available in: elΕλληνικά

Update

You can use the Data Feed Validator to validate your XML feed according to Skroutz standards.

XML Data Feed Specification Edit the file on GitHub

This document describes the structure of the XML file provided by merchants to Skroutz. We do not require a specific document template as long as the required product attributes are included (see attributes description).

Table of Contents

Requirements

In general, the XML file must meet the following requirements:

  • Clearly defines the document's encoding
  • Includes document's creation date
  • XML validates according to standards (you can check your XML's validity here)
  • In case document's size is bigger than 10MB, it has to be compressed(zip or gzip)
  • Doesn't repeat the same products more than once (see Unique ID)
  • Includes V.A.T. in prices

Follow this link for a valid XML example or read the XSD definition of the XML.

Alternatively, validate your XML feed against Skroutz standards.

Technical Specifications

SkroutzBot

Skroutz uses a web crawler to download XML feeds. It is identified with the HTTP header "User-Agent: SkroutzBot". Although we call it a bot, it does not comply to the standard definition (www.robotstxt.org).

SkroutzBot does not crawl the whole shop's site but only the following URLs:

  • the feed URL
  • the feed file images URLs: Skroutz downloads all products' images
  • the feed file products URLs: Skroutz downloads a sample of the products for quality control

SkroutzBot originates from the follοwing IPs:

  • IPv6: 2a03:e40::/32
  • IPv4: 185.6.76.0/22

Make sure that the SkroutzBot IPs have always access to the aforementioned URLs, without any rate limit. The xml link's domain does not matter.

Note

It might be necessary to whitelist SkroutzBot’s URLs on some rate-limiting tools like BitNinja, Cloudflare etc.

SkroutzBot will maintain a reasonable rate of requests.

SkroutzBot accepts https links, but only those that have an intermediate certificate signed by a CA(Certificate Authority) root certificate.

You can verify your certificate here or here.

SkroutzBot does not do basic HTTP authentication or any other kind of authentication. The preferred method is to use IP access control lists.

SkroutzBot sends an Accept-Encoding header and it can handle gzip and zip compression. The shop's server should not deny access to SkroutzBot if it uses exclusively gzip or zip compression.

Note

An easy way to emulate the SkroutzBot is to use the linux program curl, for example:

curl -H 'user-agent: SkroutzBot v1.0' -H 'accept: application/xml,application/gzip,text/csv,application/xhtml+xml;q=0.9,*/*;q=0.8' -H 'accept-encoding: gzip' -i -L --compressed <feed_file_url>

Skroutz ImageBot

Skroutz uses a bot to download the product images. It is identified with the HTTP header "User-Agent: Skroutz ImageBot v1".

Make sure to whitelist the "Skroutz ImageBot" to ensure permanent access to product images.

Note

An easy way to emulate the Skroutz ImageBot is to use the linux program curl, for example: curl -I -A "Skroutz ImageBot v1" <image_url>.

Data Feed

For a Data Feed to be accepted all required attributes must be included according to the standards described below.

XML Declaration

The XML declaration head must include the encoding of the file as well as the date it was created. The latter is used to determine if a feed is outdated or not.

Example
<?xml version="1.0" encoding="UTF-8"?>
<mywebstore>
   <created_at>2010-04-08 12:32</created_at>
   ...
</mywebstore>
Note

The encoding included in the XML header must correspond to the actual encoding of the file otherwise your data feed may not be valid and your products will not be updated. For example, a UTF-8 declaration means that the file is encoded in UTF-8.

Note

If your data feed is not created on demand then you should take care that the cached file is invalided and regenerated at least once a day.

Attributes

The table below summarizes the product attributes recognized by Skroutz:

You cannot include HTML notation in any of the product's attributes.

Name Type Length Required Example
Unique ID String 200 Yes 322
Name String 300 Yes Samsung Galaxy S4 16GB
Product Link String 1000 Yes https://www.someurl.co.uk/products/322.html
Image Link String 400 Yes https://www.someurl.co.uk/images/322.jpg
Additional Image Link String 400 No1 https://www.someurl.co.uk/images/322/front_view.jpg
Category Name String 250 Yes Mobile phones
Price Decimal - (up to 2 decimal places) Yes 23.22
VAT Rate Decimal - (up to 2 decimal places) No 24.00
Availability String 60 Yes In 2 days
Manufacturer String 100 Yes Samsung
MPN / ISBN String 80 Yes GF322234
EAN / Barcode Integer 13 Yes 9780471117094
Size String 500 No1 4,4.5,5-6,6 1/2
Weight Decimal - No2 3200
InStock
Deprecated
List - No Y
Shipping Costs Decimal - No 3.22
Color String 100 No3 Black
Description String 4000 Yes SAMSUNG Galaxy A70 as a phablet features 6.7 inch display that affords you a vivid and different visual experience. 4 cameras, 32.0MP + 5.0MP + 8.0MP rear camera + 32.0MP front camera, you can enjoy images with 1080 x 2400 high resolution. It comes with most of the features we've come to expect from a phablet, including 6GB RAM 128GB ROM storage equipped with Android Snapdragon 675 and 4500mAh big capacity battery that you can play games faster.
Quantity Integer 8 Yes 10
Size Variations Embedded XML Element - No4 <variations>
  <variation>...</variation>
  <variation>...</variation>
</variations>

1 Required by all fashion items with sizes, additional images
2 Required by all shops that use weight in shipping cost rules
3 Required by all fashion items
4 Strongly recommended for all items that require sizes

Unique ID

This attribute represents the unique identifier of a product in your database. The value of this field must remain the same through a product's lifecycle and cannot be reused in other products.

If the title of a product changes between updates so that it no longer refers to the same product (e.g. from Sony LDF700 to Sony LDF800) then the product will be disabled. It is important to note that Unique IDs must always refer to the same product.

A Unique ID cannot refer to more than one product. In such a case the product will be updated only the first time it's encountered in the data feed.

In case your e-commerce application supports more than one languages your data feed should only include definitions in the English language to avoid duplication.

In case you have a WooCommerce store and products with color variations, we recommend the following format for the Unique ID: <parent product ID>-<attribute term ID>. You can find additional information in the Skroutz Analytics for WooCommerce plugin.

Example
<UniqueID>32</UniqueID>
<product id="44">...</product>
<PRODUCTID>232AD</PRODUCTID>

Name

The title of the product. It is essential for the title to include all necessary attributes of the product even though some of those attributes maybe included in other parts of the XML as well (i.e. manufacturer, model, color, version, part number, etc). The more accurate the title, the quicker the product will be classified.

The title of products that are second hand or refurbished must clearly state their condition otherwise they will be disabled from the content team.

Example
<Name>Nokia 5800 XpressMusic</Name>
<title>Nokia 5800 XpressMusic</title>

Your product title should not include information about the product guarantee, shipping costs, payment methods, special bundles or marketing actions.

The URL that links to your shop's page for the specified product. It must be a valid URL starting with https.

Product links should not be URL-encoded.

This link must only point to a product page and not a category page or a collection of products page.

Example
<link>https://www.mydomain.com/products/1</link>
<url>https://www.mydomain.com/products/product.php?itemid=1</url>
<url><![CDATA[https://www.mydomain.com/products/product.php?itemid=1&amp;somevar=3]]></url>
<url>https://www.mydomain.com/products/product.php?itemid=1&amp;amp;somevar=3</url>

In case you do not have an online shop, you should put dummy links in valid URL format.

The product's image location. It must be a valid URL starting with https. Links to scripts that generate images should be avoided as it may cause download errors.

It's better to include high resolution images in your data feed. Images are downloaded by Skroutz and proper thumbnails are created.

Images must not be watermarked.

Image links should not be URL-encoded.

Avoid adding No Image template images because if you later change it Skroutz might not update it. If a product doesn't have an image yet, you can just send an empty image link. If you later change it the image will be updated normally.

Images should not have bezels. The object shown in the image must have at least one dimension larger than 1000 pixels.

Example
<image>https://www.mydomain.com/photos/1.jpg</image>
<imageurl>https://www.mydomain.com/photos/b&amp;amp;b.jpg</imageurl>
<url><![CDATA[https://www.mydomain.com/photos/b&amp;b.jpg]]></url>

Image links must be publicly accessible, regardless of the domain in which they are hosted.

It is used for additional photographs of the product. Additional photos of the same product from different angles or with a different presentation or combinations of the above add value to the presentation of the product in Skroutz.

This field is optional but recommended, except for fashion categories where additional images are required. It can occur multiple times in the feed, once for each different photograph. It has the same limitations as Image Link.

Images should not have bezels. The object shown in the image must have at least one dimension larger than 1000 pixels.

The maximum number of unique image links per product is 15.

Example
<image>https://www.mydomain.com/photos/1.jpg</image>
<imageurl>https://www.mydomain.com/photos/b&amp;amp;b.jpg</imageurl>
<additional_imageurl>https://www.mydomain.com/photos/product1/front.jpg</additional_imageurl>
<additional_imageurl>https://www.mydomain.com/photos/product1/sides.jpg</additional_imageurl>
<additional_imageurl>https://www.mydomain.com/photos/product1/packaged.jpg</additional_imageurl>
<url><![CDATA[https://www.mydomain.com/photos/b&amp;b.jpg]]></url>

Category Name

The product's category path. It is essential that this attribute includes the full path of the product's category. For example, if the product is an External Hard Drive then the category name attribute should look like Computers > External Hard Drives

Avoid ambigious categories containing different products (e.g. Printers and Scanners) as it will slow down the classification process of your products.

Example
<category>Mobile Phones > Bluetooth</category>
<category_path>Computers - Hardware - CPUs</category_path>

Price

It's the products retail price including V.A.T.

The price of the product must apply to everyone without any special conditions (e.g. offers, discounts pending on location etc).

The price field accepts up to 2 decimal places.

The price should be in euros.

VAT Rate

It's the product's VAT rate.

This field accepts values within the range between 1 and 100, or equal to 0.

The VAT rate field accepts up to 2 decimal places.

Example
<name>SAMSUNG Galaxy A70 4G Smartphone 6GB RAM 128GB ROM - Black</name>
<price>150.0</price>
<vat>24.0</vat>

Availability

This field describes the shipping availability as used throughout your shop.

Skroutz uses a fixed set of availability descriptions that will be crosslinked to the ones provided in your feed.

In Stock
refers to products that are available for Express delivery. The label Express delivery appears when the related shop has the service enabled in Skroutz and the product fulfills the service criteria.
When the service is not enabled, then the related products will be presented to Skroutz with the Available indication.
Any products you don't need to offer in "Express delivery", they should be marked with one of the following availabilities.
Available from 1 to 3 days
refers to products that are available to the shop or for shipping from the warehouse or the supplier and can be delivered to your customer within the specified days.
Available from 4 to 10 days
refers to products that are not available to the shop and can be delivered within the specified days.
Available up to 30 days
refers to products that are not in stock and can be delivered only upon order. In any case, the delivery time could not exceed 30 days, which is the maximum limit set by the legislation on e-commerce and distance sales.
Example
<availability>In stock</availability>

Manufacturer

The manufacturer of the product

The manufacturer name must be also include in the title regardless if it is included in this attribute.

The manufacturer attribute must point to the actual manufacturer of the product and not the manufacturer this product is used for in cases of spare parts or accessories.

MPN / ISBN

The unique manufacturer identifier of the product. It is used to identify a product and classify it.

This attribute is required for all categories.

If the product is a Book then this field must include the ISBN of the book.

Books without their ISBN information will not be classified

EAN / Barcode

The international article number (EAN) used for the identification of retail products.

This attribute is required for all categories A unique EAN is allocated to each separate retail product.

Size

If the product comes in sizes you can include all available sizes in this attribute seperated by commas.

For example, a sport shoe available in 5.5, 6, and 6.5 your XML will include the following attribute

<size>5.5,6,6.5</size>

You can also use 1/2 as a half size indicator

<size>5 1/2,6,6 1/2</size>

In case of clothes, sizes can be in one of the following formats:

<size>XXS, XS, S, M, L, XL, XXL, XXXL</size>
<size>Extra Small, Small, Medium, Large, Extra Large</size>
<size>00, 0, 2, 4, 6, 8, 10, 12, 14, 16</size>

If a product fits a size range (e.g. socks) then you can declare the size as a range using the dash (-). e.g.

<size>5.5-6.5</size>

Finally, if a product is identified by two sizes you can include them using the forward slash. (/) e.g.

<size>5.5/42,5.5/45</size>

You should not include the product size within the product title by any means.

Products that are identified by sizes and the size information is not provided will not be classified.

Weight

The product's weight used by your platform to calculate shipping costs in grams. If you wish to provide it in kilograms you can do so by adding kg to the value string.

Example

For a product with a weight of 3.2kg, the value of the weight field can be:

<weight>3200</weight>

or

<weight>3.2 kg</weight>

InStock Deprecated

Stock status of the product

Y
means that the product is in stock at your outlet or your warehouse and can be picked up immediately.
N
means that the product is not available in stock.

When no information is provided the value of this attributed is considered as N (no stock).

Shipping Costs

The product's shipping cost regardless of the customer's location. If the product shipping cost is known beforehand you can include the shipping cost here. If this product is eligible for free shipping, you can indicate it by providing 0 as a value for this attribute.

Shipping costs included here should be independent of the shipping location. If this is not the case , then this attribute should be blank.

Shipping costs will be displayed along with your other product information as long as they are accurate every time. If, even for one product, shipping costs are not accurate then they will be removed from all products in your data feed.

Shipping costs are taken into consideration exclusively for the redirection billing model.

Color

The color of the product. The color attribute functions as a property of the specific product and cannot cover multiple product entries.

It should contain the color of the product as depicted in the product image.

In case multiple colors for a given model exist, they should be submitted as different products with separate Unique IDs.

In case you have a WooCommerce store and products with color variations, we recommend the following format for the Unique ID: <parent product ID>-<attribute term ID>. You can find additional information in the Skroutz Analytics for WooCommerce plugin.

Example
<color>Black</color>
<color>green</color>

Description

The product description should explain what a product is and why it's worth purchasing.

The purpose of the product description is to supply customers with important information about the specifications and usage of the product.

Example
<name>SAMSUNG Galaxy A70 4G Smartphone 6GB RAM 128GB ROM - Black</name>
<description>
  SAMSUNG Galaxy A70 as a phablet features 6.7 inch display that affords you a vivid and different visual experience. 4 cameras,
  32.0MP + 5.0MP + 8.0MP rear camera + 32.0MP front camera, you can enjoy images with 1080 x 2400 high resolution. It
  comes with most of the features we've come to expect from a phablet, including 6GB RAM 128GB ROM storage equipped with
  Android Snapdragon 675 and 4500mAh big capacity battery that you can play games faster.
</description>

Quantity

The quantity is the amount of items available for purchase via Skroutz.

The quantity field is required for all categories and only accepts integer values greater or equal to 0 and less or equal to 10000000.

If the product is out of stock, the indicated value should be 0.

Example
<name>SAMSUNG Galaxy A70 4G Smartphone 6GB RAM 128GB ROM - Black</name>
<quantity>10</quantity>

For products with size variations, the quantity is recommended to be the sum of the available sizes. For example: If there are 10 available pieces of Medium size, 15 of Large and 5 of XLarge:

<size>M, L, XL</size>
<quantity>30</quantity>

Size Variation Attributes

"Size variations" are an enhancement to the current XML feed, that introduces new nodes (children) that include the information of size variations nested in the parent product. For the time being, the parent product should be exactly the same as the current XML specification (including all fields, even those that are size variation specific i.e. availability, size, quantity, link, price, mpn and ean).

The table below summarizes the size variation attributes recognized by Skroutz:

Currently, size variations can only be used in products that have size as a required field.

You cannot include HTML notation in any of the size variation's attributes.

Name Type Length Required Beta1 Example
Variation Unique ID String 200 Yes No 12431.XL
Variation Availability String 100 Yes No In 2 days
Variation Size String 64 Yes No M
Variation Quantity Integer 8 Yes No 10
Variation Price Decimal - (up to 2 decimal places) No No 23.22
Variation Link String 2000 No Yes https://www.someurl.co.uk/products/322.html
Variation MPN String 80 No Yes GF322234
Variation EAN / Barcode Integer 80 No Yes 9780471117094

1 It is recommended to include beta fields in the XML feed. However, their values will not be initially used and will be overridden by their respective product attributes. Also these fields are subject to removal from the XML feed specification.

Variation Unique ID

This attribute represents the unique identifier of a size variation in your database. The value of this field must remain the same through a size variation's lifecycle and cannot be reused in other variations.

A size Variation Unique ID cannot refer to more than one size variations. In such a case the size variation will be updated only the first time it's encountered in the data feed.

In case your e-commerce application supports more than one languages, your data feed should only include definitions in the English language to avoid duplication.

Example
<variationid>12431.XL</variationid>

Variation Availability

This field describes the shipping availability as used throughout your shop.

Skroutz uses a fixed set of availability descriptions that will be crosslinked to the ones provided in your feed.

In Stock
refers to size variations that are available for Express delivery. The label Express delivery appears when the related shop has the service enabled in Skroutz and the product fulfills the service criteria.
When the service is not enabled, then the related products will be presented to Skroutz with the Available indication.
Any products you don't need to offer in "Express delivery", they should be marked with one of the following availabilities.
Available from 1 to 3 days
refers to size variations that are available to the shop or for shipping from the warehouse or the supplier and can be delivered to your customer within the specified days.
Available from 4 to 10 days
refers to size variations that are not available to the shop and can be delivered within the specified days.
Available up to 30 days
refers to size variations that are not in stock and can be delivered only upon order. In any case, the delivery time could not exceed 30 days, which is the maximum limit set by the legislation on e-commerce and distance sales.
Example
<availability>In Stock</availability>

Variation Size

This attribute represents the size corresponding to the current size variation.

For example, a sport shoe available in 38 your XML will include the following attribute

<size>38</size>

You can also use 1/2 as a half size indicator

<size>38 1/2</size>

In case of clothes, sizes can be in one of the following formats:

<size>XL</size>
<size>Extra Large</size>
<size>10</size>

If a size variation fits a size range (e.g. socks) then you can declare the size as a range using the dash (-). e.g.

<size>5.5-6.5</size>

Finally, if a size variation is identified by two sizes you can include them using the forward slash. (/) e.g.

<size>5.5/42</size>

You should not include the product size within the product title by any means.

Size variations that the size information is not provided will not be classified.

Variation Quantity

The quantity is the amount of items available for purchase via Skroutz.

The quantity field only accepts integer values greater or equal to 0 and less or equal to 10000000.

If the size variation is out of stock, the indicated value should be 0.

Example
<quantity>10</quantity>

Variation Price

It's the size variation's retail price including V.A.T.

The price of the size variation must apply to everyone without any special conditions (e.g. offers, discounts pending on location etc).

The price field accepts up to 2 decimal places.

The price should be in euros.

Example
<price>23.22</price>
<pricevat>23.22</pricevat>

The URL that links to your shop's page for the specified size variation. It must be a valid URL starting with https.

Size variation links should not be URL-encoded.

This link must only point to a product page and not a category page or a collection of products page.

Example
<link>https://www.mydomain.com/products/1</link>
<url>https://www.mydomain.com/products/product.php?itemid=1</url>
<url><![CDATA[https://www.mydomain.com/products/product.php?itemid=1&amp;somevar=3]]></url>
<url>https://www.mydomain.com/products/product.php?itemid=1&amp;amp;somevar=3</url>

Variation MPN

The unique manufacturer identifier of the product. It is used to identify a size variation and classify it.

This attribute is used for categories where the Manufacturer Product Number is required to identify a size variation with different configurations (e.g. storage, color, etc)

Example
<manufacturersku>GF322234</manufacturersku>
<mpn>GF322234</mpn>

Variation EAN / Barcode

The international article number (EAN) used for the identification of retail products.

This attribute is optional but is strongly recommended for categories where retail products have the same product brand but variations in weight, colour etc. A unique EAN is allocated to each separate retail product.

Example
<ean>9780471117094</ean>

Data Feed Validator

You can use the Data Feed Validator to check your XML feed for compatibility with Skroutz standards.

You can upload your XML file and the validator checks to confirm that it is well-formed, according to the XML specification, tries to identify the XML element corresponding to each one of your products and then scans the products' attributes to ensure that Skroutz requirements are met.

XML Examples

Simple XML

The XML excerpt below is an example of a compatible XML data feed.

<?xml version="1.0" encoding="UTF-8"?>
<mywebstore>
   <created_at>2010-04-08 12:32</created_at>
   <products>
      <product>
        <id>322233</id>
        <name><![CDATA[Converse All Star Chuck Taylor Ox]]></name>
        <link><![CDATA[https://www.mywebstore.co.uk/product/322233]]></link>
        <image><![CDATA[https://www.mywebstore.co.uk/product/322233.jpg]]></image>
        <additionalimage><![CDATA[https://www.mywebstore.co.uk/product/322233/front.jpg]]></additionalimage>
        <category><![CDATA[Outdor > Sneakers]]></category>
        <price_with_vat>30.00</price_with_vat>
        <vat>24.00</vat>
        <manufacturer><![CDATA[Converse]]></manufacturer>
        <mpn>M7652C</mpn>
        <ean>886952780692</ean>
        <availability>Delivery 1 to 3 days</availability>
        <size>5.5,6</size>
        <weight>2000</weight>
        <color>White</color>
        <description>
          The Chuck Taylor All Star is one of the most iconic sneakers
          of all ages. It is a unique design with a classic and comfortable
          fit, in white color, with durable non-slip exterior rubber sole.
          It is an ideal piece for all kinds of appearances.
        </description>
        <quantity>10</quantity>
      </product>
      ...
      ...
      ...
   </products>
</mywebstore>

XML with Size Variations

The XML excerpt below is an example of a compatible XML with variations data feed.

<?xml version="1.0" encoding="UTF-8"?>
<mywebstore>
   <created_at>2010-04-08 12:32</created_at>
   <products>
      <product>
        <id>322233</id>
        <name><![CDATA[Converse All Star Chuck Taylor Ox]]></name>
        <link><![CDATA[https://www.mywebstore.co.uk/product/322233]]></link>
        <image><![CDATA[https://www.mywebstore.co.uk/product/322233.jpg]]></image>
        <additionalimage><![CDATA[https://www.mywebstore.co.uk/product/322233/front.jpg]]></additionalimage>
        <category><![CDATA[Outdor > Sneakers]]></category>
        <price_with_vat>30.00</price_with_vat>
        <vat>24.00</vat>
        <manufacturer><![CDATA[Converse]]></manufacturer>
        <mpn>M7652C</mpn>
        <ean>886952780692</ean>
        <availability>Delivery 1 to 3 days</availability>
        <size>43,45</size>
        <weight>2000</weight>
        <color>White</color>
        <description>
          The Chuck Taylor All Star is one of the most iconic sneakers
          of all ages. It is a unique design with a classic and comfortable
          fit, in white color, with durable non-slip exterior rubber sole.
          It is an ideal piece for all kinds of appearances.
        </description>
        <quantity>10</quantity>
        <variations>
          <variation>
            <variationid>322233.43</variationid>
            <link><![CDATA[https://www.mywebstore.co.uk/product/322233]]></link>
            <availability>Delivery 1 to 3 days</availability>
            <manufacturersku>M7652C</manufacturersku>
            <ean>886952780692</ean>
            <price_with_vat>33.00</price_with_vat>
            <size>43</size>
            <quantity>6</quantity>
          </variation>
          <variation>
            <variationid>322233.45</variationid>
            <link><![CDATA[https://www.mywebstore.co.uk/product/322233]]></link>
            <availability>Delivery 1 to 3 days</availability>
            <manufacturersku>M7652C</manufacturersku>
            <ean>886952780692</ean>
            <price_with_vat>30.00</price_with_vat>
            <size>45</size>
            <quantity>4</quantity>
          </variation>
          ...
          ...
          ...
        </variations>
      </product>
      ...
      ...
      ...
   </products>
</mywebstore>

XSDs

Simple XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- required elements -->
  <!-- created at -->
  <xs:element name="created_at" type="xs:dateTime" />

  <!-- unique id -->
  <xs:element name="uid">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="200" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- name -->
  <xs:element name="name">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="300" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- link -->
  <xs:element name="link">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- image -->
  <xs:element name="image">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- additional image -->
  <xs:element name="additional_image">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- price -->
  <xs:element name="price" type="xs:decimal" />

  <!-- vat -->
  <xs:element name="vat" type="xs:decimal" />

  <!-- category -->
  <xs:element name="category">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="300" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- manufacturer -->
  <xs:element name="manufacturer">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- manufacturer part number -->
  <xs:element name="mpn">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- ean -->
  <xs:element name="ean">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:totalDigits value="13" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- instock [deprecated] -->
  <xs:element name="instock">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="Y" />
        <xs:enumeration value="N" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- shipping -->
  <xs:element name="shipping" type="xs:decimal" />

  <!-- availability -->
  <xs:element name="availability">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- size -->
  <xs:element name="size">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- weight -->
  <xs:element name="weight" type="xs:decimal" />

  <!-- color -->
  <xs:element name="color">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="50" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- quantity -->
  <xs:element name="quantity" type="xs:integer" />

  <!-- basic structure -->
  <xs:element name="storedata">
    <xs:complexType>
      <xs:sequence>
        <!-- created at -->
        <xs:element ref="created_at" minOccurs="0" />

        <!-- products -->
        <xs:element name="products">
          <xs:complexType>
            <xs:sequence>
              <!-- product -->
              <xs:element name="product" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:all>

                    <!-- required fields -->
                    <xs:element ref="uid"/>
                    <xs:element ref="name"/>
                    <xs:element ref="link"/>
                    <xs:element ref="image"/>
                    <xs:element ref="price"/>
                    <xs:element ref="category"/>
                    <xs:element ref="manufacturer" />
                    <xs:element ref="mpn" />
                    <xs:element ref="availability" />
                    <xs:element ref="instock" />

                    <!-- optional fields -->
                    <xs:element ref="vat" minOccurs="0"/>

                    <!-- description -->
                    <xs:element name="description">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="value" type="xs:string" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>

                    <xs:element ref="additional_image"  minOccurs="0"/>
                    <xs:element ref="ean"  minOccurs="0"/>
                    <xs:element ref="size"  minOccurs="0"/>
                    <xs:element ref="weight" minOccurs="0"/>
                    <xs:element ref="shipping"  minOccurs="0"/>
                    <xs:element ref="color"  minOccurs="0"/>
                    <xs:element ref="quantity" minOccurs="0"/>

                  </xs:all>

                </xs:complexType>
              </xs:element>
              <!-- end product -->
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      <!-- end products -->
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSD with Size Variations

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- required elements -->
  <!-- created at -->
  <xs:element name="created_at" type="xs:dateTime" />

  <!-- unique id -->
  <xs:element name="uid">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="200" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- name -->
  <xs:element name="name">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="300" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- link -->
  <xs:element name="link">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- image -->
  <xs:element name="image">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- price -->
  <xs:element name="price" type="xs:decimal" />

  <!-- category -->
  <xs:element name="category">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="300" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- manufacturer -->
  <xs:element name="manufacturer">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- manufacturer part number -->
  <xs:element name="mpn">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- availability -->
  <xs:element name="availability">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- instock [deprecated] -->
  <xs:element name="instock">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="Y" />
        <xs:enumeration value="N" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- optional elements -->
  <!-- vat -->
  <xs:element name="vat" type="xs:decimal" />

  <!-- additional image -->
  <xs:element name="additional_image">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="400" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- ean -->
  <xs:element name="ean">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:totalDigits value="13" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- size -->
  <xs:element name="size">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="100" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- weight -->
  <xs:element name="weight" type="xs:decimal" />

  <!-- shipping -->
  <xs:element name="shipping" type="xs:decimal" />

  <!-- color -->
  <xs:element name="color">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:maxLength value="50" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- quantity -->
  <xs:element name="quantity" type="xs:integer" />

  <!-- basic structure -->
  <xs:element name="storedata">
    <xs:complexType>
      <xs:sequence>
        <!-- created at -->
        <xs:element ref="created_at" minOccurs="0" />

        <!-- products -->
        <xs:element name="products">
          <xs:complexType>
            <xs:sequence>
              <!-- product -->
              <xs:element name="product" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:all>

                    <!-- required fields -->
                    <xs:element ref="uid"/>
                    <xs:element ref="name"/>
                    <xs:element ref="link"/>
                    <xs:element ref="image"/>
                    <xs:element ref="price"/>
                    <xs:element ref="category"/>
                    <xs:element ref="manufacturer" />
                    <xs:element ref="mpn" />
                    <xs:element ref="availability" />
                    <xs:element ref="instock" />

                    <!-- optional fields -->
                    <xs:element ref="vat" minOccurs="0"/>

                    <!-- description -->
                    <xs:element name="description">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="value" type="xs:string" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>

                    <xs:element ref="additional_image"  minOccurs="0"/>
                    <xs:element ref="ean"  minOccurs="0"/>
                    <xs:element ref="size"  minOccurs="0"/>
                    <xs:element ref="weight" minOccurs="0"/>
                    <xs:element ref="shipping"  minOccurs="0"/>
                    <xs:element ref="color"  minOccurs="0"/>
                    <xs:element ref="quantity" minOccurs="0"/>

                    <!-- size variations -->
                    <xs:element name="variations">
                      <xs:complexType>
                        <xs:sequence>

                          <!-- size variation -->
                          <xs:element name="variation" maxOccurs="unbounded" minOccurs="0">
                            <xs:complexType>
                              <xs:sequence>

                                <!-- required fields -->
                                <xs:element type="xs:string" name="variationid"/>
                                <xs:element type="xs:string" name="availability"/>
                                <xs:element type="xs:string" name="size"/>
                                <xs:element type="xs:integer" name="quantity"/>

                                <!-- optional fields -->
                                <xs:element type="xs:string" name="link"/>
                                <xs:element type="xs:string" name="manufacturersku"/>
                                <xs:element type="xs:integer" name="ean"/>
                                <xs:element type="xs:decimal" name="price_with_vat"/>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <!-- end size variation -->

                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <!-- end size variations -->

                  </xs:all>

                </xs:complexType>
              </xs:element>
              <!-- end product -->
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      <!-- end products -->
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>