Marketplaces / Decathlon Technical Scope / Decathlon - Product management / Update Offer

Update Offer

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 Name Applied changes
28/09/2022 1.0 Bogomil Pavlov Initial Version
06.02.23 1.1 Bogomil Pavlov Split the flow to two separate feeds with and without prices

The purpose of this page is to describe in details the process of full update of the offers on MIRAKL.

We are able to send updates to an offer using the call for creating an offer, but we need to specify the value in update_delete field to be equal to “update“ ( "update_delete": "update")

API Call: /api/offers/imports

API Docs: https://decathlonbelgium-preprod.mirakl.net/help/api-doc/seller/mmp.html#OF01

We will have to split the feeds into two. First case is to pick all products for full update with Protect Price = No this way we include all fields in the xml.

Mapping - Offers

Documents:

offers-en_GB-20220405122024.xlsx

100002-example (1).xml

<?xml version='1.0' encoding='UTF-8'?>
<import><offers>
    <offer>
      <sku>OFFER_SKU_1</sku>
      <product-id>PRODUCT_SKU_1</product-id>
      <product-id-type>SHOP_SKU</product-id-type>
      <description>This is the description of my amazing offer!</description>
      <internal-description>This is the internal description of my offer.</internal-description>
      <price>1000</price>
      <price-additional-info>Price including taxes</price-additional-info>
      <quantity>1</quantity>
      <min-quantity-alert>20</min-quantity-alert>
      <state>11</state>
      <available-start-date>2012-12-25</available-start-date>
      <available-end-date>2013-05-17</available-end-date>
      <logistic-class></logistic-class>
      <discount-price>1</discount-price>
      <discount-start-date>2012-12-25</discount-start-date>
      <discount-end-date>2013-12-25</discount-end-date>
      <leadtime-to-ship>15</leadtime-to-ship>
      <update-delete>UPDATE</update-delete>
      <eco-contributions>
        <eco-contribution>
          <producer-id>ProducerID1</producer-id>
          <eco-contribution-amount>0.99</eco-contribution-amount>
        </eco-contribution>
        <eco-contribution>
          <producer-id>ProducerID2</producer-id>
          <eco-contribution-amount>3.49</eco-contribution-amount>
        </eco-contribution>
      </eco-contributions>
      <all-prices>
        <pricing>
          <channel-code>GB</channel-code>
          <price>1000</price>
          <discount-price>1</discount-price>
          <discount-start-date>2012-12-25</discount-start-date>
          <discount-end-date>2013-12-25</discount-end-date>
        </pricing>
      </all-prices>
      <offer-additional-fields>
        <offer-additional-field>
          <code>active-channels</code>
          <value>
            <item>BE</item>
            <item>CH</item>
          </value>
        </offer-additional-field>
        <offer-additional-field>
          <code>free-return</code>
          <value>true</value>
        </offer-additional-field>
      </offer-additional-fields>
    </offer>
  </offers>
</import>

Mapping:

Mirakl Field Mirakl Notes Integration Required Hemi Field Comment
sku The offer’s unique identifier in the shop - Required - Maximum 40 characters, no "/" character Required item>SKU
product-id Unique product identifier for a given product-id-type - Required at offer creation - Maximum 40 characters Required item>EAN Decathlon supports only EAN and the EAN is Mandatory
product-id-type Type of product-id identifier - Required at offer creation - Element from the list Required Hardcoded as “EAN”
description Offer description - Recommended - Maximum 2000 characters Recommended Product Account > Description
internal-description The description of the offer as shown in the back office view - Optional - Maximum 2000 characters Optional N/A
price The price of the offer in the currency of the Marketplace - Required when creating an offer - Positive number Required Product Account > Price or Product Account > RRP we send Product Account > RRP If RRP is populated and is bigger than Price
price-additional-info Information about the offer's price - Optional - Maximum 100 characters Optional Product Account Decathlon > Price Additional Info
quantity Quantity available in stock - Recommended - Positive integer Recommended Product Account > Quantity
min-quantity-alert The minimum quantity which triggers a stock alert - Optional - Positive integer Optional N/A
state The state of the offer - Required at offer creation - Element from the list Required “NEW“ Mapping to our conditions:

