Industry
Use Case
Favorite Feature
MediaStream is a B2C content aggregation platform offering eBooks, audiobooks, video courses, and premium articles from hundreds of independent publishers and content creators. Their primary audience includes students, professionals seeking continuing education, and casual readers who consume content on varied schedules. Before adopting NetLicensing, the platform was constrained to a single monetization model: monthly subscriptions. This one-size-fits-all approach created friction with both users and publishers—casual users abandoned the platform due to subscription commitment hesitation, while high-volume content consumers felt penalized by paying flat monthly rates regardless of consumption levels. Publishers, in turn, lacked visibility into revenue attribution and couldn’t optimize their content strategy around actual engagement patterns.
MediaStream’s leadership recognized that flexible monetization was essential to capturing untapped market segments and maximizing publisher partnerships. The decision to integrate NetLicensing as the unified entitlement layer was driven by three core requirements: (1) support multiple simultaneous licensing models without rebuilding backend infrastructure, (2) enforce digital rights server-side to prevent unauthorized content sharing and piracy, and (3) provide real-time analytics on consumption patterns tied to license types for revenue optimization. NetLicensing’s Rental, Pay-Per-Use, and Subscription models aligned perfectly with these needs and eliminated months of custom development.
MediaStream’s original platform enforced a rigid subscription model: users paid a flat $9.99/month for unlimited access to the premium catalog, or used a free tier with crippled functionality. This created two critical business problems:
User Acquisition Friction: A substantial segment of potential users—students wanting to try a single textbook chapter, business professionals seeking one-off training videos, or casual readers exploring a niche author—declined to subscribe. The $9.99 commitment was perceived as high-risk for uncertain value. The company observed a 68% cart abandonment rate when converting free-tier users to paid subscriptions.
Publisher Revenue Misalignment: Publishing partners were compensated based on fixed monthly revenue pools distributed proportionally across all content, with no correlation to actual consumption. Publishers had no incentive to optimize for the subscription model and frequently questioned whether their content was driving meaningful engagement. Some high-demand content (e.g., professional certification study guides) was carrying the entire revenue model while other content generated vanishingly small payouts, but all received the same “per-catalog” revenue split.
Content Piracy and Unauthorized Sharing: With subscriptions downloaded to mobile apps and web clients, unauthorized sharing became prevalent. Users shared login credentials or redistributed downloadable eBooks via email and torrent sites. The platform lacked granular entitlement enforcement and had no mechanism to tie licenses to specific devices or revoke access in real-time.
MediaStream implemented a hybrid approach using three of NetLicensing’s core models:
1. Subscription Model (Premium Access): Users paying $9.99/month receive a Multi-Feature license granting access to the entire premium catalog. Renewal is automated through NetLicensing’s Subscription model with monthly grace-period handling. This continues to serve loyal users and provides predictable recurring revenue.
2. Rental Model (Time-Limited Access): Individual content pieces are offered on time-limited rental terms: eBooks and audiobooks for 7 or 14 days ($2.99–$6.99), video courses for 30 days ($12.99–$24.99). Each rental creates a TIMEVOLUME license with precise expiration enforcement. After the rental window closes, the license is automatically revoked and content access is blocked without manual intervention.
3. Pay-Per-Use Model (Consumption-Based): Individual articles, conference talks, and premium research papers are sold as single-use licenses for $0.99–$3.99. Each purchase creates a QUANTITY license with a quota of 1, expiring after the session or at a fixed time window (e.g., 24 hours). Prepaid credit accounts are also supported, where users purchase a $25 credit pack and each article access decrements the remaining balance.
The rationale for this three-model approach: Subscriptions retain high-lifetime-value users; rentals capture price-sensitive users seeking flexible, temporary access; and pay-per-use monetizes impulse purchases and single-item discovery patterns. Together, these models increased the addressable market by approximately 45% compared to subscription-only.
The following describes the step-by-step configuration in NetLicensing’s Management Console:
Step 1: Create the Product
https://admin.netlicensing.ioMEDIASTREAM-P001MediaStream Content Platform2.0Step 2: Create Product Modules
Create three modules, one for each licensing model. This allows independent configuration and analytics per model.
Module 1: Premium Subscriptions
MEDIASTREAM-M-SUBSCRIPTIONPremium Subscription AccessModule 2: Rental Access
MEDIASTREAM-M-RENTALTime-Limited Rental AccessModule 3: Pay-Per-Use
MEDIASTREAM-M-PAY-PER-USEPay-Per-Use Content AccessStep 3: Create License Templates
For each module, create license templates representing specific product offerings:
Subscription Templates:
MEDIASTREAM-M-SUBSCRIPTION, click Create License TemplateMEDIASTREAM-LT-SUB-BASICMonthly Premium SubscriptionMEDIASTREAM-LT-SUB-ANNUALAnnual Premium Subscription (Discounted)Rental Templates:
MEDIASTREAM-M-RENTAL, click Create License TemplateMEDIASTREAM-LT-RENT-EBOOK-7DeBook 7-Day RentalMEDIASTREAM-LT-RENT-COURSE-30DVideo Course 30-Day RentalPay-Per-Use Templates:
MEDIASTREAM-M-PAY-PER-USE, click Create License TemplateMEDIASTREAM-LT-PPU-ARTICLEPremium Article Single ViewMEDIASTREAM-LT-PPU-CREDITS-25$25 Content CreditsStep 4: Configure Custom Properties (Optional)
Add custom properties to track content metadata:
contentId — store the internal content database IDProperty Name: contentType — values: ebook | video | article | audiobook |
deviceId — store the user’s device identifier for revocation trackingThe MediaStream application integrates NetLicensing at four critical junctures:
Licensee Creation (User Registration)
When a new user registers, the application creates a NetLicensing Licensee representing that user:
curl -X POST "https://go.netlicensing.io/core/v2/rest/licensee" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "productNumber=MEDIASTREAM-P001&licenseeNumber=USR-$(date +%s)&name=$(urlencode $userEmail)"
Response (201 Created):
{
"licensee": {
"number": "USR-1718814225",
"active": true,
"name": "user@example.com",
"productNumber": "MEDIASTREAM-P001",
"created": "2024-06-19T14:30:25Z",
"product": {
"number": "MEDIASTREAM-P001",
"name": "MediaStream Content Platform"
}
}
}
The application stores the returned licenseeNumber in its user database, establishing a persistent mapping.
License Issuance (Purchase Flow)
When a user selects a rental or pay-per-use item, the application creates a new license by posting to the NetLicensing API:
curl -X POST "https://go.netlicensing.io/core/v2/rest/license" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licenseeNumber=USR-1718814225&licenseTemplateNumber=MEDIASTREAM-LT-RENT-EBOOK-7D&name=Rental: Learning Python (2024)" \
-d "startDate=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
Response (201 Created):
{
"license": {
"number": "LIC-1718814290-001",
"active": true,
"name": "Rental: Learning Python (2024)",
"licenseeNumber": "USR-1718814225",
"licenseTemplateNumber": "MEDIASTREAM-LT-RENT-EBOOK-7D",
"startDate": "2024-06-19T14:31:30Z",
"expiryDate": "2024-06-26T14:31:30Z",
"validity": 7,
"validityPeriod": "DAY",
"timeVolumeCheckIn": 0,
"timeVolumeCheckOut": 0
}
}
License Validation (Content Access)
Whenever the user attempts to read, stream, or view content, the application validates the active license before serving the content:
curl -X GET "https://go.netlicensing.io/core/v2/rest/licensee/USR-1718814225/validate" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded"
Response (200 OK):
{
"ttl": "3600",
"productModuleValidation": [
{
"moduleNumber": "MEDIASTREAM-M-SUBSCRIPTION",
"moduleName": "Premium Subscription Access",
"valid": false
},
{
"moduleNumber": "MEDIASTREAM-M-RENTAL",
"moduleName": "Time-Limited Rental Access",
"valid": true,
"license": {
"number": "LIC-1718814290-001",
"active": true,
"expiryDate": "2024-06-26T14:31:30Z",
"validity": 7
}
},
{
"moduleNumber": "MEDIASTREAM-M-PAY-PER-USE",
"moduleName": "Pay-Per-Use Content Access",
"valid": false
}
]
}
Application Logic:
"valid": true, the user’s license is current and content is served"valid": false, content access is blocked and the user is redirected to the shopExpiration Handling (Background Job)
A scheduled backend job runs hourly to detect expired rentals and notify users:
curl -X GET "https://go.netlicensing.io/core/v2/rest/licensee/USR-1718814225/validate" \
-H "Authorization: Basic <base64_encoded_api_token>"
If the response includes a license with expiryDate within 2 days of now, the application queues a reminder notification (email or in-app) with a one-click renewal link to the NetLicensing Shop.
MediaStream uses a hybrid approach combining auto-provisioning and manual management:
Auto-Provisioning on Sign-Up
licenseeNumberusers.netlicensing_id columnLinking Devices
For multi-device entitlement enforcement (preventing credential sharing), the application implements device binding:
curl -X POST "https://go.netlicensing.io/core/v2/rest/license" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licenseeNumber=USR-1718814225&licenseTemplateNumber=MEDIASTREAM-LT-RENT-EBOOK-7D" \
-d "customProperty.deviceId=IPHONE-12345-ABC&customProperty.contentId=EBOOK-789"
The customProperty.deviceId field is set to a unique device identifier (IDFA on iOS, AAID on Android, or a browser fingerprint on web). This enables the backend to validate that the license holder is requesting access from an authorized device, preventing sharing of credentials across multiple households.
Manual License Transfer (Support Flow)
If a user upgrades their device or loses access, support staff can manually transfer licenses:
curl -X POST "https://go.netlicensing.io/core/v2/rest/licensee/USR-1718814225/transfer" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "targetLicenseeNumber=USR-NEW-TRANSFER&licenseNumbers=LIC-1718814290-001"
This reassigns the specified license to a new licensee (useful if the user creates a second account or switches devices).
MediaStream uses the NetLicensing Shop as the primary purchase interface for all non-subscription offerings (rentals and pay-per-use). Subscriptions are handled separately through Stripe integration for recurring billing.
Shop Token Generation
When a user navigates to the “Purchase” section of the app, the backend generates a shop token valid for 30 minutes:
curl -X POST "https://go.netlicensing.io/core/v2/rest/token" \
-H "Authorization: Basic <base64_encoded_api_token>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licenseeNumber=USR-1718814225&action=SHOP" \
-d "successUrl=https://mediastream.com/home&successUrlTitle=Return to App" \
-d "cancelUrl=https://mediastream.com/purchase&cancelUrlTitle=Continue Shopping"
Response (201 Created):
{
"token": {
"number": "TOKEN-SHOP-2024-06-19-001",
"active": true,
"expiryDate": "2024-06-19T15:00:00Z",
"successUrl": "https://mediastream.com/home",
"successUrlTitle": "Return to App",
"cancelUrl": "https://mediastream.com/purchase",
"cancelUrlTitle": "Continue Shopping"
}
}
Shop URL Construction
The application constructs the shop URL by appending the token number to the NetLicensing Shop base URL:
https://shop.netlicensing.io/?token=TOKEN-SHOP-2024-06-19-001
The user is directed to this URL via webview (mobile) or new browser tab (web). The shop presents the available license templates (rentals, pay-per-use, and subscription tiers) with pricing and descriptions.
Payment Gateway Integration
NetLicensing Shop supports multiple payment methods; MediaStream configures:
Payment method configuration is handled in the NetLicensing Management Console under Payment Methods:
NetLicensing handles the payment processing; the application never touches payment data directly (PCI-DSS compliant).
Post-Purchase License Activation
When a user completes a purchase in the NetLicensing Shop and is redirected back to the app via successUrl, the application must confirm that the license was created:
curl -X GET "https://go.netlicensing.io/core/v2/rest/licensee/USR-1718814225/validate" \
-H "Authorization: Basic <base64_encoded_api_token>"
The application checks the response for the newly created license. If present and "valid": true, the user is granted immediate access to the purchased content. A background job also polls this endpoint periodically to detect delayed license creation due to asynchronous payment processing.
Offline and Grace-Period Handling
MediaStream implements a 1-hour cache of validation responses to handle brief offline periods and reduce API load. When the cache is valid, content is served without querying NetLicensing. When the cache expires and no network connection is available, a 24-hour offline grace period is extended, allowing the user to continue accessing previously validated content. If the device goes offline and the user attempts to access a new piece of content, they are presented with a “Connection Required” message.
For rental licenses approaching expiry, the app respects the yellowThreshold and redThreshold set in the module configuration (2 days and 1 day remaining, respectively). When the license approaches these thresholds, the UI displays a countdown banner with a one-click renewal link.
License Transfer and Device Deactivation
Support staff use the license transfer API (shown above) for user-initiated device switches. The application also implements a “deactivate device” flow where a user can manually revoke licenses tied to an old device through account settings. The backend calls the license deactivation endpoint:
curl -X DELETE "https://go.netlicensing.io/core/v2/rest/license/LIC-1718814290-001" \
-H "Authorization: Basic <base64_encoded_api_token>"
This immediately blocks content access on the revoked device.
Audit Logging
Every license create, activate, and validation is logged to a local audit table with:
This log is retained for 2 years and is queryable by support and analytics teams.
Error Handling and Retry Logic
The application implements exponential backoff for NetLicensing API calls:
Retry-After header and queue the requestAll validation calls include a request timeout of 5 seconds; if exceeded, the cached validation result is used.
Rate Limiting Considerations
The MediaStream application serves millions of monthly validation requests. To stay within NetLicensing rate limits (typically 10,000 requests/minute per API token), the application:
Following NetLicensing integration, MediaStream achieved significant business and technical improvements:

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.

AI/ML Platform: Token-Based Monetization with Inference Metering
Control API usage with Pay-per-Use or subscription models — charge per inference call, token consumed, or agent outcome