Industry
Use Case
Favorite Feature
A team builds a web-based project planning tool. New accounts get a 14-day trial with everything unlocked. After that, accounts either pay for Pro or Team, or keep using a limited Free tier.
Their first version kept the trial end date in their own database and checked it with a nightly job. It worked, more or less, but the problems added up:
The team wanted one place that answers “what is this account allowed to do right now?”, and they wanted to change plans without redeploying.
The team models its plans with the Pricing Table licensing model. A Pricing Table module has a list of SKUs. Each SKU is either a feature (on/off) or a quota (a number). Each plan sets values for those SKUs.
Product: Planner (licenseeAutoCreate = true)
└── Module "Plans" – Pricing Table
SKUs: PROJECTS (quota), MEMBERS (quota), REPORTS (feature), API (feature)
Free FEATURE, EUR 0, automatic, hidden PROJECTS=3 MEMBERS=3 REPORTS=false API=false
Pro trial TIMEVOLUME 14 DAY, EUR 0, automatic, PROJECTS=20 MEMBERS=10 REPORTS=true API=true
hidden
Pro TIMEVOLUME 1 MONTH, EUR 12 PROJECTS=20 MEMBERS=10 REPORTS=true API=true
Team TIMEVOLUME 1 MONTH, EUR 39 PROJECTS=-1 MEMBERS=50 REPORTS=true API=true
Both the Free plan and the Pro trial are automatic, so every new account gets both. While several plans are active, NetLicensing combines them: a feature is on if any active plan includes it, and each quota takes the highest value. During the 14 days the account therefore gets Pro limits. The plan weight set in the Console decides which plan is reported as the current one. When the trial runs out, NetLicensing lists it under expiredPricingPlan, and the Free plan is what’s left. There’s no lockout and no job to write for the downgrade. A quota of -1 means unlimited.
Each account in the app is one licensee, and the account ID is the licensee number. The back end validates when a user signs in. On the first call it passes productNumber, and NetLicensing creates the licensee with its automatic plans:
curl -u apiKey:YOUR_API_KEY -H "Accept: application/json" \
-d "productNumber=PLANNER" \
https://go.netlicensing.io/core/v2/rest/licensee/ACC-58213/validate
The result names the current plan (pricingPlanId, pricingPlanName), lists all active plans, and returns each SKU with its value. The back end turns that into an entitlements object and caches it until the response’s ttl runs out. The web app, the mobile app and the API all read the same object, so they can’t drift apart anymore.
NetLicensing returns limits but doesn’t count anything. When a user creates a project, the app compares its own project count with PROJECTS. That’s how the Quota concept works in NetLicensing too.
Pricing Table plans have warning levels. A time-based plan turns yellow once 80% of its time is used. The team registers a webhook notification for WARNING_LEVEL_CHANGED and sends a short “your trial ends in a few days” email when an account turns yellow. The same webhook with LICENSE_CREATED tells the back end to drop its cached entitlements right after a purchase.
The “Upgrade” button asks the back end for a shop token and redirects the user to the returned shopURL:
curl -u apiKey:YOUR_API_KEY -H "Accept: application/json" \
-d "tokenType=SHOP" -d "licenseeNumber=ACC-58213" \
-d "successURL=https://planner.example/billing/done" \
-d "cancelURL=https://planner.example/billing" \
https://go.netlicensing.io/core/v2/rest/token
The user picks Pro or Team in the NetLicensing Shop and pays with PayPal or Stripe. If they renew before a period ends, the new month is added after the current one, so nobody loses days.
Read the SaaS licensing guide or start a free account to try the Pricing Table model.

B2B SaaS: From Stripe-Only to Licensing-as-a-Service
How a B2B SaaS vendor can keep Stripe Billing for payments and use NetLicensing as the single source of truth for subscriptions, trials and add-on features.

Membership Platform: Automated Access, Renewals, and Tier Management
How a professional association can run yearly membership tiers with automatic renewal, a grace period for late payers and self-service for members, using the Subscription model.