v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Cellular 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:

  1. Usage Analysis: Calculates unused data by subtracting actual consumption from monthly allowance
  2. Eligibility Check: Verifies if the customer has positive unused data and plan-level rollover permissions
  3. 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
  4. Consecutive Rollover Limitation: Prevents excessive data accumulation by resetting rollover after three consecutive cycles
  5. 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.

Decision graph6 nodes · read-only
input dataRolloverRequestexpression calculateUnusedDatatable determineRolloverAmountswitch verifyRolloverexpression processSuccessfulRolloverexpression processNoRollover
01

Data Rollover Request

input

Two 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
  }
}
02

Calculate Unused Data

expression

Before 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.

Expressions3 fields
unusedDataplan.monthlyDataAllowance - currentBillingCycle.dataUsed
isPositiveUnusedData$.unusedData > 0
previousRolloverAmountcurrentBillingCycle.rolloverData ?? 0
03

Determine Rollover Amount

table

Carry-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.

Decision tablefirst hit policy
Plan Typeplan.typeHas Unused DataisPositiveUnusedDataConsecutive RolloverscurrentBillingCycle.consecutiveRolloversRollover AmountnextBillingCycle.rolloverDataReasonnextBillingCycle.rolloverReason
'premium'true< 3unusedData + previousRolloverAmount'Unlimited rollover for Premium plan'
'standard'true< 3min([unusedData + previousRolloverAmount, plan.monthlyDataAllowance * 0.5])'Standard plan can rollover up to 50% of monthly allowance'
'basic'true< 3min([unusedData, plan.monthlyDataAllowance * 0.25])'Basic plan can rollover up to 25% of monthly allowance'
-true>= 30'Maximum consecutive rollovers (3) reached'
-false-0'No unused data to rollover'
04

Verify Rollover

switch

Branching 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.

Branches2 paths
nextBillingCycle.rolloverData > 0 Process Successful Rollover
otherwise Process No Rollover
05

Process Successful Rollover

expression

On 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.

Expressions3 fields
responseMessage`Rollover successful. You have ${nextBillingCycle.rolloverData} GB of rollover data available for your next billing cycle.`
nextBillingCycle.consecutiveRolloverscurrentBillingCycle.consecutiveRollovers + 1
nextBillingCycle.status'approved'
06

Process No Rollover

expression

The 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.

Expressions3 fields
responseMessage`No data rolled over. Reason: ${nextBillingCycle.rolloverReason ?? 'No unused data available'}`
nextBillingCycle.consecutiveRollovers0
nextBillingCycle.status'no_rollover'

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.