Prices feature overviewEdit on GitHub
The Prices feature enables Back Office users to set prices for products and manage them effectively.
To accommodate business requirements, there can be various price types—for example, a default price is a product’s regular price. An original price is typically used to show a product’s price before a discount was applied. The original price is displayed in a strikethrough font next to the default price.
Product types and price inheritance
Back Office users can set prices for both abstract products and product variants. When an abstract product has multiple product variants, you can set a price for the abstract product and different prices for each product variant.
On the Storefront, when customers browse catalog and search pages, they see abstract product prices.
When a customer opens a Product Details page, they still see an abstract product price.
After selecting a product variant, they see the variant’s price.
In some cases, you may want to set the same price for all the product variants. Then, you set the price for the abstract product and don’t set any for the variants. When the variants don’t have prices, they inherit the price of their abstract product.
Similarly, when there is one product variant, it makes sense to set the price just for the abstract product.
In the last two cases described, since product variants don’t have prices, customers see the abstract product price on all the Storefront pages.
Prices in database
Prices are stored as an integer, in the smallest unit of a currency—for example, Euro prices are stored in cents.
Each price is assigned to a price type, like DEFAULT or ORIGINAL price. For a price type, there can be one to n product prices defined. Price type entity is used to differentiate between use cases. For example, you can have DEFAULT and ORIGINAL types to use for sale pricing.
The price can have a gross or net value which can be used based on a price mode selected by a customer on the Storefront. You can have a shop running in both modes and select the net mode for the business customer, for example.
It’s important to understand how Spryker calculates gross price for a product across tax regions, to ensure your store displays the intended price to customers. If a customer chooses gross mode and chooses to buy the product in a tax region different than the store’s tax region, Spryker calculates the new region’s tax based on the product’s gross price defined for this product in the store, rather than the product’s net price. Therefore, the tax amount will be different depending on whether gross or net is enabled on the storefront. Here’s a simple example of price calculation across tax regions:
The Value Added Tax (VAT) in country A, the store’s tax region, is 20%. The net price of a product is 100. In country A the gross price is 120. The customer sees a price of 100 in net mode and a price of 120 in gross mode.
However, your customer chooses to buy the same product from country B while still in the store that falls under country A tax rates.
VAT in country B is 10%. Tax for the new region is calculated based on the product’s gross price in the store’s region because the customer selected gross mode. In country B, the customer still sees a gross price of 120. However, the net price shown is 109,09 (VAT at 10% rate from 120 is 10.91).
Price also has currency and store assigned to it.
Price retrieving logic
If a concrete product doesn’t have a price entity stored, it inherits the values stored for its abstract product. When fetching the price of a concrete product, the price entity of the respective concrete product SKU is checked. If the entity exists, the price is returned. If not, an abstract product owning that concrete product is queried and its price entity is checked. If it exists, the abstract product’s price is returned for the concrete product. If it does not exist an exception is thrown.
The following diagram summarizes the logic for retrieving the price for a product:
Related Business User documents
|BACK OFFICE USER GUIDES
|Define prices when creating abstract products and product bundles
|Edit prices of an abstract product
|Define prices when creating a concrete product
|Edit prices of a concrete product
Related Developer documents
|GLUE API GUIDES
|TUTORIALS AND HOWTOS
|Install the Prices feature
|Retrieving abstract product prices
|File details: product_price.csv
|HowTo: Handle twenty five million prices in Spryker Commerce OS
|Money module: reference information
|Install the Product Price Glue API
|Retrieving concrete product prices
|PriceProduct module details: reference information
For submitting the form