Implementing trials for your game
You can configure several different types of free trials for your game:
- Time-limited free trials - These trials expire after a certain amount of calendar time has passed (for example, seven days after the user downloads the trial, regardless of how long they use it).
- Usage-limited free trials - Allows configuration to let the user run the game for a certain amount of game runtime, then requires that the user purchase the game to continue using it.
- Curated trials - These trial have no expiry or game runtime limits, but the game can limit what is playable. This is similar to a demo, but the whole game is still required to be downloaded.
Note
Time- and Usage-based trials are intended to be offered once per title per user and must not be mixed with other trial offers. Expired or exhausted trial entitlements stay on the user account and will prevent acquisition of any additional trial offers for the same game. Trial type cannot be altered or reset once a trial is acquired by a customer.
Note
Some trials are free but are limited to users who own specific subscriptions. This topic applies to those trials as well.
Note
Games running as part of Free Play Days offers are not running as actual trials, but can be launched only by temporary full licenses. Trial configuration and related structures do not apply.
Configuring a usage-limited trial in Partner Center
Note
You can access this feature only if you have the proper permissions and if your game uses restrictive licensing. For details, contact your Microsoft account manager.
You can configure usage-limited free trials in Partner Center without altering the game's code. However, you have to add code in the following scenarios:
- You want to restrict access to users who acquired the trial
- You want to save the game state between play sessions; the save carries over if the game is purchased with the same Microsoft account as the one that was used to acquire the trial
From the Submission overview page, go to the Pricing and availability page.
Under Free trial, open the drop-down menu, and then select Usage-limited.
In the second drop-down menu that appears, select the maximum time that users can use your app.
Select Save.
After you publish your game to Microsoft Store, you'll see the trial information on the game's product page.
Restrict access to users who have acquired the trial
In some cases, you might want to let only trial owners run the game.
This will be important especially for a usage-limited trial as you don't want someone else to run down the trial time for your account.
You can implement this functionality by checking the XStoreGameLicense.isTrialOwnedByThisUser
property.
If it's false
, block the current player from proceeding or at least informing them they should obtain their own trial.
The user that owns the active trial license is displayed on a message when the trial game is launched:
The following code example shows how to do check isTrialOwnedByThisUser
.
void CALLBACK GameLicenseTrialCheck(XAsyncBlock* asyncBlock)
{
XStoreGameLicense result{};
HRESULT hr = XStoreQueryGameLicenseResult(
asyncBlock,
&result);
// Is this a trial?
if (result.isActive && result.isTrial)
{
// Is this trial owned by this user?
if (!result.isTrialOwnedByThisUser)
{
// The user can't use another user's trial time. Show an error message.
}
}
}
void QueryGameLicense(XStoreContextHandle storeContextHandle, XTaskQueueHandle taskQueueHandle)
{
auto async = new XAsyncBlock{};
asyncBlock->queue = m_asyncQueue;
asyncBlock->callback = GameLicenseTrialCheck;
HRESULT hr = XStoreQueryGameLicenseAsync(
storeContextHandle,
async);
}
Save the game state for the original trial user
Xbox services-enabled games that have single player campaigns or other game modes tracking progress between sessions will use connected storage to save the game state. With a limited trial, however, a PC user can create multiple Microsoft accounts and keep playing beyond the time limit while saving progress (by using the same Xbox account). For more information on this PC scenario see Handling mismatched store account scenarios on PC.
This can be prevented by saving the XStoreGameLicense.trialUniqueId
value when the game progress is saved.
Subsequently, when the user starts playing the trial again, you can check whether the trialUniqueId
value matches the one from the first run.
This code assumes the game saves the trialUniqueId
as part of the game save, and has a GetSavedTrialUniqueId
function that returns this value.
void CALLBACK GameLicenseTrialCheck(XAsyncBlock* asyncBlock)
{
XStoreGameLicense result{};
HRESULT hr = XStoreQueryGameLicenseResult(
asyncBlock,
&result);
// Is this a trial?
if (result.isActive && result.isTrial)
{
// Is this trial owned by this user?
if (!result.isTrialOwnedByThisUser)
{
// The user can't use another user's trial time. Show an error message.
}
else
{
// Read the trialUniqueId that was saved with the game on the first run.
char trialUniqueId = GetSavedTrialUniqueId();
if (trialUniqueId != result.trialUniqueId)
{
// Because the IDs don't match, start the game from the beginning.
}
}
}
}
Testing trials in development
In order to test your game with a trial license, the game must first be configured with a trial license in Partner Center.
Xbox
For local builds, this is one of the scenarios that require the build to be licensable with a real license. For loose and packaged builds, this requires applying content ID and EKBID overrides in MicrosoftGameConfig. See Enabling license testing for more details.
Note the actual EKBID from a trial build must be used here. To get this you need to download the game build from the Microsoft Store with an account that has a trial license.
Once this is configured, launching with a test account that has acquired the trial license from the store, XStoreGameLicense
will exhibit accurate trial attributes.
Launching the build should display the trial notification as shown above.
PC
This will be the same as how to enable builds with a full license—use the correct app identity in MicrosoftGame.config and ensure the proper content ID in the registry location, and the build will respect the license for the signed in account of the Microsoft Store app, trial or otherwise.