GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchCellular Data Rollover System
Intelligent system that automatically calculates and applies unused data transfers to next billing cycles based on customer plan tiers and usage patterns.
Solution
This data rollover system automatically manages the transfer of unused mobile data to subsequent billing cycles for telecom subscribers. The solution analyzes each customer's current plan type, monthly data allowance, and consumption patterns to determine rollover eligibility and calculate precise amounts of data to carry forward.
Premium subscribers benefit from unlimited rollover capabilities, while standard and basic plan subscribers receive proportional rollover allowances based on their service tier. The system enforces plan-specific restrictions, including maximum rollover amounts (50% of monthly allowance for standard plans, 25% for basic plans) and caps consecutive rollovers at three billing cycles to prevent excessive accumulation. When processing each billing cycle transition, the system generates clear customer notifications explaining rollover status and available data amounts for the upcoming period.
How it works
The data rollover process functions through a sequence of logical evaluations:
- Usage Analysis: Calculates unused data by subtracting actual consumption from monthly allowance
- Eligibility Check: Verifies if the customer has positive unused data and plan-level rollover permissions
- Plan Assessment: Applies different rollover calculations based on customer's service tier:
- Premium plans: Full rollover of all unused data
- Standard plans: Rollover up to 50% of monthly allowance
- Basic plans: Rollover up to 25% of monthly allowance
- Consecutive Rollover Limitation: Prevents excessive data accumulation by resetting rollover after three consecutive cycles
- Customer Notification: Generates personalized messages explaining rollover status and available data for next billing cycle
Where teams use it
- Mobile service providers
- MVNO (Mobile Virtual Network Operators)
- Corporate telecommunications management
- Family plan data allocation
- Data sharing across multiple devices
- Prepaid mobile service offerings
Inside the decision model
Cellular Data Rollover System ships as a JDM decision graph with 6 nodes, 1 decision table and 5 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.
Data Rollover Request
inputTwo request objects are enough for a cycle transition: plan brings type, monthlyDataAllowance, and rolloverEligible, while currentBillingCycle reports dataUsed, the running consecutiveRollovers counter, and any rolloverData already banked.
Sample requestJSON
{
"plan": {
"type": "premium",
"monthlyDataAllowance": 50,
"rolloverEligible": true
},
"currentBillingCycle": {
"dataUsed": 35,
"consecutiveRollovers": 1,
"rolloverData": 5
}
}Calculate Unused Data
expressionBefore any tier rule runs, the leftover balance is established: unusedData is plan.monthlyDataAllowance minus currentBillingCycle.dataUsed, isPositiveUnusedData flags whether there is anything to carry at all, and previousRolloverAmount defaults currentBillingCycle.rolloverData to 0 with ?? so first-cycle customers are handled cleanly. These three values are what the rollover table actually reads.
plan.monthlyDataAllowance - currentBillingCycle.dataUsed$.unusedData > 0currentBillingCycle.rolloverData ?? 0Determine Rollover Amount
tableCarry-forward amounts are tiered by plan.type under a first hit policy, with the guard rows for exhausted eligibility at the bottom. 'premium' plans with isPositiveUnusedData true and consecutiveRollovers < 3 bank the full unusedData + previousRolloverAmount; 'standard' plans take min([unusedData + previousRolloverAmount, plan.monthlyDataAllowance * 0.5]) and 'basic' plans min([unusedData, plan.monthlyDataAllowance * 0.25]). Once the counter reaches >= 3 the amount is forced to 0 with the reason 'Maximum consecutive rollovers (3) reached', and no unused data likewise rolls nothing.
Capping cheaper tiers at 50% and 25% of the monthly allowance is how carriers bound the liability that banked data represents: every rolled gigabyte is capacity sold once but deliverable twice. The three-cycle ceiling serves the same purpose for premium accounts, where the unlimited carry would otherwise compound each month, and the reason strings double as customer-facing copy so billing does not need to re-derive the explanation.
| Plan Typeplan.type | Has Unused DataisPositiveUnusedData | Consecutive RolloverscurrentBillingCycle.consecutiveRollovers | Rollover AmountnextBillingCycle.rolloverData | ReasonnextBillingCycle.rolloverReason |
|---|---|---|---|---|
| 'premium' | true | < 3 | unusedData + previousRolloverAmount | 'Unlimited rollover for Premium plan' |
| 'standard' | true | < 3 | min([unusedData + previousRolloverAmount, plan.monthlyDataAllowance * 0.5]) | 'Standard plan can rollover up to 50% of monthly allowance' |
| 'basic' | true | < 3 | min([unusedData, plan.monthlyDataAllowance * 0.25]) | 'Basic plan can rollover up to 25% of monthly allowance' |
| - | true | >= 3 | 0 | 'Maximum consecutive rollovers (3) reached' |
| - | false | - | 0 | 'No unused data to rollover' |
Verify Rollover
switchBranching is a single test: when nextBillingCycle.rolloverData > 0 the flow takes the success path, and the default statement routes everything else to the no-rollover handler. Splitting here lets the two outcomes set different messages, counters, and statuses without conditional logic inside the expression nodes.
Process Successful Rollover Process No RolloverProcess Successful Rollover
expressionOn the success branch the response is assembled: responseMessage interpolates nextBillingCycle.rolloverData into a customer notification, consecutiveRollovers is incremented from the current cycle's count, and nextBillingCycle.status is set to 'approved' so billing applies the banked data next period.
`Rollover successful. You have ${nextBillingCycle.rolloverData} GB of rollover data available for your next billing cycle.`currentBillingCycle.consecutiveRollovers + 1'approved'Process No Rollover
expressionThe empty branch closes the loop the other way: responseMessage explains the outcome using nextBillingCycle.rolloverReason with a fallback of 'No unused data available', consecutiveRollovers resets to 0 so the customer earns a fresh three-cycle window, and status becomes 'no_rollover'. Resetting the counter here is what makes the cap a limit on consecutive carries rather than a lifetime one.
`No data rolled over. Reason: ${nextBillingCycle.rolloverReason ?? 'No unused data available'}`0'no_rollover'Other Telco templates
View all templatesDynamic Tariff Engine
Rule-based pricing system for telecommunication services that automatically applies discounts based on user profiles, time periods, and location types.
TelcoRegional Compliance Manager
Automated system that applies region-specific data privacy rules for telecommunications services across EU, US, UK, Canada, and Australia.
TelcoCustomer Eligibility Engine
Intelligent system that analyzes customer data to determine service upgrades, loyalty rewards, and premium features based on usage patterns and account history.
Make this template
your own.
Load Cellular Data Rollover System into GoRules, adjust the rules to your policy, and ship it behind your own API.