Industry
Use Case
Favorite Feature
StellarRPG is a free-to-play fantasy mobile RPG with 2.5 million monthly active users available on iOS, Android, and Windows desktop. The studio monetizes through cosmetic items, battle pass subscriptions, permanent character unlocks, and consumable in-game currency packs. By integrating NetLicensing as their entitlement authority, they decoupled monetization logic from the game client, enabling server-side feature management without requiring app store reviews or client updates. This architectural change allows their product team to ship new purchasable content within hours and validate all purchases through a cryptographically secure backend, eliminating client-side cheating and revenue leakage.
The studio’s original monetization system was fundamentally flawed: purchasable items were hardcoded directly into the game client, with purchase validation delegated to app store receipt verification. This created several critical problems:
Deployment friction: Adding a new cosmetic item, battle pass tier, or character pack required shipping a new client version, enduring a multi-week app store review cycle. A seasonal Halloween event could not be monetized until weeks after launch, missing peak engagement windows.
No server-side enforcement: The client was the source of truth for what content a player owned. A determined player could modify local game files, network traffic, or replay purchase confirmations to unlock items without payment.
Cross-platform fragmentation: A player could purchase a character on iOS but that entitlement was stored locally on their device. Switching to desktop or Android meant re-purchasing the same item, degrading cross-platform experience and driving player frustration.
Limited pricing flexibility: Adjusting prices or running promotional discounts required client updates. Time-sensitive sales (holiday specials, flash promotions) were impossible to execute.
Blind monetization: The studio had no real-time visibility into which items generated revenue, which cohorts purchased most, or which features drove highest lifetime value for targeted upsells.
The studio implemented Multi-Feature licensing as their core entitlement model, supplemented by Subscription licensing for the battle pass. Multi-Feature licensing maps naturally to their game’s content structure: each purchasable item (character, cosmetic, DLC level, currency bundle) becomes an independently licensed feature. The studio defines a “Character Module” and “Cosmetic Module” within their NetLicensing Product, each containing License Templates for specific items.
Multi-Feature mechanics:
Subscription licensing governs battle passes: a recurring monthly or seasonal commitment that unlocks a tier progression system and exclusive cosmetics.
Step 1: Create the Product
Log in to the NetLicensing Management Console. Create a new Product:
GAME_STELLARRPGStellarRPG Mobile & Desktop1.0CLIENT (player devices generate their own licensee identifiers)Step 2: Create Product Modules
Create three modules corresponding to the three revenue categories:
Module 1: Characters & DLC
CHARACTERSPlayable Characters & DLC ExpansionsMultiFeatureModule 2: Cosmetics
COSMETICSCosmetic Items (Skins, Emotes, Mounts)MultiFeatureModule 3: Battle Pass & Subscriptions
BATTLEPASSSeasonal Battle Pass & Premium SubscriptionSubscriptionStep 3: Create License Templates
For the CHARACTERS module, create templates for each purchasable character:
| Template Number | Name | License Type | Price (USD) | Parameters |
|---|---|---|---|---|
CHAR_DRAGON_RIDER | Legendary Dragon Rider | FEATURE | $9.99 | Perpetual access |
CHAR_FROST_MAGE | Frost Mage Bundle | FEATURE | $7.99 | Perpetual access |
CHAR_DARK_ASSASSIN | Dark Assassin (Event) | FEATURE | $4.99 | Auto-expires after seasonal event |
DLC_EXPANSION_1 | Lost Kingdom Expansion | FEATURE | $19.99 | Perpetual access to 15 new levels |
For the COSMETICS module, create fine-grained templates:
| Template Number | Name | License Type | Price (USD) | Parameters |
|---|---|---|---|---|
SKIN_GALAXY_DRAGON | Galaxy Dragon Rider Skin | FEATURE | $4.99 | Perpetual cosmetic |
EMOTE_VICTORY | Victory Emote Pack | FEATURE | $1.99 | Perpetual, multiple emotes |
MOUNT_PHOENIX | Phoenix Mount | FEATURE | $3.99 | Perpetual cosmetic |
SEASON_1_BP | Season 1 Battle Pass (Premium) | FEATURE | $9.99 | Active for 90 days |
For consumables (premium currency), use Quantity-based templates:
| Template Number | Name | License Type | Quantity | Price | Parameters |
|---|---|---|---|---|---|
CURRENCY_500 | 500 Premium Coins | QUANTITY | 500 | $4.99 | Quota decrement per use |
CURRENCY_2500 | 2500 Premium Coins (Bundle Discount) | QUANTITY | 2500 | $19.99 | Quota decrement per use |
CURRENCY_5000_ELITE | 5000 Premium Coins (Elite Package) | QUANTITY | 5000 | $34.99 | Quota decrement per use |
For the BATTLEPASS module, create subscription templates:
| Template Number | Name | License Type | Billing Period | Price | Parameters |
|---|---|---|---|---|---|
BP_MONTHLY | Battle Pass Monthly Subscription | SUBSCRIPTION | 1 month | $9.99 | Auto-renews; unlock 90 exclusive cosmetics and XP boost |
BP_ANNUAL | Battle Pass Annual (Discounted) | SUBSCRIPTION | 12 months | $89.99 | Auto-renews yearly; 25% savings |
Entitlement Validation at Game Launch
When a player launches the game, the client performs the following flow:
# Player launches game; client retrieves stored licensee ID from device storage
LICENSEE_ID="player_a1b2c3d4e5f6"
API_KEY="your-netlicensing-api-key"
# Client calls NetLicensing validation endpoint
curl -X GET "https://go.netlicensing.io/core/v2/rest/licensee/${LICENSEE_ID}/validate" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/json"
Expected Response (JSON):
{
"licensee": {
"number": "player_a1b2c3d4e5f6",
"licensingObject": {
"name": "StellarRPG Mobile & Desktop",
"ref": "https://go.netlicensing.io/core/v2/rest/product/GAME_STELLARRPG"
}
},
"productModuleValidation": [
{
"name": "Playable Characters & DLC Expansions",
"number": "CHARACTERS",
"licensingModel": "MultiFeature",
"valid": true,
"license": [
{
"number": "L_CHAR_DRAGON_RIDER_p1",
"name": "Legendary Dragon Rider",
"licenseType": "FEATURE",
"valid": true,
"expirationTime": null
},
{
"number": "L_DLC_EXPANSION_1_p1",
"name": "Lost Kingdom Expansion",
"licenseType": "FEATURE",
"valid": true,
"expirationTime": null
}
]
},
{
"name": "Cosmetic Items",
"number": "COSMETICS",
"licensingModel": "MultiFeature",
"valid": true,
"license": [
{
"number": "L_SKIN_GALAXY_p1",
"name": "Galaxy Dragon Rider Skin",
"licenseType": "FEATURE",
"valid": true,
"expirationTime": null
}
]
},
{
"name": "Seasonal Battle Pass",
"number": "BATTLEPASS",
"licensingModel": "Subscription",
"valid": true,
"license": [
{
"number": "L_BP_MONTHLY_p1",
"name": "Battle Pass Monthly Subscription",
"licenseType": "SUBSCRIPTION",
"valid": true,
"expirationTime": "2026-05-19T00:00:00Z"
}
]
}
]
}
The client parses this response and populates the player’s character roster, cosmetic selection menu, and battle pass progress tracker. Any licensed features are automatically enabled in the game UI; unlicensed features are greyed out.
Consumable Currency Deduction
When a player purchases an item from the in-game shop using premium currency, the client calls:
# Player spends 50 premium coins from their 500 coin bundle
LICENSEE_ID="player_a1b2c3d4e5f6"
LICENSE_NUMBER="L_CURRENCY_500_p1"
AMOUNT_SPENT=50
curl -X POST "https://go.netlicensing.io/core/v2/rest/license/${LICENSE_NUMBER}" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "action=DEBIT&debit=${AMOUNT_SPENT}"
NetLicensing decrements the quantity from 500 to 450. The response confirms the new balance:
{
"license": {
"number": "L_CURRENCY_500_p1",
"name": "500 Premium Coins",
"quantity": "450",
"valid": true
}
}
The client stores this new quantity locally and updates the UI currency counter.
In-Game Shop Purchase Flow
When the player clicks “Buy” on a cosmetic in the in-game shop:
curl -X POST "https://api.stellarrpg.com/purchase/confirm" \
-H "Content-Type: application/json" \
-d '{
"licensee_id": "player_a1b2c3d4e5f6",
"item_template": "SKIN_GALAXY_DRAGON",
"receipt": {
"platform": "apple",
"receipt_data": "base64-encoded-app-store-receipt",
"transaction_id": "1000000123456789"
}
}'
curl -X POST "https://go.netlicensing.io/core/v2/rest/license" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licensee=${LICENSEE_ID}&licenseTemplate=SKIN_GALAXY_DRAGON&active=true"
L_SKIN_GALAXY_p2):{
"license": {
"number": "L_SKIN_GALAXY_p2",
"name": "Galaxy Dragon Rider Skin",
"licenseType": "FEATURE",
"active": true,
"valid": true
}
}
curl -X POST "https://go.netlicensing.io/core/v2/rest/transaction" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licensee=${LICENSEE_ID}&name=Purchase+Galaxy+Dragon+Skin&status=CLOSED&source=SHOP"
Auto-Provisioning
The studio configured licenseeAutoCreate: true on their Product, enabling automatic licensee provisioning on first connection. When a player launches StellarRPG for the first time:
GAME_STELLARRPG_<deviceId_hash>This eliminates manual sign-up friction: players can start playing immediately.
Cross-Platform Entitlement Sharing
To enable purchases to sync across iOS, Android, and desktop, players must link their game account to a Studio account (email + password, or OAuth via Google/Facebook). The linking flow:
In NetLicensing terms: the canonical licensee ID becomes the owner of all licenses, regardless of which device type created them.
Creating Licensees Programmatically
For bulk onboarding or testing, create licensees via API:
curl -X POST "https://go.netlicensing.io/core/v2/rest/licensee" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "product=GAME_STELLARRPG&number=player_testuser_001&name=TestUser001&active=true"
Response:
{
"licensee": {
"number": "player_testuser_001",
"name": "TestUser001",
"active": true,
"ref": "https://go.netlicensing.io/core/v2/rest/licensee/player_testuser_001"
}
}
The studio uses NetLicensing Shop for web-based purchases and integrates it with their mobile in-app purchase flows.
Web Shop Flow (Desktop Players)
For desktop players purchasing cosmetics through the web store:
curl -X POST "https://go.netlicensing.io/core/v2/rest/token" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licensee=player_a1b2c3d4e5f6&tokenType=SHOP"
Response:
{
"token": {
"number": "TOKEN_abc123xyz",
"tokenType": "SHOP",
"licensee": "player_a1b2c3d4e5f6"
}
}
https://go.netlicensing.io/shop/v2?token=TOKEN_abc123xyz&redirectSuccessUrl=https://stellarrpg.com/shop-success?order_id={ORDER_ID}&redirectCancelUrl=https://stellarrpg.com/shop-cancelled
Mobile In-App Purchase Flow
For iOS and Android, the studio delegates payment to app store SDKs (avoiding the need to handle PCI compliance):
The studio does NOT use NetLicensing Shop for mobile purchases; instead, they directly create licenses via API post-receipt-verification.
Offline Validation & Grace Period
The mobile game may be played offline (airplane mode, poor connectivity). To handle this:
Preventing Entitlement Cheating
The studio implements the following safeguards:
curl -X POST "https://go.netlicensing.io/core/v2/rest/license/${LICENSE_NUMBER}" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "active=false"
Handling License Expiration
Seasonal battle passes and limited-time event characters auto-expire based on NetLicensing’s expirationTime field:
valid=falseQuota Exhaustion
When a player depletes premium currency (quota reaches 0):
valid=false for that licenseBulk License Operations
For seasonal events or promotions granting free cosmetics to all players:
# Grant 5000 players free Battle Pass for a limited time
curl -X POST "https://go.netlicensing.io/core/v2/rest/license/grant" \
-H "Authorization: Basic $(echo -n "${API_KEY}:" | base64)" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "product=GAME_STELLARRPG&licenseTemplate=BP_MONTHLY&quantity=5000&expirationTime=2026-04-30T23:59:59Z"
This creates 5000 licenses, each expiring on the specified date.
API Rate Limiting & Retry Logic
NetLicensing enforces rate limits (typically 100 requests/minute per API key). The game backend implements exponential backoff:
import requests
import time
def validate_with_retry(licensee_id, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.get(
f"https://go.netlicensing.io/core/v2/rest/licensee/{licensee_id}/validate",
auth=("api_key", ""),
timeout=5
)
if response.status_code == 200:
return response.json()
elif response.status_code == 429: # Rate limited
wait_time = 2 ** attempt # Exponential backoff
time.sleep(wait_time)
continue
else:
raise Exception(f"Unexpected status: {response.status_code}")
except requests.RequestException as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
raise Exception("Max retries exceeded")

Gaming Middleware: Per-Title and Per-Seat Licensing
A game middleware vendor introduced indie, studio, and enterprise tiers with per-title entitlements and scalable seat pools.

Physical Security: Feature-Based Access Control with Time-Limited Permissions
A building management company implemented feature-based access control with time-limited permissions to manage resource gating and dynamic authorization across facilities.