SaaS pricing using PPP rates

How we made Playpass pricing more fair in all countries by using country purchasing power parity (PPP) rates instead of currency exchange rates.

Jul 30, 2017 · 3 min read

A good problem to have to solve

At the beginning of 2017, my startup Playpass had a good problem. We had customers outside the US who wanted to pay for our service, but they weren't sure how much it would cost in their local currency. At that time, we only listed prices in USD. So these customers had to mentally convert our prices to their currency, plus factor in any credit card exchange fees.

Since we use Stripe to process payments, we knew we could charge customers in 135 currencies.

But how should we set the price for each currency?

Using exchange rates

We could just charge everyone a fixed USD amount, converted to their local currency. Playpass is a Rails app and we use Ruby Money for everything money related. Thanks to Ruby Money's exchange rate stores, we could get daily exchange rates from the EU Central Bank or Google Currency.

But using exchange rates has two problems:

  1. Prices will change too often as exchange rates change
  2. Prices will be too high in less developed countries

We wanted prices that would be stable and fair.

Using PPP rates

Purchasing power parity (PPP) solves this for us.

Purchasing power parity (PPP) is an economic theory that states that the exchange rate between two currencies is equal to the ratio of the currencies’ respective purchasing power.

PPP can be easier to understand through the Big Mac Index, tracking how much a Big Mac costs in different countries. For example, in 2017 a Big Mac cost $5.06 in the US vs $1.62 (100 INR) in India.

You can download PPP rates from the World Bank

To make things easier, here's a version of the spreadsheet we created. It has Stripe's 135 currencies, 2016 PPP rates, and exchange rates dynamically calculated by Google Finance. Google doc link.

Sanity checking prices

If we solely used PPP rates, the range in prices would be too large. Per $100 we'd typically charge we'd receive less than $15 in Egypt and over 150 in Bermuda. In poorer countries, PPP rates reflect staggering levels of poverty. They don't take into account what our potential customer with a smartphone or computer can afford to pay. PPP rates also don't take into account local alternatives or competitor pricing in a market.

SaaS international prices

Integrating PPP rates into Rails

Next we use our own formula to adjust PPP rates in column J of the spreadsheet (for you to fill in). Then we paste the results into a YAML file for our Rails app. Note that PPP rates are multiplied by 1,000 and stored as integers. This follows the pattern of how to store all money related database columns, as integers.

# config/currency_ppp.yml
aed: 2478
afn: 31613
# ...
ugx: 1540403
usd: 1000
# ...
zar: 7611
zmw: 4796

Rake task for updating a Currency model

Then with a rake task bundle exec rails currencies:update_ppp_rates we grab the data from the .yml file and save it to Currency.ppp_rate.

require 'yaml'

namespace :currencies do
 desc 'Update PPP rates'
  task update_ppp_rates: :environment do
    ppp_rates = ActiveSupport::HashWithIndifferentAccess.new(
      YAML.load_file('config/currency_ppp.yml')
    )
    keys = ppp_rates.keys
    puts "Updating #{keys.size} currencies' PPP rates for SaaS pricing"

    keys.each do |k|
      Currency.find_by(code: k).update(ppp_rate: ppp_rates[k])
    end
  end
end

More coming soon…

Next, I'll write more about:

Visit homepage
comments powered by Disqus