GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchLegacy Plan Management
Rules-based telecom system that preserves benefits for long-term customers while streamlining catalog offerings and guiding migration paths.
Solution
This telecom plan management system intelligently handles legacy service plans through a structured decision framework. The system first identifies plan types based on name patterns and age, determining whether customers qualify for grandfathered status based on their tenure. For qualified legacy customers, it preserves their original data allowances, international calling minutes, and special features like free evening calls.
For non-grandfathered legacy plans, the system recommends appropriate modern alternatives from the current catalog, mapping legacy offerings to standardized equivalents while maintaining similar benefit levels. This reduces catalog complexity without disrupting customer experience. The migration eligibility component identifies which customers should remain on protected plans and which can be migrated with promotional offers, enabling targeted retention strategies while preventing catalog sprawl.
How it works
The decision graph processes customer and plan data through a sequential evaluation flow:
- Plan Identification: Analyzes the plan name, age, and customer tenure to categorize plans as legacy, premium, value, or standard, and determines grandfathered status.
- Benefit Determination: Evaluates each plan category and grandfathered status to assign appropriate data allowances, international minutes, and feature retention policies.
- Catalog Mapping: Maps legacy plans to their current catalog equivalents, providing simplified plan names and recommended plan IDs.
- Migration Assessment: Determines migration eligibility based on plan category and grandfathered status, generating appropriate offer details.
- Field Cleanup: Filters the response to include only relevant information for downstream systems.
Where teams use it
- Telecommunications plan rationalization
- Legacy product management
- Customer retention strategies
- Catalog simplification initiatives
- Service migration planning
- Customer value preservation
Inside the decision model
Legacy Plan Management ships as a JDM decision graph with 6 nodes, 4 decision tables and 18 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.
Request
inputClassification starts from two objects: plan carries the name, ageInMonths, dataAllowance, internationalMinutes, and feature list under review, and customer contributes tenureInMonths, the field that decides whether legacy status becomes protected.
Sample requestJSON
{
"plan": {
"id": "LEGACY-PLAN-2019",
"name": "Legacy Unlimited Family Plan",
"ageInMonths": 48,
"dataAllowance": 25,
"internationalMinutes": 120,
"features": [
"Unlimited SMS",
"Free Evening Calls",
"Family Sharing"
]
},
"customer": {
"id": "CUST-12345",
"tenureInMonths": 36,
"segment": "Family",
"location": "Urban"
}
}Identify Plan Type
tableCategorization runs on name patterns plus age under a first hit policy: a plan.name matching contains($, "Legacy") with plan.ageInMonths > 36 and customer.tenureInMonths > 24 is classed 'legacy' with isGrandfathered true, while a Legacy name older than 24 months without the tenure requirement stays 'legacy' but ungrandfathered. Names containing "Value" or "Essential" map to 'value', "Premium" or "Unlimited" to 'premium', and everything else defaults to 'standard'.
Requiring both plan age and customer tenure before grandfathering is deliberate: protection is meant for people who have actually held the old terms, not for anyone who recently landed on an aging SKU. Pattern-matching the plan name is a pragmatic classifier for real catalogs, where years of marketing-named plans rarely share a clean taxonomy field, and the ordering matters because 'Legacy Unlimited Family Plan' should hit the legacy rows before the 'Unlimited' pattern can claim it as premium.
| Plan Nameplan.name | Plan Age (months)plan.ageInMonths | Customer Tenure (months)customer.tenureInMonths | Plan CategoryplanDetails.category | GrandfatheredplanDetails.isGrandfathered |
|---|---|---|---|---|
| contains($, "Legacy") | > 36 | > 24 | 'legacy' | true |
| contains($, "Legacy") | > 24 | - | 'legacy' | false |
| contains($, "Value") or contains($, "Essential") | - | - | 'value' | false |
| contains($, "Premium") or contains($, "Unlimited") | - | - | 'premium' | false |
| - | - | - | 'standard' | false |
Determine Benefits
tableEntitlements follow from the category and grandfathered pair, checked top-down. A grandfathered 'legacy' plan keeps its own plan.dataAllowance and plan.internationalMinutes with retainSpecialFeatures true; an ungrandfathered legacy plan keeps its data but drops to 10 international minutes and loses special features. 'premium' plans get fixed grants of 50 GB and 100 minutes, 'value' plans 15 GB and 0, and the fallback row issues the 'standard' package of 25 GB and 50 minutes, each with a customer-facing description string.
Echoing the original allowances for protected customers is the whole point of grandfathering: the carrier honors sold terms rather than substituting a catalog value. Trimming perks like international minutes for non-protected legacy plans, while the next node offers a modern equivalent, gently narrows the gap between old and current products so migration becomes attractive instead of forced.
| Plan CategoryplanDetails.category | Is GrandfatheredplanDetails.isGrandfathered | Data Allowance (GB)planDetails.dataAllowanceGB | Retain Special FeaturesplanDetails.retainSpecialFeatures | International MinutesplanDetails.internationalMinutes | Plan DescriptionplanDetails.description |
|---|---|---|---|---|---|
| 'legacy' | true | plan.dataAllowance | true | plan.internationalMinutes | 'This is a grandfathered legacy plan with protected benefits.' |
| 'legacy' | false | plan.dataAllowance | false | 10 | 'This is a legacy plan eligible for migration to our current offerings.' |
| 'premium' | - | 50 | true | 100 | 'Premium plan with our highest tier of benefits.' |
| 'value' | - | 15 | false | 0 | 'Value plan with essential features.' |
| - | - | 25 | false | 50 | 'Standard plan with balanced features.' |
Map To Current Catalog
tableCatalog targets are assigned from the same category and grandfathered inputs: protected legacy customers keep their own plan.name and plan.id as the recommendation, while ungrandfathered legacy plans map to 'Telco Essentials Plus' ('PLAN-ESS-001'). 'premium' resolves to 'Telco Premium Unlimited', 'value' to 'Telco Essentials', and the default row to 'Telco Standard' ('PLAN-STD-001').
Collapsing an arbitrary set of legacy names onto five current SKUs is how catalog rationalization actually gets done: billing, care, and CPQ systems all get a single recommendedPlanId to act on instead of parsing historical product names. Passing the untouched plan identity through for grandfathered accounts keeps the mapping table safe to run on every customer, protected or not.
| Plan CategoryplanDetails.category | Is GrandfatheredplanDetails.isGrandfathered | Simplified Plan NamesimplifiedPlanName | Recommended Plan IDrecommendedPlanId |
|---|---|---|---|
| 'legacy' | true | plan.name | plan.id |
| 'legacy' | false | 'Telco Essentials Plus' | 'PLAN-ESS-001' |
| 'premium' | - | 'Telco Premium Unlimited' | 'PLAN-PREM-001' |
| 'value' | - | 'Telco Essentials' | 'PLAN-VAL-001' |
| - | - | 'Telco Standard' | 'PLAN-STD-001' |
Determine Migration Eligibility
tableMigration is the final gate, driven by planDetails.category and planDetails.isGrandfathered. Grandfathered legacy customers get migrationEligible false with the note 'Protected legacy plan - migration not recommended', ungrandfathered legacy plans become eligible with 3 months promotional pricing on Telco Essentials Plus, and the catch-all marks current catalog plans as needing no migration.
Pairing the eligibility flag with ready-made offer text lets retention campaigns act on the output directly, and sweetening the move with a time-boxed promotion instead of forcing it reflects how carriers retire plans without triggering churn or complaints. Excluding protected customers keeps the tool aligned with the tenure commitment made in the identification step.
| Plan CategoryplanDetails.category | Is GrandfatheredplanDetails.isGrandfathered | Migration EligiblemigrationEligible | Migration Offer DetailsmigrationOfferDetails |
|---|---|---|---|
| 'legacy' | true | false | 'Protected legacy plan - migration not recommended' |
| 'legacy' | false | true | 'Eligible for migration to Telco Essentials Plus with 3 months promotional pricing' |
| - | - | false | 'Current catalog plan - no migration needed' |
Omit Fields
expressionResponse shaping happens last: the plan, planDetails, and customer keys are set to null so intermediate working data is stripped and downstream systems receive only the decision outputs, such as simplifiedPlanName, recommendedPlanId, migrationEligible, and migrationOfferDetails. Trimming the payload here keeps internal classification detail from leaking into consuming channels.
nullnullnullOther 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 Legacy Plan Management into GoRules, adjust the rules to your policy, and ship it behind your own API.