With Managed Pricing, you can offer region-specific prices for your items and build a more inclusive and accessible global economy. After you determine a default global price for an item, Roblox uses a variety of signals like the region's purchasing power, currency exchange rates, and local spending behavior to set the most appropriate price for that item region by region.
You can choose which of your items you want to price regionally. When you enable Managed Pricing for an item in your game, Roblox automatically adjusts the price of that item for users based on their economic location.
Economic location is not always the same as account location. To determine a user's economic location, Roblox looks at signals, including VPN usage, billing history, and account history. If their economic location can't be determined, users see the default global price for the item instead.
To prevent price arbitrage when users gift or trade items with different managed prices, you can manage in-game transfers with the GetUsersPriceLevelsAsync API.
Enable regional pricing
For passes
Regional pricing is enabled by default for all new and existing passes through Managed pricing.
To disable managed pricing for a pass:
For developer products
To enable managed pricing for a developer product:
For subscriptions
Managed pricing is enabled by default for subscriptions priced in Robux and cannot be turned off. For more information, see Create subscriptions.
Managed pricing isn't available for subscriptions priced in local currency.
For Avatar items
To enable Managed Pricing for an Avatar item, see Pricing in the Publish to Marketplace page.
Check for dynamic pricing
When you enable Managed Pricing, the price of the item adjusts for users in different regions whether it's for sale inside or outside of your game. However, if you have hard-coded the price into your game's UI, that number does not update as it's not dynamic or accessible by Roblox. As a result, users are charged the correct region-specific price but the UI still shows them the hard-coded value.
The dynamic price check tool updates all items for sale inside your game with a fake Robux price or a fake economic location to help you identify which prices are hard-coded in your game's UI and which are dynamically-scripted with MarketplaceService and called from a client script. After you have identified the hard-coded passes, you can update them to use MarketplaceService functions.
To use the dynamic price check tool:
To disable the dynamic price check tool, go to the Dynamic Price Check page and click Disable.
For more information about hard-coded versus dynamically-scripted product prices, see Check for dynamic pricing in the Price optimization page. For more information about selling passes and developer products with MarketplaceService functions, see Sell a pass inside your game and Sell a developer product inside your game.
Display regional prices in your game
With Managed Pricing, the price a user sees can vary based on their location. If you display prices in a custom in-game UI, like a TextLabel, you can retrieve product information at runtime to make sure the displayed price matches the price shown in the purchase prompt.
To display the regional price for a single developer product or pass, use GetProductInfoAsync.
To display the regional price for all developer products, use GetDeveloperProductsAsync.
Protect your trades and gifts
Managed pricing can affect in-game transfers like trading and gifting. Because of price differences across regions, price arbitrage (exploiting price discrepancies between the same products to generate a profit) can take place. To manage the potential for price arbitrage, you can use the GetUsersPriceLevelsAsync API, which lets you determine the relative price levels of users so that you can implement logic to regulate item transfers based on these levels.
GetUsersPriceLevelsAsync provides a numerical value between 1 and 1000 that indicates a user's pricing level. This value is designed to represent the percentage of the full price a user is expected to pay. The price level 1000 represents the full global price, while lower price levels indicate that the user typically pays a lower price because of their economic location.
A lower price level difference means that there's a smaller price difference between the full global price and the user's managed price. A higher price level difference means that there's a larger price difference between the two. For example:
Implement GetUsersPriceLevelsAsync
To get the price levels of users involved in an item transfer, call the GetUsersPriceLevelsAsync function in the MarketplaceService. This function takes an array of user IDs as its argument, and returns an array of PriceLevelInfo objects with the following fields:
After implementing the function, use the returned price levels to choose whether you want to allow an item transfer to take place. For example, you can let users with a higher price level gift items to users with a lower price level, but only allow trading between users that have the same price level as each other. See the available examples for more information.
For more information about the GetUsersPriceLevelsAsync API, see MarketplaceService.
Examples
Examples of how you can use GetUsersPriceLevelsAsync with regional pricing.
Example 1: Check the price levels for a list of users
This example shows you how to retrieve price levels for a list of users, which can help you choose whether you want to allow an item transfer to take place.
Example 2: Compare a sender's price level to a recipient's price level
This example shows you a sample implementation of how to check a sender's price level against the recipient's price level. This can help you manage gifting from users in higher-priced regions to users in lower-priced regions.
Example 3: Check if two users have the same price level
This example shows you a sample implementation of how to check if two users have the same price level. This can help you manage trading and ensure a fair exchange between users from different regions.