Regional pricing: a Brazilian player may pay less, and your interface never finds out
Managed pricing adjusts the value by economic location, with a floor of 70% off and a ceiling at the standard price. The problem: a price hard-coded into the interface does not follow, and the player sees one number and pays another.
Produced with AI from the sources cited below, and checked by automated verification against those same sources. No person read this text before publication. Editorial Policy

There is a strong chance the price your Brazilian players pay today is not the price you typed — and that your shop is showing them the wrong number.
The first half of that is deliberate and good. The second is a bug, and it is silent. This guide separates the two.
The problem
Managed pricing lets you offer region-specific prices. How it works: you set a standard global price, and Roblox adjusts from it according to the user's economic location.
The sentence that organises everything that follows is this one: economic location is not always the same thing as the account's location. The signals used include VPN usage, billing history and account history. And when it cannot be determined, the user sees the standard global price.
The limits are generous and asymmetric: the regional price never has a discount greater than 70 per cent off the standard, and never exceeds the standard. The official example closes the arithmetic — a 100 Robux item can sit between 30 and 100 Robux, whatever the region.
Notice the asymmetry, because it is reassuring: the price can only be equal or lower. There is no risk of anyone being charged more than you set.
Where this is already on without your having done anything: on passes, regional pricing comes on by default for all of them — new and existing. And on subscriptions charged in Robux, it comes on and cannot be switched off.
Meaning that if you sell a pass or a subscription in Robux, regional pricing is working right now, with or without your decision.
Step by step
For passes, there is nothing to switch on — it already is. What exists is the route to switch it off, if you want: in Creations, choose the game, go to Monetization and then Passes, select one or more passes and click Disable Managed Pricing.
It is worth looking at the effect first: selecting a pass and going to its sales page, the list of top countries shows the prices adjusted from the standard price. It is the quickest way to see what your audience actually pays.
For developer products, the feature does not come switched on, and the sequence has an order that matters:
- Check whether the prices are read dynamically by script. This step comes first on purpose, and it is the subject of the common mistakes section.
- Implement
GetUsersPriceLevelsAsyncto regulate item transfers. - In Monetization and then Developer Products, select the products and click Enable Managed Pricing.
The second step exists for a specific reason: when users gift or trade items with different managed prices, an arbitrage gap opens — buying cheap in one region and transferring to another. The API exists so you can regulate that transfer knowing each side's price level.
For subscriptions, there is nothing to do: in Robux, managed pricing is on and does not switch off; in local currency, it does not exist.
A note on what the feature does NOT do. It is not a promotion, it is not temporary and it is not configurable by you region by region. You set a standard price and choose which items are included; the rest is decided by signals Roblox observes, and the values are updated periodically to follow the global economy.
That has a planning implication: the price a player in one region sees today may not be the same a few months from now, with nothing having changed on your side. Any communication promising a specific value for a region ages by itself.
The artifact
The table below states, by item type, where managed pricing is already on, whether it can be switched off, and what you have to change in the code for each case.
It exists because the default state is different for each type, and the difference is not intuitive: passes come on, products come off, subscriptions in Robux come on and locked. Anyone assuming a single state ends up with half the shop adjusting prices and the other half not.
At the end of it is the dynamic price check script, which is the practical part of this text.
It is also worth understanding what economic location means for the person on the other side. It is not a label the player chooses or sees: it is an inference, made from signals such as VPN usage, billing history and account history. Two players in the same country can end up at different levels, and neither of them has any way of knowing why.
That has a support consequence worth anticipating: when a player complains that their friend paid less, there is no adjustment you can make. The honest answer is that the price is adjusted by the platform and that the value you set is the ceiling — nobody pays more than it.
Common mistakes
The mistake is a single one, it is common, and it is invisible from the inside: a price hard-coded into the interface.
The mechanism is exactly this, as described in the documentation: if you wrote the price into the game's interface, that number does not update, because it is neither dynamic nor accessible to Roblox. The result is that the player is charged the correct regional value and sees the hard-coded value.
Think about what that produces for the person playing. The shop says 100 Robux. They click, and the Roblox purchase window says 30. At best they think they got a mysterious discount; at worst, they distrust the game. And if the difference went the other way it would be worse still — but that does not happen, because the regional price never rises.
The detail that misleads is that it is not a billing bug. The billing is correct. It is a display bug, and that is why no log, no sales report and no dashboard flags it.
There is an exception that saves work, and it is worth knowing: if you only apply managed pricing to passes sold on the game's detail page, you do not need to check for hard-coded prices. When the feature is on, the price adjusts by region inside and outside the game — the problem only exists in the interface you designed.
And there is an official tool for finding those cases, which almost nobody uses. The dynamic price check updates every item on sale inside the game with a fake price in Robux or a fake economic location. Whatever changes on screen is being read from MarketplaceService by a client script; whatever does not change is hard-coded.
It is a test of the effect, not a reading of the code — the kind that does not get it wrong. The route is Monetization, then Passes or Developer Products, the item's menu and Dynamic Price Check. You can name up to five Roblox users as test accounts.
The fix, once identified, is swapping the written number for a read from MarketplaceService — which is the same call that already builds the rest of the storefront.
And there is a case that deserves special attention: a shop built by a server script. Since displaying the regional price depends on the value being read on the side of whoever is buying, a storefront built on the server shows the same number to everyone — which is a variation of the same hard-coded price problem, with the difference that the code looks dynamic.
Next step
The concrete work for today is the check. Run the tool with a test account, look at your shop, and note every price that did not change. That list is the bug list.
After that, it is worth looking at the effect on the money before deciding to switch anything off. The temptation to disable managed pricing on a pass that sells well is real — it looks like losing up to 70 per cent in some regions. The arithmetic that matters is different: how many of those players would buy at the full price? A discount on a sale that would not have happened is not a loss.
The list of top countries, on the pass's sales page, gives the raw material for that calculation: it shows what each region pays today, and you already know where your players come from.
And, for anyone selling developer products with transfers between players, GetUsersPriceLevelsAsync stops being optional the moment managed pricing is switched on. Without it, the price difference between regions becomes an arbitrage machine inside your own game — and it runs by itself, with nobody needing to exploit anything.
Sources
Ready-to-use artifact
MANAGED PRICING, BY ITEM TYPE. Checked on 23/09/2026.
| Item type | Default state | Can it be turned off? | What you have to do |
|---------------------------|----------------------|-----------------------|--------------------------|
| Pass | ON for all of them, | yes, Disable Managed | nothing, IF the price in |
| | new and existing | Pricing button | your interface is read, |
| | | | not hard-coded |
| Developer product | off | - | prices read by script |
| | | | + GetUsersPriceLevelsAsync |
| | | | + Enable button |
| Subscription in Robux | ON | NO | nothing |
| Subscription in local | does not exist | - | - |
| Avatar item | see Publish to | - | - |
| | Marketplace | | |
THE LIMITS OF THE ADJUSTMENT — the regional price never goes more than 70% below
the default and NEVER rises above it. The official example:
| Default price | Floor | Ceiling |
|---------------|-------|---------|
| 100 Robux | 30 | 100 |
Which means: the regional price can only be EQUAL or LOWER. There is no risk of a
player being charged more than the value you set.
HOW THE PRICE IS CHOSEN
- by ECONOMIC LOCATION, which is NOT the same thing as the account's
location
- signals used: VPN usage, billing history, account history
- if it cannot be determined: the user sees the standard global price
- the values are updated periodically, following the economy
THE CHECK ALMOST NOBODY RUNS
The dynamic price tool puts a FAKE price in Robux, or a FAKE economic
location, on everything on sale inside the game. Whatever changes on
screen is being read from MarketplaceService; whatever does NOT change
is hard-coded -- and that is the one that lies to the player.
Route: Monetization > Passes (or Developer Products) > menu > Dynamic
Price Check. It accepts up to FIVE test accounts.