11- New > 1000; 1-Excellent > 1500; 2-Very Good >4000; 3-Good >5000; 4-Sufficient >6000; 5-Refurbished_like_new > 2750 6-Refurnished_very_good >2500 7-Refurbished_good > 2000 8-Refurbished_acceptable > New state(condition) to be created in Hemi (8000) | | available-start-date | | | The first day the offer becomes available (if blank, the offer is immediately available) - Optional - Valid date | Optional | N/A | | | available-end-date | | | The last day the offer is available (if blank, the offer has no end date) - Optional - Valid date | Optional | N/A | | | logistic-class | | | The logistic class of the offer (this logistic class will overwrite the default logistic class defined for the product category assigned to the offer) - Optional - Element from the list | Optional | account_decathlon > Logistic class Product Account Decathlon > Logistic class | Our default Logistic Class is selected on account level and if we have selected on Item Account we pick it with priority | | discount-price | | | The discount price of the offer - Optional - Positive number | Optional | If RRP and is bigger than Price we push our Product Account > Price | If RRP > Price

  1. If there are discount dates imported in Hemi we use them
  2. If there are no dates imported in Hemi we use the default dates (Now) and (Now + 2y) If RRP <= Price 3.We include the discount fields with empty values discount-start-date The first day the discount becomes available (if blank, the discount has no start date and is immediately active) - Optional - Valid date Optional Item Account Decathlon > Discount Start Date If RRP > Price and If we do not specify any dates in the relevant fields we hardcoded current date (“NOW“) Date format - 2017-02-20T10:45:53+01 If RRP <= Price We include the discount fields with empty values discount-end-date The last day the discount is available (if blank, the discount has no end date) - Optional - Valid date Optional Item Account Decathlon > Discount End Date If RRP > Price and If we do not specify any dates in the relevant fields we hardcode current date + 2 year (“NOW“ +2y) Date format - 2017-02-20T10:45:53+01 If RRP <= Price We include the discount fields with empty values leadtime-to-ship The lead time to ship for the offer - Optional - Positive integer lesser than 45 Optional Shipping template > Dispatch time max (defalut) or Product Account > Dispatch time max update-delete Only use with the Normal import mode (if blank, the Update mode is used) - Optional - Element from the list Optional N/A offer-additional-fields offer-additional-fields active-channels select the channel where you want your offer published Optional Account Decathlon > Channel Need to confirm if we have to check and get all active channels for SKU. e.g. active-channels BE CH Phase 2 only

Decathlon specifics:

Field Note Integration Required Hemi Field Comment
eco-contributions Optional - Use the format "ProducerIdentifier1 Eco-contributionAmount1,ProducerIdentifier2 Eco-contributionAmount2". E.g. "ProducerID1 3.00,ProducerID2 0.49" Optional
eco-contribution
producer-id Item Account Decathlon > Eco Contributions
eco-contribution-amount Item Account Decathlon > Eco Contributions
all-prices
pricing
channel-code Account Decathlon > Channel
price price[channel=GB] - Offer Price for channel GB Required Product Account > Price or Product Account > RRP we send Product Account > RRP If RRP is populated and is bigger than Price
discount-price Optional If RRP and is bigger than Price we push our Product Account > Price If RRP > Price
  1. If there are discount dates imported in Hemi we use them
  2. If there are no dates imported in Hemi we use the default dates (Now) and (Now + 2y) If RRP <= Price 3.We include the discount fields with empty values | | | | discount-start-date | | Optional | Product Account Decathlon > Discount Start Date | If RRP > Price and If we do not specify any dates in the relevant fields we hardcoded current date (“NOW“) Date format - 2017-02-20T10:45:53+01

If RRP <= Price We include the discount fields with empty values | | | | discount-end-date | | Optional | Product Account Decathlon > Discount End Date | If RRP > Price and If we do not specify any dates in the relevant fields we hardcode current date + 2 year (“NOW“ +2y) Date format - 2017-02-20T10:45:53+01

If RRP <= Price We include the discount fields with empty values | | offer-additional-fields | | | | | | | | | | free-return | Free return | Optional | Product Account Decathlon > Free Return | check box (yes/no) |

Second case is to pick all products for full update with Protect Price = Yes this way we exclude all price fields from the xml.

Mapping:

