Have you been looking at flights online only to come back the next day and see that the price has increased? Or perhaps you’ve tried to call an Uber at rush hour and suddenly it’s much more expensive? This is dynamic pricing, the practice of having multiple price points based on a few critical factors. Most of the time, users are not necessarily aware this is happening. By contrast, in a static or fixed pricing strategy, a company applies the same price level to any customer and market condition. 

Companies often decide to use this strategy when they serve several segments that have different budget levels. The ultimate goal is to allow them to adjust the prices of products or services in real-time  – or dynamically – in response to market demand. This practice is increasingly powerful and profitable in the age of the internet (and apps) economy. In this article we’ll run you through the do’s and don’ts of such pricing strategies, and show how to set one up using Braze. 

 

In what scenarios is dynamic pricing used?

Gennaro Cuofano, from FourWeekMBA, lists five common scenarios where businesses apply dynamic pricing: 

  • Peak or surge pricing: this is based on peak hours or periods where demand is especially high. For example, booking a hotel room during the summer months. 
  • Segmented pricing: this is based on the spending ability of some customers compared to others. For example, an iOS App might charge more for a premium subscription compared to their Android equivalent because industry reports show that iOS users spend more than double on subscriptions than their Android counterparts.
  • Changing conditions: for instance when sales start to slow down due to macroeconomic factors, pricing might take this into account, and be  adjusted upward again when the market improves. For example, when borders first opened after COVID-19 and airlines were offering cheaper flights to incentivize traveling.
  • Time-based pricing: this offers faster service for a higher charge. For example, “fast passes” that let you skip the line at theme parks.
  • Penetration pricing: this lowers the price of service to help a product penetrate a market. For example, when a new competitor enters the market and offers a very competitive price to acquire  users from other competitors.

Once your company has decided on the best subscription strategy for your app, it’s time to build an accurate dynamic pricing scheme. The best way to do this is to rely on demographic data (device, city/country, age), and behavioral data (app usage, paywall interactions, source of the lead, profile completion, time of the day/week). 

 

Identifying a potential buyer in the least amount of time

Dynamic pricing is a constant balance between data accuracy + time trade. This means that you can wait to get to know the user and later adjust the price based on the data, but there’s a chance this user won’t convert at all. That’s because it’s common that most subscriptions come during the first day (or even hour) of the app being downloaded.

With dynamic pricing, an objective might be to identify who is more likely to purchase and then prompt them with the right subscription or package. However, it’s important to keep in mind that it’s easier to predict who will not pay, since there’s typically a higher base of free users. 

For example, if your conversion from App Download to Subscription is 5%, 95% of your user base is not likely to convert in the first instance.  These users are a lot easier to identify and a way to monetize  them is to serve them ads or give them a higher discount. It’s important to give these users something to also retain them (network effect for no buyers).

 

When dynamic pricing becomes price discrimination (the bad and the ugly)

It is legal – and common – that consumers are charged different prices for the same product. Airbnb, Uber, Booking, Amazon, and airline companies, will have different prices depending on demand and offer. 

This isn’t necessarily a bad thing, applying dynamic pricing can be beneficial to both the users and the business. For example, Netflix recently announced a new ad-supported subscription for a lower price. This is beneficial for users with less disposable income, while perhaps Netflix will retain users that were considering unsubscribing from the service. Another case is when companies offer an introductory price for new users that allows them to fully experience the app before committing to a monthly subscription. 

However, if price discrimination is based on gender, race, or religion, this is unethical, and in some countries, illegal. Such a pricing strategy only brings profit to the companies and little benefit for the user. In the United States, for example, dynamic pricing is illegal if it violates antitrust laws (Robinson-Patman Act). However, to prove there was a violation of this law in the US, the consumer has to demonstrate that price discrimination harms their ability to compete for a fair price. 

Proving this can be difficult. The difficulty – and a further ethical dilemma – comes from the collection of data, both behavioral and demographic, and the lack of transparency around it. Tracking cookies enable companies to collect information on browsing activity and even personal information, in order to display the most profitable price. Most companies won’t mention that these cookies might change the prices of their products. 

