Skip to main content

What Is Localized Pricing?

Every product has a base price in a base currency. Localized Pricing lets you override that base with fixed prices you set per currency or per country. Turn it on by setting a pricing_mode on the product, then attach one rule per market. It’s one of three independent levers for international pricing, each solving a different problem:
MechanismWhat it doesThe number the customer sees
Localized PricingA fixed price you set per currency or countryExactly the amount you set
Adaptive CurrencyAutomatically converts your base price at live FX ratesBase price converted at the current exchange rate
Discount codesA percentage or flat reduction off the base priceBase price minus the discount
Localized Pricing and Adaptive Currency work together. When no localized rule matches, the product falls back to its base price — charged directly if the customer is already in your base currency, or converted through Adaptive Currency if not.

Use Cases

Purchasing Power Parity (PPP)

Charge less in price-sensitive markets without discounting your home market. A by_country rule lets a $20 base product sell for ₹999 in India — tuned to local purchasing power, not a straight FX conversion. The recommended, native way to run PPP.

Charm Pricing

A live FX conversion of $19.99 lands on an awkward number like €18.43. A by_currency rule sets the clean, psychologically-tuned price customers expect — €9.99, ¥1000, ₹499 — exactly as typed.

Reversible Market-Entry Promotions

Launching in a new country? Add a by_country rule with an introductory price, then archive it when the promotion ends to fall back to base/adaptive pricing. Rules are archived, never deleted, so you keep a clean record of what was live and when.

Competitive Price-Matching

Pin a single market to match a local competitor. A by_country rule for £9.00 in the United Kingdom holds that exact price regardless of how the GBP/USD rate moves.

Core Concepts

  • Pricing modes — A product is in exactly one mode at a time, set by its pricing_mode:
    • by_currency: one price per currency, regardless of country. Everyone paying in EUR sees €9.99.
    • by_country: a price specific to a country (₹999 in India), even when several countries share a currency.
  • Fixed amounts, in the smallest unit — A rule’s amount is an integer in the currency’s smallest unit, the same as everywhere else in the API: 99900 is ₹999.00, 999 is €9.99. It’s a price you set, never a converted value.
  • When no rule matches — The product keeps its existing behavior: customers in your base currency pay the base price directly; everyone else gets it converted through Adaptive Currency.
  • Fees are inclusive when a rule matches — The customer pays exactly the amount you set. The Adaptive Currency FX fee is absorbed by you (treated as fees-inclusive for that transaction) rather than added on top, so your stated local price is always the price charged.

Set Up in the Dashboard

1

Open the product form

In your Merchant Dashboard, go to Products and create a product (or open an existing one to edit). Set the base Price and currency as usual.
2

Enable Localized Pricing and choose a mode

In the Pricing section, tick Localized Pricing, then choose By Country or By Currency.
Localized Pricing enabled on the product form with By Country selected
3

Add a price for each market

Click Add Country Price or Add Currency Price, fill in the Localized pricing panel, and click Add. Each market you add appears in the overrides table, where you can edit or remove it later.
Pick a country, choose the currency, and enter the amount (for example ₹999 for India), then click Add.
Adding a 999 INR override for India
The country now appears in the Country overrides table, where you can edit or remove it.
Country overrides table showing India at 999 INR
4

Save the product

Save with Add product. Localized prices apply to future checkouts immediately.
Run a test checkout with a billing country that has a rule, and confirm the localized amount appears.

Manage via API

Localized Pricing is fully available over the API. First set the product’s pricing mode, then attach rules.

Set the pricing mode

Set pricing_mode when you create the product (or update an existing one). null means base-only, the existing behavior.
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
});

const product = await client.products.update('pdt_premium_plan', {
  pricing_mode: 'by_country',
});

Add a localized price

Attach a rule to the product. In by_country mode country_code is required; in by_currency mode it must be omitted.
// ₹999.00 for customers in India
const localizedPrice = await client.products.localizedPrices.create('pdt_premium_plan', {
  currency: 'INR',
  country_code: 'IN',
  amount: 99900,
});
For a by_currency product, omit country_code. For example, a flat €9.99 for everyone paying in EUR (currency: 'EUR', amount: 999).

List, update, and archive

You can update only a rule’s amount; currency and country are fixed once created. Archiving is an idempotent soft-delete, so the rule stops matching but stays in your history.
// List all active rules on a product
const rules = await client.products.localizedPrices.list('pdt_premium_plan');

// Change the amount (e.g. end a promo)
await client.products.localizedPrices.update('lcp_india_price', {
  product_id: 'pdt_premium_plan',
  amount: 119900,
});

// Archive a rule
await client.products.localizedPrices.archive('lcp_india_price', {
  product_id: 'pdt_premium_plan',
});

API Reference

See the full Product Localized Prices endpoints: create, list, retrieve, update, and archive.

How It Applies at Checkout

Localized pricing is resolved per cart line, and only for products that have a pricing_mode set. Dodo Payments reads two signals from the request: the customer’s billing country, and an optional billing_currency (when omitted, a currency is derived from the billing country).
  • By Country: looks for a rule matching the billing country. If one exists, the customer is charged the rule’s amount in the rule’s currency.
  • By Currency: looks for a rule matching the customer’s currency (the billing_currency, or the currency derived from their country). If one exists, the customer is charged the rule’s amount in that currency.
  • No match, or no pricing_mode: the base price applies, charged directly when the customer’s currency equals the base currency, otherwise converted through Adaptive Currency.
Each cart line is resolved on its own, so you can localize one product and leave others on base pricing in the same checkout. If any line matches a localized rule, the whole transaction is forced fees-inclusive (see Core Concepts).

Important Behaviors

BehaviorDetail
Pre-tax amountsA localized amount is the price before tax. For tax-exclusive products, tax is added on top at checkout, so the localized amount is not the final total. See Tax-Inclusive Pricing.
Not for Pay What You WantLocalized rules never apply to Pay What You Want products, where the customer chooses the amount.
By-currency differs from baseA by_currency rule must use a currency different from the product’s base currency.
One rule per marketA product can have at most one active rule per currency (by-currency) or per country (by-country).
All product typesApplies to one-time, subscription, and usage-based products.
Localized rule changes do not emit their own webhooks. The resolved amount appears on the resulting payment or subscription exactly like any other price.

Best Practices

  • Keep a sensible base price. It is the fallback for every market without a rule, converted through Adaptive Currency.
  • Round to local charm prices. The whole point of a fixed amount is a clean number like ₹999, €9.99, or ¥1000, not an FX result.
  • Pick the mode for the job. Use by_country for purchasing-power pricing; use by_currency when one price per currency zone is enough.
  • Archive, don’t recreate, for promotions. Archiving a rule reverts the market to base/adaptive while preserving history; recreate or re-price later as needed.
  • Mind the tax line before advertising a total. For tax-exclusive products the customer pays the localized amount plus tax, so don’t quote it as the final price in ads.

Purchasing Power Parity

Native localized pricing vs. location-based discount codes for PPP.

Adaptive Currency

Automatic FX conversion and the fee handling localized pricing builds on.

Tax-Inclusive Pricing

Control whether your prices include tax.

Pay What You Want

Let customers choose the amount. Localized rules do not apply there.
Last modified on June 24, 2026