Bol Taxonomy
Summary of Changes: (The purpose of this table is to keep traceability and Product team to highlight the things that were changed into the scope, based on comments or discussions)
Date | Version | Created / Updated | Notes |
---|---|---|---|
10/05/2023 | v1.0 | Bogomil Pavlov | First publish |
The purpose of this document is to describe how we get the Bol taxonomy.
Bol does not have API for downloading the taxonomy instead they use data models. The data model is a JSON file that contains all the product classifications that are available on Bol. The data model is updated on a daily basis so we will have to make sure we update it accordingly. One way to obtain the data model is via url and we will have two separate data models one for FR and one for NL. NL - https://storage.googleapis.com/bolcom-pro-baobab-public-8e7-datamodel/v8/datamodel_v8_nl.json Fr - https://storage.googleapis.com/bolcom-pro-baobab-public-8e7-datamodel/v8/datamodel_v8_fr.json
We want to use the link to download the taxonomy in Hemi and then to be able to export it.
Structure and logic of the data model
Taxonomy Structure | Definitions |
---|---|
chunks |
This is the actual product category |
attributes |
This is the category attributes which we store as IS or pre-map them |
lovs |
This is the attribute pre defined values which we should use |
lovid |
This is the attribute id which we use to map the actual lovs and their values. |
enrichmentLevel |
Specifies whether the attribute is required or optional. |
• Level 0
and 1
- Mandatory for publishing the products
• Level 2
- Optional. |
| condition
| This is the dependent attributes which usage is not mandatory however is still recommended to prevent redundancy. However we do not want to over complicated this and will ignore them |
| distinctiveFeatureIds
| These are the actual variation specifics in Hemi which can be used to create a variation. |
| asset
| Specifies an image or a document related to the product. It can be an image of the product to a manual. |
| labels
| Specifies a word that describes an asset. For example, FRONT, SIDE, ON MODEL, MANUAL and ENERGY LABEL. This is used for the images so the only thing we want to do here is to map the relevant label for Leading and Additional images. |
From the actual taxonomy file we will need to get the chunks - which are the categories with their attributes and the lovs - the actual attributes values.
Sample chunk:
{
"id" : "30000720",
"name" : "Blush",
"attributes" : [
{
"id" : "EAN",
"enrichmentLevel" : 0
},
{
"id" : "Internal Reference",
"enrichmentLevel" : 0
},
{
"id" : "Name",
"enrichmentLevel" : 0
},
{
"id" : "Product Classification",
"enrichmentLevel" : 0
},
{
"id" : "Brand",
"enrichmentLevel" : 1
},
{
"id" : "Capacity",
"enrichmentLevel" : 1
},
{
"id" : "Colour",
"lovId" : "Colour",
"enrichmentLevel" : 1
},
{
"id" : "Country of Origin",
"lovId" : "Country of Origin",
"enrichmentLevel" : 1
},
{
"id" : "Description",
"enrichmentLevel" : 1
},
{
"id" : "Effect",
"lovId" : "Effect@30000720",
"enrichmentLevel" : 1
},
{
"id" : "Ingredients",
"enrichmentLevel" : 1
},
{
"id" : "Language Packaging",
"lovId" : "Language Packaging@30000720",
"enrichmentLevel" : 1
},
{
"id" : "Period after Opening",
"enrichmentLevel" : 1
},
{
"id" : "Colour Code",
"enrichmentLevel" : 2
},
{
"id" : "Dermatologically Tested",
"lovId" : "Dermatologically Tested@30000720",
"enrichmentLevel" : 2
},
{
"id" : "Family Key",
"enrichmentLevel" : 2
},
{
"id" : "Height",
"enrichmentLevel" : 2
},
{
"id" : "Length",
"enrichmentLevel" : 2
},
{
"id" : "Substance",
"lovId" : "Substance@30000720",
"enrichmentLevel" : 2
},
{
"id" : "Vegan",
"lovId" : "YesNo",
"enrichmentLevel" : 2
},
{
"id" : "Weight",
"enrichmentLevel" : 2
},
{
"id" : "Width",
"enrichmentLevel" : 2
}
],
"labels" : [
{
"id" : "OTHER",
"enrichmentCondition" : "Any"
},
{
"id" : "IN SITU",
"enrichmentCondition" : "Any"
},
{
"id" : "FRONT",
"enrichmentCondition" : "Any"
},
{
"id" : "DETAIL",
"enrichmentCondition" : "Any"
},
{
"id" : "BOTTOM",
"enrichmentCondition" : "Any"
},
{
"id" : "BACK",
"enrichmentCondition" : "Any"
},
{
"id" : "TOP",
"enrichmentCondition" : "Any"
},
{
"id" : "SIDE",
"enrichmentCondition" : "Any"
},
{
"id" : "USP",
"enrichmentCondition" : "Any"
},
{
"id" : "PACKAGE INSERT",
"enrichmentLevel" : 2
},
{
"id" : "WITH PACKAGE",
"enrichmentCondition" : "Any"
},
{
"id" : "IN THE BOX",
"enrichmentCondition" : "Any"
},
{
"id" : "IN PACKAGE",
"enrichmentCondition" : "Any"
},
{
"id" : "ON MODEL",
"enrichmentCondition" : "Any"
},
{
"id" : "SWATCH",
"enrichmentCondition" : "Any"
}
],
"distinctiveFeatureIds" : [
"Colour"
]
},
{
"id" : "30000924",
"name" : "Nagelknipper",
"attributes" : [
{
"id" : "EAN",
"enrichmentLevel" : 0
},
{
"id" : "Internal Reference",
"enrichmentLevel" : 0
},
{
"id" : "Name",
"enrichmentLevel" : 0
},
{
"id" : "Product Classification",
"enrichmentLevel" : 0
},
{
"id" : "Description",
"enrichmentLevel" : 1
},
{
"id" : "Brand",
"enrichmentLevel" : 2
},
{
"id" : "Capacity",
"enrichmentLevel" : 2
},
{
"id" : "Colour",
"lovId" : "Colour",
"enrichmentLevel" : 2
},
{
"id" : "Family Key",
"enrichmentLevel" : 2
},
{
"id" : "Height",
"enrichmentLevel" : 2
},
{
"id" : "Length",
"enrichmentLevel" : 2
},
{
"id" : "Number of Products in Package",
"enrichmentLevel" : 2
},
{
"id" : "Product Height",
"enrichmentLevel" : 2
},
{
"id" : "Product Length",
"enrichmentLevel" : 2
},
{
"id" : "Product Width",
"enrichmentLevel" : 2
},
{
"id" : "Suitable for Fake Nails",
"lovId" : "YesNo",
"enrichmentLevel" : 2
},
{
"id" : "Target Audience",
"lovId" : "Target Audience@30000924",
"enrichmentLevel" : 2
},
{
"id" : "Type of Nail Care Product",
"lovId" : "Type of Nail Care Product",
"enrichmentLevel" : 2
},
{
"id" : "Weight",
"enrichmentLevel" : 2
},
{
"id" : "Width",
"enrichmentLevel" : 2
}
],
"labels" : [
{
"id" : "OTHER",
"enrichmentCondition" : "Any"
},
{
"id" : "IN SITU",
"enrichmentCondition" : "Any"
},
{
"id" : "FRONT",
"enrichmentCondition" : "Any"
},
{
"id" : "DETAIL",
"enrichmentCondition" : "Any"
},
{
"id" : "BOTTOM",
"enrichmentCondition" : "Any"
},
{
"id" : "BACK",
"enrichmentCondition" : "Any"
},
{
"id" : "TOP",
"enrichmentCondition" : "Any"
},
{
"id" : "SIDE",
"enrichmentCondition" : "Any"
},
{
"id" : "USP",
"enrichmentCondition" : "Any"
},
{
"id" : "MANUAL",
"enrichmentLevel" : 2
},
{
"id" : "IN THE BOX",
"enrichmentCondition" : "Any"
},
{
"id" : "SIZE",
"enrichmentCondition" : "Any"
},
{
"id" : "ACCESSORIES",
"enrichmentCondition" : "Any"
},
{
"id" : "LOGO",
"enrichmentCondition" : "Any"
},
{
"id" : "IN PACKAGE",
"enrichmentCondition" : "Any"
},
{
"id" : "INSIDE",
"enrichmentCondition" : "Any"
},
{
"id" : "MULTIPACK",
"enrichmentCondition" : "Any"
},
{
"id" : "ON MODEL",
"enrichmentCondition" : "Any"
},
{
"id" : "TECHDRAWING",
"enrichmentCondition" : "Any"
},
{
"id" : "WITH PACKAGE",
"enrichmentCondition" : "Any"
},
{
"id" : "SWATCH",
"enrichmentCondition" : "Any"
}
],
"distinctiveFeatureIds" : [
"Colour",
"Product Width"
]
}
Before the attributes is the id of the category and the name. We want to have the name in Hemi and push the name to Bol. Please note all categories are leaf and we can list in any of them.
Then we have all available category attributes and their specifics.
The enrichmentLevel
identifies if the attribute is required or no. If we have 1 or 0 it means it is required otherwise we treat it as optional.
If the attribute have lovId
this means there are specific values we must use and using the lovId
we can refer to the actual lovs and obtain the values for the attribute.
Since the attributes do not have id and name we will be using only their ids.
Also we want to store distinctiveFeatureIds
and indicate which attributes can be used as Variation Specifics.
Please note some of the attributes will be root one and will be mapped to internal fields rather than Item Specifics and we want to exclude them form the taxonomy export file
Root Attributes
Attribute Id | Hemi Field | |
---|---|---|
Internal Reference |
Product > SKU | |
EAN |
Product Account > Marketplace EAN |
OR
Product > EAN | Product Account > Marketplace EAN is with priority |
| Name
| Product Account > Title | |
| Product Classification
| Product Account > Primary Category ID | |
| Description
| Product Account > Description | |
| Brand
| Product > Brands
OR
Product Account > Item Specific | Product Account > Item Specific is with priority |
| Family Key | Product Account > Variation Group | |
Taxonomy export file
In order to generate the taxonomy file we will need to create a new record in Taxonomy export with: Marketplace = Bol Status = pending Category for Export = all_nl or all_fr (or we can specify which exact categories) Email = email to which the file will be send
Please find more details on the file structure how it should look like after exported here - Taxonomy General requirements .
PrimaryCatID {chunks > id} | PrimaryCatName {chunks > name} | Category Path | Is Leaf | Item Specifics | Variation Specifics {istinctiveFeatureIds} | Required {enrichmentLevel} | Enumeration {lovIds} | Values {lovs} | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
30000924 |
Nagelknipper |
N/A | Yes | Brand |
Yes | No | ||||||
123 | Shoes | N/A | Yes | Material | No | No | ||||||
123 | Shoes | N/A | Yes | Type | No | No | ||||||
1234 | Gloves | N/A | Yes | Color | Yes | Yes | Red | White | Black | |||
1234 | Gloves | N/A | Yes | Size | Yes | Yes | 40 | 41 | 42 | 43 | 44 |