v2.0

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

Watch the launch videoWatch

Customer Eligibility Engine

Intelligent system that analyzes customer data to determine service upgrades, loyalty rewards, and premium features based on usage patterns and account history.

Solution

This telecom decision engine evaluates customer profiles to create personalized upgrade paths and special offers. The system assigns loyalty tiers based on account longevity and spending patterns, with corresponding discount percentages ranging from 5% to 20%. It automatically identifies eligibility for service upgrades by analyzing account standing, contract status, and tier level.

The engine calculates special offer eligibility in real-time based on actual usage metrics, identifying customers who would benefit from international calling bundles, data boosters, or family plans. For high-value customers, the system activates premium features like priority support, content streaming, international roaming, and concierge services. The solution delivers clear upgrade messaging that customer service representatives can use during interactions, creating a consistent experience across all touchpoints.

How it works

The decision graph processes customer data through five key evaluation stages:

  1. Account Status Evaluation: Analyzes account age, payment history, and contract status to determine if the customer is in good standing.
  2. Loyalty Tier Assignment: Categorizes customers into platinum, gold, silver, bronze, or standard tiers based on tenure, spending habits, and account status.
  3. Upgrade Eligibility Analysis: Determines upgrade options by examining loyalty tier, contract status, and account standing, with special rules for contract renewal periods.
  4. Special Offers Generation: Identifies relevant offers based on usage patterns, including international calling bundles for high-minute users and data boosters for customers approaching usage limits.
  5. Premium Features Allocation: Activates premium service features based on loyalty tier and eligibility criteria, with a tiered approach to feature availability.

Where teams use it

  • Customer retention campaigns targeting contract renewal periods
  • Upsell initiatives for underutilized service features
  • Automated service upgrade recommendations during customer interactions
  • Loyalty program management and tiered rewards distribution
  • Personalized offer generation based on usage patterns
  • Premium service feature allocation and management

Inside the decision model

Customer Eligibility Engine ships as a JDM decision graph with 6 nodes, 4 decision tables and 24 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph6 nodes · read-only
input requesttable evaluateAccountStatustable determineLoyaltyTiertable determineUpgradeEligibilityexpression determineSpecialOfferstable determinePremiumFeatures
01

Request

input

Three request blocks feed the evaluation: accountInfo (accountAge, paymentHistory, monthlySpend, contractStatus) drives standing and tier, usageStats (callMinutes, dataUtilizationPercent) drives offers, and customerProfile supplies the devices list used for family-plan targeting.

Sample requestJSON
{
  "customerId": "CUST12345",
  "accountInfo": {
    "accountAge": 28,
    "paymentHistory": "excellent",
    "currentPlan": "Family Premium 50GB",
    "monthlySpend": 95,
    "contractStatus": "pending_renewal"
  },
  "usageStats": {
    "dataUsageGB": 42.5,
    "dataUtilizationPercent": 85,
    "callMinutes": 350,
    "textMessages": 1250
  },
  "customerProfile": {
    "segment": "consumer",
    "location": "Seattle, WA",
    "devices": [
      "iPhone 14",
      "iPad Air",
      "Apple Watch"
    ],
    "previousComplaints": 0
  }
}
02

Evaluate Account Status

table

Standing is graded first, using a first hit policy over accountInfo.accountAge, paymentHistory, and contractStatus. Accounts of 24 months or more with 'excellent' payments earn "excellent" status regardless of contract; 12 and 6 month tenures qualify as "good" or "fair" when payments are at least 'good' or 'fair' and the contract is 'active' or 'pending_renewal'. Younger accounts under 6 months can still reach "fair" if payments are clean and the contract is 'active', while an 'expired' contract forces "poor" with goodStanding false, and anything unmatched lands in "review".

Tenure-plus-payment scoring is how carriers separate credit risk from loyalty: a long, cleanly paid account is safe to upsell, while an expired contract means there is no active billing relationship to build on. Sending unclassifiable accounts to "review" rather than approving them keeps edge cases in front of a human instead of silently granting eligibility.

Decision tablefirst hit policy
Account Age (Months)accountInfo.accountAgePayment HistoryaccountInfo.paymentHistoryContract StatusaccountInfo.contractStatusAccount Statuseligibility.accountStatusIn Good Standingeligibility.goodStanding
>= 24'excellent'-"excellent"true
>= 12'excellent', 'good''active', 'pending_renewal'"good"true
>= 6'excellent', 'good', 'fair''active', 'pending_renewal'"fair"true
< 6'excellent', 'good''active'"fair"true
-'poort'-"poor"false
--'expired'"poor"false

+1 more row in the downloadable template

03

Determine Loyalty Tier

table

Tiering runs top-down with a first hit policy so the richest match wins: "platinum" needs 36 or more months of tenure, monthlySpend of at least 120, and 'excellent' status, earning a 20 percent loyaltyDiscountPercent. "gold" (24 months, spend 80) pays 15, "silver" (12 months, spend 50) pays 10, "bronze" (6 months, spend 30, any status) pays 5, and the catch-all row assigns "standard" with 0.

Pairing tenure with monthly spend is standard loyalty design: either signal alone is gameable, but together they identify accounts whose lifetime value justifies a margin giveback. The 5-to-20 percent ladder is a business calibration rather than an industry constant, sized so the top discount stays well below the revenue gap between a 120-dollar and a 30-dollar account.

