Analytics Buckets
Chunk #0
#
**Introduction**
This user guide describes what analytics buckets are and how ad events are stored in the buckets for various Ad configuration settings, such as Max Interstitial Ad Units, Max Rewarded Videos Ad Units, Impressions Restrictions, and Ad slots configurations.
* * *
# **What Analytics Buckets Represent**
**Analytics Bucket** are logical divisions of events (e.g., ad requests) stored by the Game Server.
Each bucket stores **up to the 50 most recent CPM values** that meet specific criteria (e.g., successful or failed ad requests).
Please see the following image to understand how CPM values are stored in **each bucket**. See the [Available Analytics Buckets](https://tripledotstudios.atlassian.net/wiki/spaces/KB/pages/4317282308/Analytics+Buckets#Available-Analytics-Buckets) section below to find out the number of buckets currently available for storing CPM events.
 
**When do the CPM Values expire?**
- If the player hasn’t been active in a **14** day period, all the CPM values will be cleared, as they will be considered a churned player.
- If a player comes back after **14** days, Game Server will start collecting new CPM values for the player from scratch and apply the formulas accordingly.
- All CPM values older than **30** days will be cleared (regardless of when the user has been active the last time). When this is done, the size of the list for the player will simply go down to contain only the CPM values that are less than 30 days old.
# Available Analytics Buckets
Different Analytics Buckets are available for different settings. In total ten (10) buckets are available but only a few or a combination of few buckets are used for each setting pertaining to CPM calculations.
**Analytics Buckets for Interstitials (5 in number)**
- Max Analytics Buckets: 3 in number (0,1, and 2)
- Meta Analytics Bucket: 1
- Google Analytics Bucket: 1
**Analytics Buckets for Rewarded Videos (5 in number)**
- Max Analytics Buckets: 3 in number (0,1, and 2)
- Meta Analytics Bucket: 1
- Google Analytics Bucket: 1
Refer to the [Setting up CPM Floor](/wiki/spaces/KB/pages/4304109569/Setting+up+Ad+Units#Setting-the-CPM-Floor) section to know more about how CPM values are calculated.
CPM calculations are configured for the following Ad configurations settings:
- Max Interstitials Ad Units
- Max Rewarded Videos Ad Units
- Impressions Restrictions
- Ad Slots
## **Event Bucket Assignment**
- The Game Server receives a list of ad events from the client.
- These events are then evaluated against certain parameters to determine whether they should be stored and, if so, which bucket they should go into.
- If an event doesn’t meet the criteria, it is ignored.
**Event Buckets for Max Interstitials Ad Units**

**Event Buckets for Max Rewarded Videos Ad Units**

## **Key Parameters Used to Route Events**
A decision is made for each event using the following metadata:
- **Event name** (e.g., Ad\_Request\_Success\_Interstitial)
- **Mediation platform** (e.g., Max, google, Meta)
- **Network** (used only for Max, e.g., exclude: facebook)
- **Error code** (used only for Max for failed requests coded 1009, 1001. All failed requests are stored with all other error codes EXCEPT code 1009 and 1001 )
- **Ad unit tag** (used only for Max. 0, 1, 2 : routes events to MAX bucket 0/1/2)
* * *
## **Event Bucket Details**
| **Bucket Name** | **Applicable Ad Type** | **Mediation** | **Accepted Event Types** | **Conditions** | **Stored Data** |
| --- | --- | --- | --- | --- | --- |
| **MAX Event Buckets (0, 1, 2)** | Interstitial | max | Ad\_Request\_Success\_Interstitial Ad\_Request\_FailedToLoad\_Interstitial | adunit\_tag = 0 Bucket 0 adunit\_tag=:Bucket 1 adunit\_tag = 2 or missing: Bucket 2 network ≠ facebook | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
| **Google Interstitial Event Bucket** | Interstitial | google / google\_postbid | Ad\_Impression\_Interstitial | Event name = Ad\_Impression\_Interstitial mediation = google or google\_postbid | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
| **Meta Interstitial Event Bucket** | Interstitial | meta | Ad\_Impression\_Interstitial | Event name = Ad\_Impression\_Interstitial mediation = meta | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
| **MAX Rewarded Video Bucket (0,1,2)** | Rewarded Video | max | Ad\_Call\_Success\_Rewarded Ad\_Request\_FailedToLoad\_Rewarded | adunit\_tag = 0 Bucket 0 adunit\_tag=:Bucket 1 adunit\_tag = 2 or missing: Bucket 2 network ≠ facebook | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
| **Google Rewarded Video Bucket** | Rewarded Video | google / google\_postbid | Ad\_Impression\_Rewarded | Event name = Ad\_Impression\_Rewarded mediation = google or google\_postbid | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
| **Meta Rewarded Video Bucket** | Rewarded Video | meta | Ad\_Impression\_Rewarded | Event name = Ad\_Impression\_Rewarded mediation = meta | CPM = revenue × 1000 Timestamp (date and time) is\_fb flag |
* * *
## **Examples**
**Example 1:**
json
`{ "name": "Ad_Request_Success_Interstitial", "mediation": "max", "network": "AppLovin", "adunit_tag": 0 } `
Routed to: **MAX Bucket 0**
* * *
**Example 2:**
json
`{ "name": "Ad_Request_FailedToLoad_Interstitial", "mediation": "max", "network": "Facebook" } `
**Not stored** : network is excluded (Facebook).
* * *
**Example 3:**
json
`{ "name": "Ad_Impression_Interstitial", "mediation": "google" } `
Routed to: **Google Interstitial Bucket**
* * *
## Example for how Buckets are Used for Max Interstitial Ad Units
The Max Interstitial Ad Units setting can be configured on the configurations page.
1. Navigate to the **Configurations** page and open the **Interstitials** tab.
2. Enable the **Max Interstitials Ad Units** setting.
3. Add ad unit and input the following data:

The Edit Ad Unit ID config appears. The selected bucket determines the value of the adunit\_tag key included in events sent from the ad unit to the Game Server. For MAX-mediated events, this tag defines which storage bucket the event should be placed into.
When formula-based CPM floor calculation is enabled, the MAX bucket associated with this tag will be used as the source of CPM values.

For this example, let us assume that the following buckets have the listed number of events:
- MAX Interstitial Event bucket 0: 3 Events
- MAX Interstitial Event bucket 1: 3 Events
MAX Interstitial Event bucket 2: 3 Events
- Google Interstitial Event Bucket: Not applicable for this event setting
- Meta Interstitial Event Bucket: Not applicable for this event setting
The calculation **uses only MAX Bucket 0** (as per the selected config).
**Source Events from Bucket 0**
Events stored in Bucket 0:
- Event 1: CPM = 6
- Event 2: CPM = 5
- Event 3: CPM = 5
**Formula Configuration Rules**
Two key formula parameters:
- **Minimum Ad Requests to Apply Formula = 3**
- **Ad Requests to Use in Formula = 4**
**CPM Calculation**
- Average the CPMs of the last 3 events:
- Multiply by percentage coefficient (set to 1.1):
Final CPM floor sent to client = 5.87

The same logic applies to **MAX Rewarded Video Ad units** , using **Rewarded Video (RV) events** stored in the corresponding **RV event buckets**. The calculation follows the same formula-based behaviour as with interstitial events.
Analytics Buckets
Chunk #1
Example for how Buckets are Used for Impressions Restrictions Setting
The Impressions Restrictions setting can be configured on the configurations page.
1. Navigate to the Configurations page and open the Interstitials tab.
2. Enable the Impressions Restrictions setting.
3. Add a unit and input the following data:
 
**Source Buckets Used: Events from all buckets are used for this setting.**
- MAX Interstitial Buckets: 0, 1, and 2
- Google Interstitial Event Bucket
- Meta Interstitial Event Bucket
- All buckets contribute CPM data
- Events are sorted by timestamp
**Combining and Sorting Events**
All events from the buckets are:
- Merged into a single list
- Sorted chronologically by timestamp
This ensures that only the most recent events are used for formula application.
**Formula Parameters**
- **Min Ad Requests to Apply Formula = 3**
- **Ad Requests to Use in Formula = 4**
Selected CPMs (from latest 4 events): 5, 5, 6, 6
**Calculation Logic**
Formula:
CPM floor=(45+5+6+6)×1.1=422×1.1=5.5×1.1=6.06
**Final CPM Floor Sent = 6.06**
This setting is currently not available for Rewarded videos
* * *
## Example for how Buckets are Used for Ad Slots
The Ad slots setting can be configured on the Ads page.
1. Navigate to the Ad Slots page.
2. Add a unit and input the following data:

The Ad unit mediation here is Max and the specified Max Analytics Bucket for this example is: 0. You can jump to the configuration through the link besides the selected Max ID.
 
**Source Buckets Used:** This setting uses events from one MAX bucket + Google bucket + Meta bucket
- MAX Interstitial Buckets: 0, 1, or 2
- Google Interstitial Event Bucket
- Meta Interstitial Event Bucket
- 1 bucket for Max, 1 bucket for Google and 1 bucket for Meta contribute CPM data
- Events are sorted by timestamp
**Combining and Sorting Events**
All events from the buckets are:
- Merged into a single list
- Sorted chronologically by timestamp
This ensures that only the most recent events are used for formula application.
**Formula Parameters**
- **Min Ad Requests to Apply Formula = 3**
- **Ad Requests to Use in Formula = 4**
Selected CPMs (from latest 4 events): 5, 6, 5, 5
**Calculation Logic**
Formula:
CPM floor=(5+5+5+6)/4×1.1=5.775
**Final CPM Floor Sent = 5.775**
The same logic applies to **Ad slots** , using **Rewarded Video (RV) events** stored in the corresponding **RV event buckets**. The calculation follows the same formula-based behaviour as with interstitial events.
* * *
## **Managing Multiple Ad Units and Buckets for CPM Floor Calculation**
This section explains how to configure **multiple Ad Units and Ad Slots** , and how CPM floors are calculated using **event buckets** from MAX, Google, and Meta networks. It covers logic for bucket assignment, fallback flows, formula use, and nesting within Ad Slot Banks.
### **Multiple Ad Units per Configuration**
You can assign **multiple Ad Units** to the following settings:
- MAX Interstitial Ad Units
- MAX Rewarded Video Ad Units
- Ad Slots (Interstitials)
- Ad Slots (Rewarded Videos)
Each Ad Unit is configured independently and can have:
- Its own **CPM floor**
- Its own **MAX analytic bucket**
- Its own **formula calculation logic**
**Note:** Google and Meta events are always considered for CPM calculation for Ad Slots (both Interstitials and Rewarded Videos) and are **not limited by the MAX bucket selection**.
### **Bucket Assignment and CPM Storage for Max Interstitials and Rewarded Videos Ad Unit Setting**
- Each Ad Unit's events are sent only to the **MAX buckets specified** in the MAX Analytic Buckets setting.
- Example:
**CPM Floor Options per Ad Unit**
Each Ad Unit can define its CPM floor using one of the following methods:
**a. Static Value (Fallback CPM)**
- A fixed floor value you set manually.
**b. Percentile-Based CPM Floor**
- Uses historical CPM data stored on the Game Server (GS).
- Requires Use Percentile enabled.
**c. Formula-Based Calculation**
- Averages or Median CPMs from recent events across selected buckets.
- Uses defined event count and coefficient rules.
- Pulls data from:
**Only 1 bucket is used for formula calculation: The selected MAX bucket**
**Event collection must be explicitly enabled for each game; it is not enabled by default.**
### **Ad Slot Structure and Behaviour**
**Multiple Ad Units per Ad Slot**
- Ad Units are initiated **in order** (sequential fallback).
- If an ad is not filled (no Ad is uploaded), the system proceeds to the **next Ad Unit**.
- Once all Ad Units are tried, the client **restarts from the first**.
- This loop continues until:
- Each Ad Unit can have its own request limit. For example:
**Multiple Ad Slots in Ad Slot Banks**
- A single **Ad Slot Bank** can contain **multiple Ad Slots**.
- Each Ad Slot has its own **independent list of Ad Units**.
- Ad Slot Bank is selected in the **Ads Config** section.
- **Each Ad Slot** can:
**Nested Ad Slots**
- **Nesting is supported up to 4 levels**.
- Each Ad Slot can have **only one child**.
- Example:
- If Ad Slot 1 serves an ad, the next request will try Ad Slot 1.1.
- At the top level, **up to 10 Ad Slots** can run **in parallel**.
- **Ad Unit ID configs must be unique** within a single Ad Slot Bank.
**CPM Floor Options per Ad Unit in each Ad slot**
Each Ad Unit can define its CPM floor using one of the following methods:
**a. Static Value (Fallback CPM)**
- A fixed floor value you set manually.
**b. Percentile-Based CPM Floor**
- Uses historical CPM data stored on the Game Server (GS).
- Requires Use Percentile enabled.
**c. Formula-Based Calculation**
- Averages or median CPMs from recent events across selected buckets.
- Uses defined event count and coefficient rules.
- Pulls data from:
**3 buckets are used for formula calculation: The selected MAX bucket+ 1 Google bucket +1 Meta bucket**
**Impression Restriction Behaviour**
The **Impression Restriction** setting relies on events across all buckets. (All five buckets that is 3 Max buckets + 1 Google bucket +1 Meta bucket)
However, **some buckets may be empty** if:
1. Ad Units are configured to send events only to specific buckets (e.g., Bucket 1 and 2, not 0).
2. The system has just started and hasn’t collected events yet.
Buckets without events are **ignored** during restriction logic.
Only buckets containing **valid CPM events** are used in the calculation.
**Summary**
| **Feature** | **Behaviour** |
| Ad Units per Slot | Sequential fallback |
| CPM Floor Options | Static, Percentile, Formula |
| Buckets Used | MAX (selected), Google, Meta |
| Unique Constraint | Ad Unit IDs must be unique within a Bank |
| Nesting Limit | 4 levels max |
To learn more about Ad Configuration , CPM Calculation, and Analytics Buckets, refer to this Miro board: link: [https://miro.com/app/board/uXjVJY-ADCU=/](https://miro.com/app/board/uXjVJY-ADCU=/) Password: Ad\_Config\_Miro
CPM Percentile Configuration
Chunk #0
# Introduction
A new feature has been introduced to support CPM floor configurations. This feature allows setting CPM floor values based on CPM percentiles. For example, the 80th percentile represents the CPM value below which 80% of impressions fall. Floors can be configured per country or per platform, cohort, and other parameters for the configuration.
* * *
## **New CPM Percentile Configuration Section**
- A new sub-section, **CPM Percentiles** has been added under the Ads menu in the left sidebar.
Navigate to **Ads \> CPM Percentiles \> Interstitials** , and select the  **[green + sign]** to create a new entity.
### **List View and Available Filters**
All the regular filters are available for CPM Percentile configurations.

### **Standard Fields for New/Edit View**

#### **Fields Descriptions**
| **Name** | **Validations** | **Description** |
| --- | --- | --- |
| Name | - Default: Blank - Type: String - **Mandatory** : Yes | Specify the Name for the configuration |
| Priority | - Default: Blank - Type: Integer - **Mandatory** : Yes | Specify the priority of the configuration |
| Label | - Default: Blank - Type: Single-select dropdown - **Mandatory** : No | Select the relevant label from the available options. |
| Platform | - Default: None - Type: Single-select dropdown - Options: None, iOS, Android - **Mandatory** : Yes | **Usage** : Determines the platform used to retrieve CPM values from storage |
| CPM source country | - Default: None - Single-select dropdown - Options: - **Mandatory** : Yes | **Usage:** Defines base country to fetch CPM floor from storage |
| Additional countries to apply CPM | - Default: None - Two fields: - **Mandatory** : Yes | 1. Operator: Use this to define how the selected countries in the second field should be treated in the rule logic. Options: None, IN, NOT IN) 2. List of all countries excluding those already available for selection in the “CPM Source Country” field Choose one or more countries to which the CPM percentile setting should also apply (if using IN) or exclude (if using NOT IN). For the countries selected in this field, CPMs will be taken from country selected in “CPM source country” field |
| Cohort Day | - Default: Blank - Single select dropdown these options: - **Mandatory** : Yes | Selected Cohort range is used to define which cohort day should be used to find required CPM value from the storage. |
| Percentile | - Default: Blank - Single select dropdown with these options: - **Mandatory** : Yes | Selected Percentile value is used to define which Percentile value should be used to find required CPM value from the storage. |
* * *
## Static CPM Configuration for MAX Interstitial Ad Unit
The Static CPM Configuration section allows you to control the behaviour of CPM floor values based on either static settings or percentile-based logic. This section is visible when configuring MAX Interstitial Ad Units, and applies to all Bidding CPM Floor Types.
### Overview of Changes
- Static floor CPM is renamed to Fallback CPM value.
- A new configuration section, Static CPM Configuration, is introduced when the CPM floor type is set to either Static or Formula.
## How CPM Floor Values Are Determined
### When “Use Percentile” Is Enabled
If you enable the “Use Percentile” option, CPM floor values are dynamically selected based on percentile configurations. Here’s how it works:
1. Percentiles are available for Ad Slots for Interstitials / Rewarded Videos and MAX interstitials / Rewarded videos Ad Units.
2. The system identifies matching CPM percentile configurations using:
3. If multiple configurations match, the system selects the one with the highest priority.
4. The CPM value is retrieved from a backend storage system.
5. The retrieved value is sent to the client.
* * *
## Fallback Behaviour
Fallback settings ensure that a CPM floor is still sent even if a percentile-based value cannot be determined.
**Scenario 1: No Matching Configuration Found**
If no percentile config matches the user that is the user does not match to any of selected percentile config by the following parameters: **Platform, CPM Source Country, Additional Countries to apply CPM, or Cohort Day:**
- The system refers to the setting: If no matching configuration.
**Scenario 2: No Percentile Data Available**
If percentile data is unavailable (e.g., backend storage is inaccessible or lacks data):
- The system refers to the setting: If no percentile available.
* * *
### When “Use Percentile” Is Disabled
If “Use Percentile” is disabled, the system does not apply any percentile logic. Instead, the existing CPM logic is used based on either:
- A static CPM value, or
- A formula defined in the configuration.
### New Fields in Static CPM Configuration

| **Name** | **Validations** | **Description** |
| Fallback CPM Value | - Default: Empty - Type: float - Mandatory | Specify a fallback floor value to be sent to Max for interstitial bidding. |
| Use Percentile | - Default: False - Type: Boolean - Mandatory if enabled | Enable to use percentile for CPM floor value. |
| CPM Percentile Configs | - Default: Blank - Multi-select Dropdown - Options: List of available configs - Mandatory if Use Percentiles is enabled | Select the relevant config from the dropdown. |
| If No Matching Configuration | - Default: Return Fallback value - Type: Dropdown - Options: Return fallback value, Return nothing - Mandatory if Use Percentiles is enabled | Select the relevant option if no matching config is available. |
| If No Percentile Available | - Default: Return Fallback value - Type: Dropdown - Options: Return fallback value, Return nothing - Mandatory if Use Percentiles is enabled | Select the relevant option if no percentile is available. |

* * *
### Usage of Percentile Config in both Static and Formula Floor Types
The Percentile configuration is designed to work with both Static and Formula CPM floor types.
**Static Floor Type + (Use Percentile = true)**
When the floor type is set to **Static** and the **Use Percentile** option is enabled:
- The system ignores the fallback static CPM and instead follows the percentile-based logic:
**Formula Floor Type + (Use Percentile = true)**
When the floor type is **Formula** , the behaviour depends on the fallback policy defined in the formula configuration:
- **If “If insufficient ad requests” = “Return Fallback Value”** :
- **If “If insufficient ad requests” = “Return nothing”** :
* * *
## Ad Slots Config Changes
### Configuring Static CPM Floors in Ad Slots
When configuring ad slots, a Static CPM Configuration section is displayed based on your selected CPM floor type.
**When Static CPM Configuration Appears**
This section is shown if:
- CPM Floor Type is set to Static or Formula, or
- CPM Floor Type is Waterfall and Level Type is Fixed
**Key Changes and Fields**
- Static floor CPM has been renamed to Fallback CPM value.
- The configuration section includes the following fields:
The behaviour of these fields is described [here](https://tripledotstudios.atlassian.net/wiki/spaces/KB/pages/4244537368/CPM+Percentile+Configuration#New-Fields-in-Static-CPM-Configuration).

* * *
### **Behaviour in Waterfall CPM Floor Type with Level Type as Multiplier**
- Static CPM configuration is not shown
- Existing multiplier logic remains unchanged
- User can still enter a CPM floor, but percentile logic is not applicable
* * *
## **Summary of Logic**
- Static CPM configuration appears for:
- Percentile logic and fallback behaviour applies consistently across all applicable types
- If Waterfall → Type = Multiplier, only multiplier logic is used (no percentile support)
* * *
Chapters and Levels
Chunk #0
**Introduction**
Chapters are a way to organise levels used by some games. In this guide you’ll learn how to:
- Set up Layout Banks
- Creating related configurations
- Creating Chapter Sets with they layout banks and the configurations
The configuration varies based on the game, so click on your specific game to view all the relevant details.
- [Triple Tile](/wiki/spaces/KB/pages/2851635278/Tiles+Family+Games+-+Levels+Chapters)
- [Block Family](#)
Setting up A/B Experiments
Chunk #4
Adding Game Settings to your A/B Experiment
Once you have created your A/B Experiment, it’s time to add the entities that will be tested. To do so, follow these steps:
1. Navigate to Game Settings, and click **[Base Config].**
2. Search for the fields you’d like to test and click **[Add to Experiment].** On the dropdown, select your experiment.

3. Navigate to your experiment and open it. You’ll be now able to see your added experiment entities.

4. Under **Variants** , edit the values of the entities in each variant according to your experiment settings.

5. When you’re done, click the blue **[Save]** button. When users start joining your experiment, a **participation** will be created.
### Duplicating Variants
Once your experiment has been created, you can duplicate their variants by using the **[duplicate button]** available in any variant. When you click it, a new pop-up will appear with the name of the variant you’re duplicating appended with _\_copy,_ which you can edit. The weight of the variant will be automatically set to zero, but you can also edit this according to the data required in your experiment.
.gif?version=1&modificationDate=1708523343712&cacheVersion=1&api=v2&width=694&height=536)
### Deleting Variants
Variants can also be removed if required. To do so, use the **[red trash can button]** available in all variants.

However, keep in mind that variants can be deleted only if:
- There are no participants in it
- The status of the experiment is inactive
If your variant does not comply with these 2 conditions, you will not be able to remove any variant, and the delete button will be inactive.
## Variant Rules
Inside Variants, you can add rules for specific variant, which will help you creating flows for each variant and test how the same users behave depending on different rules settings inside the variant.
### Creating a new Variant Rule
- Inside your A/B Experiment, navigate to **Variants**. Click on the dropdown to select your rule and then, click **[Change Rule]**. You can add multiple values in your rules.
- Under your variants, the entities being tested will appear with the rules you’ve applied. You can edit the values for each variant individually.
**Variants Notes**
- If an experiment is no longer needed, you can archive experiments even if they are used in Experiment Variant Rules. To do so, change the status to the experiment to “Archived”. If the experiment is being used as an Experiment Variant Rule anywhere, Game Server will notify you of which experiment uses it as a Variant Rule and which variant uses it. Click **[Confirm]** to proceed with experiment archival.

- A detailed explanation of the rules available can be found [here](https://tripledotstudios.atlassian.net/wiki/spaces/KB/pages/2668494860/Rules#List-of-Available-Rules).
- All variant rules are duplicated when A/B experiments are duplicated.
- Variant rules can be added to old experiments.
- Variant rules are calculated using all experiments (active/inactive/allocation paused)
- To check if your experiment is being used as a Variant, use the  button. A new pop-up will appear where you’ll be able to visualise the usage. You can also archive your experiment using the [**Archive button**]  .

## Experiments Participation
An experiment **participation i** s created when a player sends an `/init` call and Game Server defines some A/B experiment that user match.
After the `/init` call, Game Server decides which value to set for some entity/property by:
- Finding the entity that matches the rules with highest priority (relevant for whole entities, ex. Progression events)
- Checking if the entities are included into an A/B experiment
- Determining and setting the values from the A/B experiment with highest priority
**What else do you need to know about participations?**
- A participation is created when user send `/init` call and joins the experiment
- Participations **are not deleted** when user stop matching the experiment rules
- Participations are deleted only when the experiment is moved to “Permanently Archived” status
## Analysing your A/B Experiments
There are 3 options to analyse your experiments available in Game Server. 2 buttons are available with different functionalities:
- **Analyse LAB** **:** This button redirects you **Looker AB Test Analysis Tool** , where you can analyse the results of the experiment. For further info, find the user guide [here](/wiki/spaces/DS/pages/2833088688/LAB+User+Guide).
- **Analyse Cohort** **:** This button will create a new dashboard in **Looker Lab Cohort** and redirect you to it. For further info, find the user guide [here](/wiki/spaces/DS/pages/2941616208/LAB+Cohort+User+Guide).
- **Analyse LAB Lite** : This button will create a new dashboard in **Looker Lab Lite** , and redirect you to it.
Buttons are available in the A/B Experiments Dashboard by clicking the 3 vertical dots  , and in every experiment.


* * *
Tiles Family Games - Levels & Chapters
Chunk #0
**Introduction**
In this guide you’ll learn how to:
- Set up Layout Banks
- Create related configurations
- Create Chapter Sets and activate them in Game Settings
**Table of Contents**
**Triple Tile User Guide:**
[https://tripledotstudios.atlassian.net/wiki/x/WAAotg](https://tripledotstudios.atlassian.net/wiki/x/WAAotg)
* * *
## Setting up Layout Banks
Some parts of this process are done via API. Please read the instructions below before getting started:
### Prerequisites
**User Token**
In order create Chapters and Levels, please make sure you have access to [](https://tripledotstudios.postman.co/workspace/Tripledot-Studios~27e83636-a522-451e-8a35-a9e93f6ebe81/request/11806556-08c0fd26-7d35-4058-b39c-1e60ecde67a0) or [Level Editor](/wiki/spaces/TRIP/pages/2779349212/Level+Editor+Overview) (UI tool).
To use the API or configure levels using Level Editor, you’ll require a user token generated from Game Server. Read the instructions below to generate one.
**Editor Privileges**
You will also require Editor Privileges in order to create or edit levels. To obtain Editor privileges, follow the next steps:
- Navigate to **Levels & Chapters** , and select **Layout Banks**
- Click **[View]** next to your layout bank
- Add your username/email to **Users** and save the changes
Generating a User Token
1. In Game Server, navigate to your profile
2. Click **[Generate User Token].** A new alphanumeric user token will be generated. Copy and store it in a safe location.
3. Use this new `user_token` in your API Calls
* * *
### Creating Layout Banks via API
The instructions in this guide refer to the creation of Layout Banks **via API**.
You can also create Layout Banks via _Level Editor_. Read the instructions [here](/wiki/spaces/TRIP/pages/2779349212/Level+Editor+Overview) to know more.
Once you’ve obtained your user token, you can go ahead and create Layout Banks. The Layout Bank will then be saved in the Level Bank.
Creating a Level Layout - POST {{host}}/api/internal/tile/level\_layouts
**Example request URI:** `https://game-server-staging.tripledotapi.com/api/internal/tile/level_layouts`
**Query parameters:**
| **Parameter** | **Type** | **Description** |
| --- | --- | --- |
| `user token` | _string_ | You user token generated in Game Server \> Profile |
| `app_id` | _string_ | Your app ID For Triple Tile, use `9` |
| `bank_id` | _string_ | ID of the level |
| `name` | _string_ | Name of the level |
| `content_hash` | _string_ | Generated in the client |
| `valid_for_use` | _string_ | True/False |
| `type` | _string_ | Your type of level. Use `classic`, `match_four`, or `goals` |
| `data` | _string_ | Your level layout. Example: `{"some_key": 10}` |
**Example call:**
{
"user_token": "{{user_token}}", //https://game-server-staging.tripledotapi.com/admin/admin_users
"app_id": 9,
"bank_id": "8",
"name": "new level layout",
"content_hash": "42425tsg34tkngwlg2kjgk2j3gf2",
"valid_for_use": false,
"type": "classic", //or "match_four" or "goals"
"data": {"some_key": 10}
}
**Responses:**
200 OK _application/json_
Updating a Level Layout - PATCH {{host}}/api/internal/tile/level\_layouts
**Query parameters:**
| **Parameter** | **Type** | **Description** |
| --- | --- | --- |
| `user token` | _string_ | You user token generated in Game Server \> Profile |
| `app_id` | _string_ | Your app ID For Triple Tile, use `9` |
| `bank_id` | _string_ | ID of the level |
| `name` | _string_ | Name of the level |
| `content_hash` | _string_ | Generated in the client |
| `valid_for_use` | _string_ | True/False |
| `type` | _string_ | Your type of level. Use `classic`, `match_four`, or `goals` |
| `data` | _string_ | Your level layout. Example: `{"some_key": 10}` |
**Example call:**
{
"user_token": "{{user_token}}",
"app_id": 9,
"bank_id": "8",
"name": "new level layout",
"content_hash": "42425tsg34tkngwlg2kjgk2j3gf2",
"valid_for_use": false,
"type": "classic", //or "match_four"
"data": {"some_key": 10}
}
**Responses:**
200 OK
### Creating Layout Banks in Game Server
Any changes made to Layout Banks need to be saved by clicking **[Save]** on the upper right corner.
You can also create Layout Banks in Game Server. However, the upload of layouts is done via API.
Once you’ve set up your Level Layouts, you can create Layout Banks with them.
1. Navigate to **Levels & Chapters \> Layout Banks** and click **[+New].**
2. Add a name for your Bank, add a description, labels if needed, and click **[Save].**
3. Once your Bank has been created, you can add your Layouts via API.
When Level Layouts have been uploaded, you’ll be able to visualise the details via Game Server, as well as duplicating both the bank and the levels, or reorder them.

**Uploading, Replacing and Duplicating Layout Banks**
- You can duplicate existing Layout Banks using the **[Duplicate]** button on top.
- You can download the layout banks form Game Server in order to import them into Production/Staging. The downloaded file contains:
- You can also replace existing layout banks. To do so, use the **[Replace]** button on the upper right corner. You’ll need to hash of the level bank to replace.

#### Uploading & Clearing Seeds
It is possible to upload specific seeds for each level from Game Server. This process is done via a CSV file which should include the numbers of seeds which should be used for each level.
1. In your Layout Bank, click **[Upload Seeds].**
2. Select a CSV file with the following format:
3. Click **[Save]**
**About Seeds**
Please take in consideration the following points:
- Number of seeds = number of comma separated integers
- You can upload seeds multiple times, but take into consideration that the data from the new file will override/update existing data.
* * *
## Creating Related Configurations
In order to configure Chapter Sets, you will need the following entities to be already added/configured:
- DDA Schemas
- DDA Schema Sets
- Reward Schema Sets
### **Creating DDA Schemas & DDA Schema Sets**
DDA (Dynamic Difficulty Adjustment) Schemas are used to apply a more personalised difficulty adjustment for each user based on their win rate, power-up usage, and revive usage, with the ultimate goal of increasing the long term retention of installs and maintaining cumulative rewarded ad revenue.
The workflow goes as follows:
1. Create the DDA Schemas
2. Create DDA Schema Sets
3. Enable them in Game Settings Override
#### Creating DDA Schemas
1. Select your game, navigate to **Levels and Chapters** , and select **DDA Schemas**. Click **[+New]** to create a new Schema. You can copy an existing schema by using the blue duplicate button  .
2. Add the relevant information for your configuration, and click **[Save]** when you’re done.
#### Creating DDA Schema Sets
Once you have created your schemas, you can place them together into Schema Sets. These Sets can be later be added to Game Setting overrides to facilitate A/B experiments.
To create DDA Schema Sets, follow the steps below:
1. Navigate to **DDA Schema Sets** , and click **[+New]** in the upper right corner.
2. Give your Set a name, and add the DDA schemas that will be part of the set. Under **From/To** , select the range of Chapters that the DDA Schema will apply to. If using “All next”, all next chapters will use this DDA schema. To include a new chapter, click **[+Add Difficulty Schema]**. When you’re done, click **[+Save].**
After creating your DDA Schema Sets, the final step is enabling them in Game Settings:
.gif?version=2&modificationDate=1687786465720&cacheVersion=1&api=v2&width=807&height=439)
### **Creating Reward Schema Sets**
1. To create Reward Schema Sets, navigate to **Levels & Chapters \> Reward Schema Sets**. In this page you’ll be able to see the existing sets, and in which configuration they’re being used.
2. Give your set a name, assign a label if needed, and click **[+Add Chapter Range].** A new chapter range will appear, which by default, includes all chapters available. To edit the rewards per chapter, click again **[+Add Chapter Range]** to include a new range of chapters.
3. Click **[+Add Reward]** to include any Game Item as a reward and its quantity. You can also add different rewards for players who reach the middle of a chapter by clicking **[+Add Midchapter Reward].**
If you select a Chest as a reward (bundle of Game Items), the folder icon will be active. Clicking it will redirect you to the Chest so that you can see the detailed view of Game Items
When you’re done with the configuration, please navigate to Game Settings and enable your Reward Schema Set:
