These changes are now live!

Hey Developers,

Last September, we mentioned an upcoming change to Game Passes.

Since then, we have made changes to how the game passes will work. Please use the following announcement as reference for the most up to date information.

This change will not break existing games or require changes to game passes that currently exist, but you will need to follow the recommendations below for the game passes created after the new changes are live.

Here is a tutorial we have updated with further technical details about the change: https://wiki.roblox.com/index.php?title=Game_Passes_–_Abilities_and_Bonuses

Here is a summary of the change:

Like Badges, we wanted to restructure how we store these objects, both to let our systems scale well, but also to make sure that they are structured cleanly. From now on, game passes will not be assets, but will be their own unique entities. This means that they will use their own separate ID system from other Roblox objects (such as badges or assets). Game passes will now have game pass ID that will be used to identify them. Any game pass made before this change will still have an asset ID, but they will also be automatically assigned a game pass ID. New game passes will only have a game pass ID.

You can get the game pass ID the same way you would have gotten the asset ID before these changes. Go to the page of the game pass (one of the easiest ways is to click on the pass’s image in the store on your Game’s page) and check the URL.

In the old asset system, the URL would look something like:

Here is an example of how the URL will look in the new system:

Once the change is live, to get the game pass ID from an existing asset ID, go to www.roblox.com/library/{assetId}/view . You will be redirected to www.roblox.com/game-pass/{gamePassId}/view . You can then copy the game pass ID from the URL.

This change means that you will need to use the correct Lua APIs (as outlined below) when working on new development projects with game passes. MarketplaceService.UserOwnsGamePassAsync should be used to see if a player has a particular pass. Additionally, MarketplaceService now has specific functions for game passes, both to prompt for the purchase and to handle the purchase events.

Note that these changes will not break existing games. The old functions will continue to work for old game passes, but you will start seeing warnings in the output asking you to switch over. If you are creating any new game passes, the old methods like PromptPurchase and PromptPurchaseFinished will not work.

This function takes a user ID and the game pass ID as parameters (remember, the game pass ID, not the old asset ID) and returns if the player owns the game pass or not. Note that this function makes a web call under the hood so the best practice is to wrap this function in a pcall . Make sure you use this function and not MarketplaceService:PlayerOwnsAsset .

This function takes a player object and the game pass ID as parameters and it will create a dialog prompting the user to purchase the pass. Make sure to use this function and not MarketplaceService:PromptPurchase .

This event fires when a player finishes interacting with a game pass purchase prompt. The event will pass the player, the game pass ID, and whether or not the player purchased the pass to the connected function. Make sure to use this function and not MarketplaceService.PromptPurchaseFinished .

This can be used for game passes if InfoType is changed to Enum.InfoType.GamePass .

Check out the Developer Portal for more information:

Please let us know if you have any questions about this new system.

Thanks,

Developer Relations Team