Decision tablefirst hit policy
Account Age (Months)accountInfo.accountAgeMonthly Spend ($)accountInfo.monthlySpendAccount Statuseligibility.accountStatusLoyalty Tiereligibility.loyaltyTierLoyalty Discounteligibility.loyaltyDiscountPercent
>= 36>= 120'excellent'"platinum"20
>= 24>= 80'excellent', 'good'"gold"15
>= 12>= 50'excellent', 'good', 'fair'"silver"10
>= 6>= 30-"bronze"5
---"standard"0
04

Determine Upgrade Eligibility

table

Upgrade paths depend on three signals: eligibility.goodStanding, eligibility.loyaltyTier, and a contract condition expression testing accountInfo.contractStatus == 'pending_renewal' or 'ending_soon'. Platinum and gold customers in good standing get canUpgrade and premiumPlanEligible, and if their contract is in the renewal window they also unlock earlyUpgradeEligible with the message "High-priority upgrade eligible. Offers for all plan categories." Silver needs the renewal window for a standard upgrade, bronze and standard tiers only qualify when the contract is 'ending_soon', and goodStanding false blocks upgrades entirely.

Concentrating the best offers in the 'pending_renewal' and 'ending_soon' windows mirrors how retention actually works: churn risk spikes when a commitment lapses, so that is when an early device upgrade is worth its subsidy cost. Restricting proactive premium offers to the top two tiers keeps acquisition-style spend pointed at the accounts most likely to repay it.

Decision tablefirst hit policy
Good Standingeligibility.goodStandingLoyalty Tiereligibility.loyaltyTierContract ConditionEligible For Upgradeeligibility.canUpgradePremium Plan Eligibleeligibility.premiumPlanEligibleEarly Upgrade Eligibleeligibility.earlyUpgradeEligibleUpgrade Messageeligibility.upgradeMessage
true['platinum', 'gold']accountInfo.contractStatus == 'pending_renewal' or accountInfo.contractStatus == 'ending_soon'truetruetrue"High-priority upgrade eligible. Offers for all plan categories."
true['platinum', 'gold']-truetruefalse"Premium plan upgrade eligible based on customer tier."
true['silver']accountInfo.contractStatus == 'pending_renewal' or accountInfo.contractStatus == 'ending_soon'truefalsefalse"Standard upgrade eligible based on contract status."
true['bronze', 'standard']accountInfo.contractStatus == 'ending_soon'truefalsefalse"Basic upgrade eligible as contract is ending."
false--falsefalsefalse"Not eligible for upgrades due to account standing."
---falsefalsefalse"Standard eligibility rules apply."
05

Determine Special Offers

expression

Offer flags are computed directly from behavior: internationalBundle fires when usageStats.callMinutes > 300, dataBooster when dataUtilizationPercent > 80, familyPlan when len(customerProfile.devices) >= 3, and deviceUpgrade and loyaltyReward reuse the eligibility results from earlier nodes. offerCount then counts the true flags, and that count feeds the premium features table as a proxy for how engaged the customer is.

Expressions2 fields
eligibility.specialOffers{ "internationalBundle": usageStats.callMinutes > 300, "dataBooster": usageStats.dataUtilizationPercent > 80, "familyPlan": len(customerProfile.devices) >= 3, "deviceUpgrade": eligibility.canUpgrade, "loyaltyReward": eligibility.loyaltyTier in ["platinum", "gold", "silver"] }
eligibility.offerCountlen(filter(values($.eligibility.specialOffers), # == true))
06

Determine Premium Features

table

Feature entitlements are unlocked tier by tier under a first hit policy, with eligibility.offerCount acting as an engagement gate. "platinum" customers in good standing with 3 or more active offers get all four flags, prioritySupport through conciergeService; "gold" with at least 2 offers loses only the concierge, "silver" with 1 keeps prioritySupport and contentStreaming, and "bronze" gets prioritySupport alone. Any account where goodStanding is false, or that matches nothing, receives no features and an explanatory features.message.

Granting perks like internationalRoaming and concierge service only where tier and engagement overlap is a sensible cost control: these features carry real servicing cost, so tying them to customers who already qualify for multiple offers keeps them aimed at accounts the carrier most wants to retain. The message column gives support reps a ready-made explanation for why a feature is or is not available.

Decision tablefirst hit policy
Loyalty Tiereligibility.loyaltyTierGood Standingeligibility.goodStandingSpecial Offer Counteligibility.offerCountPriority Supportfeatures.prioritySupportContent Streamingfeatures.contentStreamingInternational Roamingfeatures.internationalRoamingConcierge Servicefeatures.conciergeServiceFeatures Messagefeatures.message
['platinum']true>= 3truetruetruetrue"All premium features available based on platinum status."
['gold']true>= 2truetruetruefalse"Most premium features available based on gold status."
['silver']true>= 1truetruefalsefalse"Selected premium features available based on silver status."
['bronze']true-truefalsefalsefalse"Basic premium features available based on bronze status."
-false-falsefalsefalsefalse"No premium features available due to account standing."
---falsefalsefalsefalse"No premium features available."

Make this template
your own.

Load Customer Eligibility Engine into GoRules, adjust the rules to your policy, and ship it behind your own API.