Mirakl Field Mirakl Notes Integration Required Hemi Field Comment
sku The offer’s unique identifier in the shop - Required - Maximum 40 characters, no "/" character Required item>SKU
product-id Unique product identifier for a given product-id-type - Required at offer creation - Maximum 40 characters Required item>EAN Decathlon supports only EAN and the EAN is Mandatory
product-id-type Type of product-id identifier - Required at offer creation - Element from the list Required Hardcoded as “EAN”
description Offer description - Recommended - Maximum 2000 characters Recommended Product Account > Description
internal-description The description of the offer as shown in the back office view - Optional - Maximum 2000 characters Optional N/A
quantity Quantity available in stock - Recommended - Positive integer Recommended Product Account > Quantity
min-quantity-alert The minimum quantity which triggers a stock alert - Optional - Positive integer Optional N/A
state The state of the offer - Required at offer creation - Element from the list Required “NEW“ Mapping to our conditions:
11- New > 1000; 1-Excellent > 1500; 2-Very Good >4000; 3-Good >5000; 4-Sufficient >6000; 5-Refurbished_like_new > 2750 6-Refurnished_very_good >2500 7-Refurbished_good > 2000 8-Refurbished_acceptable > New state(condition) to be created in Hemi (8000) available-start-date The first day the offer becomes available (if blank, the offer is immediately available) - Optional - Valid date Optional N/A available-end-date The last day the offer is available (if blank, the offer has no end date) - Optional - Valid date Optional N/A logistic-class The logistic class of the offer (this logistic class will overwrite the default logistic class defined for the product category assigned to the offer) - Optional - Element from the list Optional account_decathlon > Logistic class Product Account Decathlon > Logistic class Our default Logistic Class is selected on account level and if we have selected on Item Account we pick it with priority leadtime-to-ship The lead time to ship for the offer - Optional - Positive integer lesser than 45 Optional Shipping template > Dispatch time max (defalut) or Product Account > Dispatch time max update-delete Only use with the Normal import mode (if blank, the Update mode is used) - Optional - Element from the list Optional N/A offer-additional-fields offer-additional-fields active-channels select the channel where you want your offer published Optional Account Decathlon > Channel Need to confirm if we have to check and get all active channels for SKU. e.g. active-channels BE CH Phase 2 only

Decathlon specifics:

Field Note Integration Required Hemi Field Comment
eco-contributions Optional - Use the format "ProducerIdentifier1 Eco-contributionAmount1,ProducerIdentifier2 Eco-contributionAmount2". E.g. "ProducerID1 3.00,ProducerID2 0.49" Optional
eco-contribution
producer-id Item Account Decathlon > Eco Contributions
eco-contribution-amount Item Account Decathlon > Eco Contributions
offer-additional-fields
free-return Free return Optional Product Account Decathlon > Free Return check box (yes/no)

This is required because we either must have a feed with prices or a feed without prices otherwise MIRAKL will return an error.

We are able to send updates to products in 2 cases. Once the product listing status is Active and Inactive(i.e. after successfully zero stock updates)

We pick the offer for update when we have:

Product status **= Product Published ; Listing Status **= Active/Inactive; List/Update the whole item = Pending If we send the offer for update successfully we set: Product status **= Product Published ; Listing Status **= Active/Inactive; List/Update the whole item = Sent

Once we receive success, we need to set following statuses:

Product status = Product Published; **Listing Status =Active/Inactive; List/Update the whole item = Not Needed**

If we receive an error we will have:

Product status **= Product Published ; Listing Status **= Active/Inactive; List/Update the whole item = Error

(The error need to be stored into Update item error field.)

Example Response:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<offer_import_tracking>
    <import_id>2035</import_id>
    <product_import_id>2036</product_import_id>
</offer_import_tracking>

After each successfully send feed for creation we will receive the feed id from the response and need to store it in Marketplace Feeds table.

Mirakl Field Hemi Field Comment
import_id Marketplace Feed > External ID
Marketplace Feed > Account For which account is the feed generated.
Marketplace Feed > Type Hardcoded as “Offer Update“
Marketplace Feed > Submitted Date When the feed is submitted
Marketplace Feed > Sent Objects Count How many products we have pushed in the feed
Marketplace Feed > Completed Date When the feed is completed

Please note we will also add the feed objects which after processing need to be removed.

  • GET OF02 - Get information and statistics about an offer import

API Call: /api/offers/imports/{import}

API Docs:

Parameter Integration Notes / Value Required
import Import identifier Yes

Using this call, we are able to check the status of the imported file.

