Campaign
Campaign is a LiveOps service that enables no-code A/B testing and feature flagging. Game operators can create time-bounded campaigns that modify game behavior for targeted player segments - without deploying new code.
How It Works
A Campaign defines:
- Schedule — a
startAt/endAtwindow - Trigger — evaluated on
LOGINorREGISTRATION - Target — either
ALLplayers or a specific playerSEGMENT - Scenarios — traffic-split experiment groups (e.g. control vs. variants), each with configurable overrides
Each scenario can override Global Properties, Cash Product prices, and Item/Bundle definitions. The control scenario (code "_") always has empty overrides — it represents the baseline experience.
Players are enrolled on their first qualifying login/registration during the campaign window and are assigned to a scenario based on weighted distribution. Participation metrics (login count, time played, purchases, spend) are tracked automatically.
Scenario Weights (Traffic %)
You control traffic allocation by setting a weight (0–100) for each scenario. Weights are integers and must sum to 100.
Example — 50/25/25 split:
| Scenario | Weight | Traffic |
|---|---|---|
"_" (control — no changes) | 50 | 50% |
"A" (double coins) | 25 | 25% |
"B" (half-price sale) | 25 | 25% |
{
"campaignCode": "holiday2026",
"version": 3,
"scenarios": [
{ "scenarioCode": "_", "weight": 50 },
{ "scenarioCode": "A", "weight": 25 },
{ "scenarioCode": "B", "weight": 25 }
]
}
Validation rules:
- The control scenario
"_"must always be present - All referenced scenarios must already exist in the campaign
- Weights must sum to exactly 100
Default behavior:
- On campaign create — only
"_"exists with weight 100 (all traffic sees baseline) - When adding a new scenario — its weight starts at 0 until you redistribute via SysUpdateCampaignScenarioWeights
- When deleting a scenario — its weight is automatically reassigned to
"_"(control absorbs freed traffic)
The Control Scenario ("_")
Every campaign auto-creates a control scenario with no overrides — it is the scientific control group.
Key facts:
- Auto-created when the campaign is created — you never create it manually
- Cannot be deleted independently — you must delete the entire campaign
- Required by validation — every campaign must include
"_"with a weight - Absorbs freed weight — when a variant scenario is deleted, its traffic share rolls back to control
The control scenario is what you measure your variants against. If variant "A" drives 20% more purchases than "_", you know the change works.
API Summary
- GetMyCampaigns - Returns the list of campaigns the current player is participating in, including their assigned scenario and campaign details.
- SysTriggerCampaignForUser - Triggers a campaign scenario for a specific player, bypassing normal eligibility constraints. Player must be flagged as a tester.
- SysRemoveCampaignForUser - Removes a player's participation in a specific campaign.
- SysRemoveAllCampaignsForUser - Removes a player's participation in all campaigns.
- SysCreateCampaign - Creates a new campaign. A control scenario is automatically created alongside the campaign.
- SysReadCampaign - Reads a campaign's full configuration, optionally including the details of every scenario.
- SysUpdateCampaign - Updates some or all of a campaign's configuration fields.
- SysDeleteCampaign - Deletes a campaign along with all of its scenarios, participation records and metrics.
- SysEnableCampaign - Enables or disables a campaign without changing any other fields.
- SysGetCampaignPage - Returns a filtered, sorted page of the app's campaigns.
- SysGetCampaignPageOffset - Returns another page of campaigns using the context from a previous page request.
- SysCreateScenario - Creates a new variant scenario under a campaign.
- SysReadScenario - Reads a campaign scenario's full configuration.
- SysUpdateScenario - Updates some or all of a variant scenario's configuration fields.
- SysDeleteScenario - Deletes a variant scenario and moves its weight to the control scenario.
- SysUpdateCampaignScenarioWeights - Sets the traffic split between a campaign's scenarios.
- SysUpdateCampaignJson - Updates only the free-form
campaignJsoncustom payload on a campaign. - SysUpdateScenarioJson - Updates only the free-form
scenarioJsoncustom payload on a campaign scenario.
📄️ GetMyCampaigns
Returns the list of campaigns the current player is participating in, including their assigned scenario, campaign details, and engagement metrics.
📄️ SysCreateCampaign
Creates a new campaign. The campaign code must be unique for the app. The control scenario ("_") is created automatically alongside the campaign with a weight of 100, so all traffic sees the baseline experience until you add variant scenarios and redistribute the weights.
📄️ SysCreateScenario
Creates a new variant scenario under the specified campaign. The scenario code is assigned automatically, using the next available letter from A to Z, so a campaign can have at most 26 variant scenarios. The campaign must not have ended.
📄️ SysDeleteCampaign
Deletes a campaign, along with all of its scenarios, player participation records and collected metrics. This cannot be undone.
📄️ SysDeleteScenario
Deletes a variant scenario from a campaign, along with its player participation records and collected metrics. Any weight the scenario held is moved to the control scenario (_). The control scenario itself cannot be deleted — delete the campaign instead. The campaign must not have ended.
📄️ SysEnableCampaign
Enables or disables a campaign. Only the enabled flag is changed — all other campaign fields are left untouched. The campaign must not have ended.
📄️ SysGetCampaignPage
Returns a page of the app's campaigns, filtered and sorted using the provided context. The response includes an encoded context string that you can pass to SysGetCampaignPageOffset to fetch the pages before or after it.
📄️ SysGetCampaignPageOffset
Returns another page of campaigns, using the encoded context string returned by a previous call to SysGetCampaignPage or to this method.
📄️ SysReadCampaign
Reads a campaign by campaign code and returns the full campaign configuration. Optionally includes the full configuration of every scenario in the campaign.
📄️ SysReadScenario
Reads a campaign scenario by campaign code and scenario code, and returns the full scenario configuration.
📄️ SysRemoveAllCampaignsForUser
Removes a player's participation in all campaigns, deleting all their CampaignParticipant records and clearing the campaigns map from their profile.
📄️ SysRemoveCampaignForUser
Removes a player's participation in a specific campaign, deleting their CampaignParticipant record and removing the campaign entry from their profile.
📄️ SysTriggerCampaignForUser
Triggers a campaign scenario for a specific player, optionally bypassing normal eligibility constraints. The target player must have isTester=true on their profile. The campaign endAt is always respected.
📄️ SysUpdateCampaign
Updates an existing campaign. Only the fields present in configJson are changed — omitted fields keep their current values. The campaign must not have ended.
📄️ SysUpdateCampaignJson
Updates only the free-form campaignJson custom payload on a campaign. No other campaign field can be modified through this call — the schedule, trigger, target, scenario weights and A/B settings are all left untouched, and a concurrent edit to any of them in the Design Portal will not be overwritten.
📄️ SysUpdateCampaignScenarioWeights
Sets the traffic split between a campaign's scenarios. The list you pass replaces the current weight distribution. The campaign must not have ended.
📄️ SysUpdateScenario
Updates an existing variant scenario. Only the fields present in configJson are changed — omitted fields keep their current values. The control scenario (_) cannot be updated, and the campaign must not have ended.
📄️ SysUpdateScenarioJson
Updates only the free-form scenarioJson custom payload on a campaign scenario. No other scenario field can be modified through this call — in particular the scenario's overrides (global properties, cash product prices, item definitions) are left untouched, as is its description.