This practice is becoming increasingly sophisticated. Some companies now use algorithms, as well as tracking cookies, to apply such dynamic pricing. All these algorithms in the end have the same objective: to predict how willing the user is to buy at a given price in order to maximize profit. It is vital therefore that these algorithms are carefully programmed to avoid unethical behavior. They must increase revenue and profitability for the company while adding value to the user’s life at a fair price. 

 

The basis of a good dynamic pricing strategy 

  1. Start with the benefit to the user, and the scenario in which it will be used. This might not immediately be straightforward; for instance in times of high demand for rail travel, high prices might seem unbeneficial but bear in mind the user is still securing the finite service. 
  2. Consider your long-term relationship with the user. Ideally, you want to retain every user, and to do that they need to be satisfied with the service they’ve received. While dynamic pricing is usually used in the specific scenarios outlined above, it’s important to make sure it’s still a fair, transparent exchange. In scenarios where the price increases, you might wish to consider additional benefits, such as new features or loyalty discounts that will give the user more value.
  3. Make sure that price discrimination is not based on gender, race, or religion, or that these factors can influence the price in any way. As mentioned, this is illegal in some countries, is ethically wrong, and could do your company severe reputational damage. 

 

How to apply dynamic pricing to CRM campaigns in Braze? 

Now you’ve decided on your dynamic pricing strategy which rests on an ethical and beneficial scenario, it’s time to communicate and use your CRM tools, such as Braze, to deliver it to your users in the most efficient way possible. In the following section, we go into detail as to how we at Phiture typically do this with Braze. 

Braze’s Connected Content is a great feature that expands on marketing personalization and boosts customer engagement and conversions. It makes campaign creation much more efficient and scalable for CRM Teams in many use cases, including dynamic pricing. 

Connected Content minimizes the time to deployment by reducing the setup process to hours instead of days. It also limits errors. Instead of setting up individual campaigns, you would set up one campaign which then dynamically and automatically populates the relevant information.

With Connected Content, users can receive an in-app message, push notification, or email with different pricing based on their attributes such as age, country, and device. If your company is using a tool like Amplitude, you could even create cohorts with high targeting criteria including behavioral data such as acquisition source, engagement with the app, or the number of sessions. Using Connected Content, we can insert the variables such as price and product name and redirect the users to the correct deep link (paywall or direct-to-purchase links).

 

Automation of campaigns

The content from external data sources, such as Google or Excel sheets, can be called upon within the message using an API endpoint. An endpoint is a URL that provides the location of a piece of information on a server. You can use public API endpoints or your own (your developers would need to make these available to your CRM team). 

 

Step 1: The Google or Excel sheet is created internally and an API endpoint is defined by the developers from your team (if you are a client of Phiture, we can also host the API and make the endpoints available for you). This sheet will have all of the different information needed regarding your products, for example, price, images, deeplinks, ID, and so on. One of these columns could be also a custom attribute currently being sent to Braze and used as an anchor between both sources. 

 

Step 2: CRM team adds the connected content call to the campaign using liquid code. Liquid is an open-source template language created by Shopify that can be used in Braze. Liquid tags act as placeholders in your messages that can pull in information from your user’s account and your connected content source, and enable personalization and relevant messaging practices.