Example Response:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<import>
    <date_created>2019-04-01T15:16:31Z</date_created>
    <has_error_report>false</has_error_report>
    <import_id>2035</import_id>
    <lines_in_error>0</lines_in_error>
    <lines_in_pending>0</lines_in_pending>
    <lines_in_success>1</lines_in_success>
    <lines_read>1</lines_read>
    <mode>NORMAL</mode>
    <offer_deleted>0</offer_deleted>
    <offer_inserted>1</offer_inserted>
    <offer_updated>0</offer_updated>
    <status>COMPLETE</status>
</import>

OF02 call is returning the response for the actual offer import (all offers).

Based on the response, we will need to check if we have to continue with the error report (if "has_error_report": true ) we continue with OF03, otherwise we treat it as success.

Success case:

Product status = Product Published and Listing Status = Active/Inactive and List/Update the whole item =Not Needed

Error case: If "has_error_report": true this means there is an error and we need to reach each of the reports in order to check for which item and what is the error.

Product status = Product Published ; Listing Status = Active/Inactive; List/Update the whole item = Error

and we need to store the relevant error in Product Account > Update Item Error field

  • GET OF03 - Get the error report file for an offer import

In order to check if there are any errors related to the products, into imported file we should use the GET OF03 API Call.

API Call: /api/offers/imports/{import}/error_report

API Docs:

"sku";"product-id";"product-id-type";"description";"internal-description";"price-additional-info";"quantity";"min-quantity-alert";"state";"available-start-date";"available-end-date";"logistic-class";"update-delete";"discount-start-date";"discount-end-date";"price";"discount-price";"discount-ranges";"price-ranges";"discount-start-date[channel=FR]";"discount-end-date[channel=FR]";"price[channel=FR]";"discount-price[channel=FR]";"discount-ranges[channel=FR]";"prices-ranges[channel=FR]";"discount-start-date[channel=CA]";"discount-end-date[channel=CA]";"price[channel=CA]";"discount-price[channel=CA]";"discount-ranges[channel=CA]";"prices-ranges[channel=CA]";"leadtime-to-ship";"error-line";"error-message"
"OFFER_SKU_004";"MKP100000000195360";"SKU";"My Offer Description n°1";"My Internal description 1";"My price Additional innformations";"1000000";"20";"11";"2017-02-20T10:45:53+01";"2017-04-30T10:45:53+01";"S";"update";"2017-02-22T10:45:53+01";"2017-04-30T10:45:53+01";"110.52";"108,56";"";"5|109.20,10|108.736";"2017-02-22T10:45:53+01";"2017-03-31T10:45:53+01";"105.56";"102,36";"";"5|104.56,10|103.27";"2017-02-22T10:45:53+01";"2017-03-31T10:45:53+01";"190.23";"175,36";"";"5|182.58,10|181.27";"15";"2";"The product does not exist"

As described above, this response give us detailed report of the SKUs and the actual SKUs errors are in the “error-message“  which we store in the Product Account >Update Item Error

Additional Information:

For this integration we will need to make sure the protect flags are working as expected:

Protect Quantity (Stop all quantity updates) - Applicable for already created offers. If the offer is not created this flag is ignored. If Protect Quantity = Yes and Update Quantity = Pending - We skip the product If Protect Quantity = Yes and Update Price= Pending - We pick the product only for price update and do NOT include the quantity in the payload If Protect Quantity = Yes and List/Update the Whole Item = Pending - We pick the product for full update but do NOT include the quantity in the payload

Protect Price (Stop all price updates) -Applicable for already created offers. If the offer is not created this flag is ignored. If Protect Price = Yes and Update Quantity = Pending -We pick the product only for stock update and do NOT include the prices in the payload If Protect Price = Yes and Update Price= Pending - We skip the product If Protect Price = Yes and List/Update the Whole Item = Pending - We pick the product for full update but do NOT include the prices in the payload

Protect the whole item - (Stop all product updates apart from Quantity) -Applicable for already created offers. If the offer is not created this flag is ignored. If Protect the whole item = Yes and Update Quantity = Pending -We send the quantity only If Protect the whole item = Yes and Update Price= Pending - We skip the product If Protect the whole item = Yes and List/Update the Whole Item = Pending - We skip the product

Closed -will stop all the updates to the MPs apart from the end item (send 0 stock update). This flag applies for all products the ones which are created and all new products.

Is this article helpful?
0 0 0