Amazon SP API Price
Version | Date | Created / Updated | Notes |
---|---|---|---|
v1.0 | 11.05.2022 | Bogomil Pavlov | First publish |
v1.1 | 20.06.2023 | Bogomil Pavlov | Introduce Suffix/Prefix Update |
v1.2 | 16.08.2023 | Bogomil Pavlov | RRP logic rework |
Pricing Feed
We will use the Pricing feed to manage prices on Amazon. The xml structure and flows are described here but the actual feed flow and response reader is available here - Amazon SP-API Orders and Products Feeds Flow
API Call: POST_PRODUCT_PRICING_DATA
API Docs: selling-partner-api-docs/feedtype-values.md at main · amzn/selling-partner-api-docs · GitHub
XSD Schema:
<?xml version="1.0"?>
<!-- Revision="$Revision: #3 $" -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<!--
$Date: 2006/11/17 $
AMAZON.COM CONFIDENTIAL. This document and the information contained in it are
confidential and proprietary information of Amazon.com and may not be reproduced,
distributed or used, in whole or in part, for any purpose other than as necessary
to list products for sale on the www.amazon.com web site pursuant to an agreement
with Amazon.com.
-->
<xsd:include schemaLocation="amzn-base.xsd"/>
<xsd:element name="Price">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="SKU"/>
<xsd:element name="StandardPrice" type="OverrideCurrencyAmount" minOccurs="0"/>
<!--StandardPricePoints attribute will be deprecated on 11/01/2021-->
<xsd:element name="StandardPricePoints" type="xsd:integer" minOccurs="0"/>
<xsd:element name="BusinessPrice" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityPriceType" type="QuantityPriceTypes" minOccurs="0"/>
<xsd:element name="QuantityPrice" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="QuantityPrice1" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityLowerBound1" type="PositiveInteger" minOccurs="0"/>
<xsd:element name="QuantityPrice2" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityLowerBound2" type="PositiveInteger" minOccurs="0"/>
<xsd:element name="QuantityPrice3" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityLowerBound3" type="PositiveInteger" minOccurs="0"/>
<xsd:element name="QuantityPrice4" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityLowerBound4" type="PositiveInteger" minOccurs="0"/>
<xsd:element name="QuantityPrice5" type="BasePriceCurrencyAmount" minOccurs="0"/>
<xsd:element name="QuantityLowerBound5" type="PositiveInteger" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="MinimumSellerAllowedPrice" type="StringOverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="MaximumSellerAllowedPrice" type="StringOverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="MAP" type="OverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="DepositAmount" type="CurrencyAmountWithDefault" minOccurs="0"/>
<xsd:element name="Sale" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="SalePrice" type="OverrideCurrencyAmount"/>
<!--SalePricePoints attribute will be deprecated on 11/01/2021-->
<xsd:element name="SalePricePoints" type="xsd:integer" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CompareAt" type="DatedCompareAtPrice" minOccurs="0"/>
<xsd:element name="Previous" type="DatedPrice" minOccurs="0"/>
<xsd:element name="Rental_0" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_1" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_2" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_3" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_4" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_5" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_6" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_7" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_8" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Rental_9" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="StartDate" type="xsd:dateTime"/>
<xsd:element name="EndDate" type="xsd:dateTime"/>
<xsd:element name="RentalPrice" type="OverrideCurrencyAmountWithTax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CostPerClickBidPrice" type="OverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="PricingAction" type="PricingActionValues" minOccurs="0"/>
<xsd:element name="MetalStandardPrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="DiamondStandardPrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="GemstoneStandardPrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="MakingChargesStandardPrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="TaxStandardPrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="MetalSalePrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="DiamondSalePrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="GemstoneSalePrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="MakingChargesSalePrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="TaxSalePrice" type="StringNotNull" minOccurs="0"/>
<xsd:element name="MaximumRetailPrice" type="OverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="IsSourcingOnDemand" type="IsSourcingOnDemandValues" minOccurs="0"/>
<xsd:element name="PricingStrategy" type="PricingStrategyValues" minOccurs="0"/>
<xsd:element name="MinimumOrderAmount" type="xsd:decimal" minOccurs="0"/>
<xsd:element name="MaximumOrderAmount" type="xsd:decimal" minOccurs="0"/>
<xsd:element name="OrderIncrement" type="xsd:decimal" minOccurs="0"/>
<xsd:element name="MSRPWithTax" type="OverrideCurrencyAmount" minOccurs="0"/>
<xsd:element name="StandardPricePointsPercent" type="xsd:integer" minOccurs="0"/>
<xsd:element name="SalePricePointsPercent" type="xsd:integer" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="BaseCurrencyCodeWithDefault">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="USD"/>
<xsd:enumeration value="GBP"/>
<xsd:enumeration value="EUR"/>
<xsd:enumeration value="JPY"/>
<xsd:enumeration value="CAD"/>
<xsd:enumeration value="CNY"/>
<xsd:enumeration value="INR"/>
<xsd:enumeration value="AUD"/>
<xsd:enumeration value="BRL"/>
<xsd:enumeration value="MXN"/>
<xsd:enumeration value="TRY"/>
<xsd:enumeration value="DEFAULT"/>
<xsd:enumeration value="AED"/>
<xsd:enumeration value="SAR"/>
<xsd:enumeration value="SGD"/>
<xsd:enumeration value="SEK"/>
<xsd:enumeration value="PLN"/>
<xsd:enumeration value="EGP"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="CurrencyAmountWithDefault">
<xsd:simpleContent>
<xsd:extension base="BasePriceCurrencyAmount">
<xsd:attribute name="currency" type="BaseCurrencyCodeWithDefault" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="StringCurrencyAmountWithDefault">
<xsd:simpleContent>
<xsd:extension base="StringBasePriceCurrencyAmount">
<xsd:attribute name="currency" type="BaseCurrencyCodeWithDefault" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="OverrideCurrencyAmount">
<xsd:simpleContent>
<xsd:extension base="CurrencyAmountWithDefault">
<xsd:attribute name="zero" type="xsd:boolean" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="StringOverrideCurrencyAmount">
<xsd:simpleContent>
<xsd:extension base="StringCurrencyAmountWithDefault">
<xsd:attribute name="zero" type="xsd:boolean" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="OverrideCurrencyAmountWithTax">
<xsd:simpleContent>
<xsd:extension base="OverrideCurrencyAmount">
<xsd:attribute name="valueWithoutTax" type="BasePriceCurrencyAmount" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="QuantityPriceTypes">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="fixed"/>
<xsd:enumeration value="percent"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="PricingActionValues">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="delete business_price"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Mapping request:
Integration Field | Integration Notes | Integration required | Hemi Mapping | Hemi Notes | |||
---|---|---|---|---|---|---|---|
Price |
|||||||
SKU |
Yes | Product Details> SKU | (v1.1)Based on the setup in Account Amazon > Suffix/Prefix Value we want to add the suffix/prefix when we are sending updates to Amazon in the SKU. | ||||
StandardPrice |
Yes | Product Accounts > Price |
OR
Product Accounts > RRP | <v1.2>
If RRP <= Price we push Product Account > Price
If RRP > Price we push Product Account > RRP
</1.2>
We also need to pick the currency from Account > Exchange Rate Calculator Currency
and use it as attribute - currency="EUR"
e.g - <StandardPrice currency="EUR"><![CDATA[26.99]]></StandardPrice>
| |
| | StandardPricePoints
| | | No | N/A | | |
| | BusinessPrice
| | | No | N/A | | |
| | QuantityPriceType
| | | No | N/A | | |
| | QuantityPrice
| | | No | N/A | | |
| | | QuantityPrice1
| BasePriceCurrencyAmount | No | N/A | | |
| | | QuantityLowerBound1
| PositiveInteger | No | N/A | | |
| | | QuantityPrice2
| BasePriceCurrencyAmount | No | N/A | | |
| | | QuantityLowerBound2
| PositiveInteger | No | N/A | | |
| | | QuantityPrice3
| BasePriceCurrencyAmount | No | N/A | | |
| | | QuantityLowerBound3
| PositiveInteger | No | N/A | | |
| | | QuantityPrice4
| BasePriceCurrencyAmount | No | N/A | | |
| | | QuantityLowerBound4
| PositiveInteger | No | N/A | | |
| | | QuantityPrice5
| BasePriceCurrencyAmount | No | N/A | | |
| | | QuantityLowerBound5
| PositiveInteger | No | N/A | | |
| | MinimumSellerAllowedPrice
| | StringOverrideCurrencyAmount | No | N/A | | |
| | MaximumSellerAllowedPrice
| | StringOverrideCurrencyAmount | No | N/A | | |
| | MAP
| | OverrideCurrencyAmount | No | N/A | | |
| | DepositAmount
| | CurrencyAmountWithDefault | No | N/A | | |
| | Sale
| | | No | | | |
| | | StartDate
| | No | “CURTIME - 10 min”
e.g. - 2022-09-10T14:25:58Z | If RRP is provided and RRP > Start Price we hardcode the dates until when the sale is active. | |
| | | EndDate
| | No | “CURTIME + 1 years“
e.g. - 2022-09-10T14:25:58Z | If RRP is provided and RRP > Start Price we hardcode the dates until when the sale is active. | |
| | | SalePrice
| OverrideCurrencyAmount | No | Product Accounts > Price | <v1.2>If RRP > Price we want to push this field as Product Account > Price
</v1.2>
This is required only RRP is provided otherwise we do not include it in the payload
If RRP is provided and RRP > Start Price in Hemi we should push the SalePrice as Product Accounts > Price
We also need to pick the currency from Account > Exchange Rate Calculator Currency
and use it as attribute - currency="EUR"
e.g - <StandardPrice currency="EUR"><![CDATA[26.99]]></StandardPrice>
| |
| | | SalePricePoints
| | No | N/A | | |
| | CompareAt
| | DatedCompareAtPrice | No | N/A | | |
| | Previous
| | DatedPrice | No | N/A | | |
| | Rental_0
| | | No | N/A | | |
| | | StartDate
| | No | N/A | | |
| | | EndDate
| | No | N/A | | |
| | | RentalPrice
| | No | N/A | | |
| | Rental_1
| | | No | N/A | | |
| | | StartDate
| | No | N/A | | |
| | | EndDate
| | No | N/A | | |
| | | RentalPrice
| | No | N/A | | |
| | CostPerClickBidPrice
| | | No | N/A | | |
| | PricingAction
| | | No | N/A | | |
| | MetalStandardPrice
| | | No | N/A | | |
| | DiamondStandardPrice
| | | No | N/A | | |
| | GemstoneStandardPrice
| | | No | N/A | | |
| | MakingChargesStandardPrice
| | | No | N/A | | |
| | TaxStandardPrice
| | | No | N/A | | |
| | MetalSalePrice
| | | No | N/A | | |
| | DiamondSalePrice
| | | No | N/A | | |
| | GemstoneSalePrice
| | | No | N/A | | |
| | MakingChargesSalePrice
| | | No | N/A | | |
| | TaxSalePrice
| | | No | N/A | | |
| | MaximumRetailPrice
| | | No | N/A | | |
| | IsSourcingOnDemand
| | | No | N/A | | |
| | PricingStrategy
| | | No | N/A | | |
| | MinimumOrderAmount
| | | No | N/A | | |
| | MaximumOrderAmount
| | | No | N/A | | |
| | OrderIncrement
| | | No | N/A | | |
| | MSRPWithTax
| | | No | N/A | | |
| | StandardPricePointsPercent
| | | No | N/A | | |
| | SalePricePointsPercent
| | | No | N/A | | |
| BaseCurrencyCodeWithDefault
| | | Values: USD GBP EUR JPY CAD CNY INR AUD BRL MXN TRY DEFAULT AED SAR SGD SEK PLN EGP | No | N/A | | |
| CurrencyAmountWithDefault
| | | | No | N/A | | |
| | BasePriceCurrencyAmount
| | | No | N/A | | |
| StringCurrencyAmountWithDefault
| | | | No | N/A | | |
| | StringBasePriceCurrencyAmount
| | | No | N/A | | |
| OverrideCurrencyAmount
| | | | No | N/A | | |
| | CurrencyAmountWithDefault
| | | No | N/A | | |
| StringOverrideCurrencyAmount
| | | | No | N/A | | |
| | StringCurrencyAmountWithDefault
| | | No | N/A | | |
| OverrideCurrencyAmountWithTax
| | | | No | N/A | | |
| | OverrideCurrencyAmount
| | | No | N/A | | |
| QuantityPriceTypes
| | | | No | N/A | | |
| PricingActionValues
| | | | No | N/A | | |
Sample Request:
<Message>
<MessageID><![CDATA[9]]></MessageID>
<Price>
<SKU><![CDATA[44102816390]]></SKU>
<StandardPrice currency="EUR"><![CDATA[26.99]]></StandardPrice>
</Price>
</Message>
<Message>
<MessageID><![CDATA[10]]></MessageID>
<Price>
<SKU><![CDATA[44602518430]]></SKU>
<StandardPrice currency="EUR"><![CDATA[98.99]]></StandardPrice>
<Sale>
<StartDate><![CDATA[2022-08-29T09:55:26Z]]></StartDate>
<EndDate><![CDATA[2023-08-29T10:05:26Z]]></EndDate>
<SalePrice currency="EUR"><![CDATA[53.99]]></SalePrice>
</Sale>
</Price>
</Message>
The trigger for price update will be our standard flag Product Accounts > Update Price. Since we wont have listing flow yet, when we select listing for price update we need to ignore the internal Product and Listing status and rely only on:
Product Accounts > Update Price = Pending Product Accounts > Closed = 0 Product Accounts > Protect Price = 0 Product Accounts > Protect Whole Item = 0
If update was successfully sent, we will have following statuses:
Product Accounts > Update Price = Sent
If we receive an error, we will have:
Product Accounts > Update Price = Error Product Accounts > Error Updating Price= {Store the relevant error message}
If the update is successful:
Product Accounts > Update Price= Not Needed