{% connected_content https://YOURURL.COM/SHEETID/TABNAME :save response %} {% assign id = {{response.data.campaigns[0].content.locales[products]}} %} {{${first_name}}}, get {{id.product}}} for only €{{id.price}}}.

 

Step 3: Within the connected content call, you will need to add the sheet ID and the name of the sheet you’re working on. The API call will return a JSON in response. As you can see in the JSON file below, you have the ID of the sheet, the tab, and then the different columns and values. Each of these values can be recognized in Braze by using a code snippet.

 

Step 4: This way, after the connected content call, you will assign the “id” name to the key value. If the custom attribute is a string and you want the call to look for that value in all the rows, it needs to be between [straight brackets]:

{{response.data.campaigns[0].content.locales[BrazeAttributeAssignedName]}}

If the custom attribute is just a place on the row, you then assign the content to the specific row needed:

{% assign locales = response.data.campaigns[0].content.locales %} {% assign content = locales.RowValue%}


In this case, we wanted to calculate “age” to show the correct price according to the age of the user. Using Braze’s out-of-the-box attribute of date of birth, we subtracted “now” minus “date of birth”, formatting both into the same date format (“%Y-%m-%d”). There are two ways to go from here: 

Using “age” as a number and then using liquid to apply “more than” and “less than” logic.

{% assign now = “now” | date: “%Y-%m-%d” %}
{% assign birthday = ${date_of_birth} | date: “%Y-%m-%d” %}
{% assign age = now | minus: birthday %}
{% if ${date_of_birth} == blank %}
{% abort_message(‘Empty Birthdate Error’) %}
{% elsif age >= 18 and age <=24 %}
{% assign locales = response.data.campaigns[0].content.locales %}
{% assign content = locales.18%}
I am {{age}} years old and I’ll pay €{{content.Price}} for {{content.Product}}.
{% elsif age >= 25 and age <=39 %}
{% assign locales = response.data.campaigns[0].content.locales %}
{% assign content = locales.25%}
I am {{age}} years old and I’ll pay €{{content.Price}} for {{content.Product}}.
{% elsif age >= 40 %}
{% assign locales = response.data.campaigns[0].content.locales %}
{% assign content = locales.40%}
I am {{age}} years old and I’ll pay €{{content.Price}} for {{content.Product}}.
{% else %}
{% abort_message(‘Invalid age’) %}
{% endif %}

Using “age” as a string and using it to be a dynamic field in the code. This would also be the way to apply connected content to most of the use cases where you are matching an existing custom attribute in Braze with a column in your Google or Excel Sheet.

{% assign now = “now” | date: “%Y-%m-%d” %}
{% assign birthday = ${date_of_birth} | date: “%Y-%m-%d” %}
{% assign age = now | minus: birthday | append: “” %}
{% assign id = {{response.data.campaigns[0].content.locales[age]}} %}
{% if {{id}} == nil %}
{% abort_message(‘No Valid Age’) %}
{% else %}
I am {{age}} and I’ll pay €{{id.Price}} for {{id.Product}}
{% endif %}

Step 5: Test & send the message to your users with personalized and localized content recommendations based on custom attributes using code snippets.

{{age}}, {{id.Price}}, {{id.Product}}

Recommendations:

  • Everything should be tested to make sure it works the way you intend (deep links, images, names).
  • Connected content can only work in live tests with Braze. We recommend setting up a campaign in your developer environment so it will not be triggered to the full user base while testing.
  • In order to get users to subscribe, your app should offer a smooth way to make a purchase, removing any friction on their way. This could be achieved by using direct-to-purchase deeplinks without additional steps in retargeting or discount campaigns. If your in-app message already displays the price and even a legal footnote using Content Blocks, allow the user to close the deal in one single tap.  

 

Conclusion

Dynamic pricing is a monetization strategy used more and more in the e-commerce market, including App subscriptions. It’s common to adapt your product or service prices based on the buyer’s behavior and characteristics. Whenever we think of dynamic pricing, it’s important to understand what’s ethical and legal about this practice. Even if it’s a business decision to increase profitability, as a company is important to make sure you are not discriminating against people based, for example, on their gender. 

Once a business decides to use different prices based on business rules, the challenge for most CRM Teams is how to implement it in an efficient way using Braze. Having individual campaigns and constantly updating prices is time-consuming and leads to human error. With Braze Connected Content feature, users can receive an in-app message, push notification, or email with different pricing based on attributes such as country, device, or age, allowing CRM Teams to be more efficient.

 

Further Reading

Braze, Personalization Using Liquid Tags

Braze, Connected Content

Christopher Coble, Esq. Is Dynamic Pricing Legal?

Gennaro Cuofano, Dynamic Pricing: Is The Price Tag Legacy Coming To An End?

Shannon Egan, Mapping the Ethicality of Algorithmic Pricing

Seele, P., Dierksmeier, C., Hofstetter, R. et al. Mapping the Ethicality of Algorithmic Pricing: A Review of Dynamic and Personalized Pricing.