European Price Indication Directive

A quick guide to how you can advertise price reductions using Composable Commerce in compliance with Europe's Price Indication Directive.

Goal

The Price Indication Directive (PID) aims to prevent businesses from inflating a product's original price artificially to advertise fake price reductions and mislead customers about the amount or percentage of discount. Because the regulation focuses on protecting the rights of EU consumers, if you're a merchant selling goods to customers in Europe, you must comply with the regulation.

With PID in effect, if you wish to announce a price reduction, you must display the lowest price charged for the product in the last 30 days or more. For example, consider you're selling a pair of shoes for €100, and in the last 30 days, you've sold the shoes at a discounted price of €80. On the following weekend, if you want to sell the shoes for €70, the prior price must be €80—not €100.

Note that there are exceptions to this rule, which can vary by country or the type of products. Consult with your legal counsel on all available options that guarantee compliance, while best appealing to your customers.

This guide is to help you get started and does not serve as comprehensive guidance. To fulfill your use case, you might have to make additional configurations.

Prerequisites

We assume you have a Project set up with Products and Embedded or Standalone Prices assigned for the Products. If not, we recommend getting started with setting up a Project and understanding the fundamental concepts of the Composable Commerce's APIs.

If you meet the preceding prerequisite, ensure to meet the following prerequisites in addition, to follow the guide and complete the steps:

  • Knowledge of Custom Fields

    To learn how to use them for extending Embedded Prices, see the tutorial; you can extend Standalone Prices similarly.

  • Subscription to Product or Standalone Prices Messages

  • An API Client with the following scopes granted: manage_subscriptions:{projectKey}, view_messages:{projectKey}, and manage_products:{projectKey} or manage_standalone_prices:{projectKey}

Steps

To display the lowest price of the product in the last 30 days or more, let's use Custom Fields. Both Embedded and Standalone Prices can be extended using Custom Fields.

Considering the example from earlier, at a high level, you must do the following:

  1. Create a Custom Field of Money typeprevious-lowest-price—and set the value to €80, or leave the value empty (since there was no lowest price previously).
  2. When changing the price to €70 on the following week, set the value of previous-lowest-price to €80.

When you update the price, we suggest capturing the old value and the date when it was updated. This can help give you a quick overview of the changes when prices change several times in a day or week. Alternatively, you can use Subscriptions for comprehensive tracking.

  1. On your product pages on your storefront, display the previous-lowest-price value (€80) in addition to the normal list price (€100).

While you're required to show the lowest price within the last 30 days, you also have a certain degree of freedom in choosing how you want to display the prices. You can display information such as the non-discounted list price and the discounted percentage. In such cases, you can create additional Custom Fields such as list price and percent discounted, and display their values on your storefront.

When displaying the discounted percentage compared with the previous lowest price, you can do either of the following:

  • Calculate the discount on a separate Custom Field at the same time when the previous-lowest-price field is updated
  • Calculate the discount on your frontend

Tracking changes

To track changes to your prices, you can use Subscriptions and Messages. To be notified of changes to Embedded or Standalone Prices, subscribe to Product or Standalone Price Messages. When you change the prices, the Messages generated capture the necessary data:

You can create a log of the changes from the information returned on all the Messages.