TELEGENT AI
MethodologyRevenue Recovery Score™
Scoring System Specification

Revenue Recovery Score™ Methodology

The complete technical specification: exact piecewise formulas, weighted scoring categories, industry normalization factors, benchmark ranges, and implementation pseudocode.

This document is the authoritative reference for implementing the Revenue Recovery Score™ in software. Every formula, threshold, and weight is defined with sufficient precision for engineering teams to build against.

Scoring Architecture Overview

Two-Layer Scoring Model

Layer 1 — Sub-Factors
CCall Answer Rate0.10-0.35
RResponse Time Velocity0.20-0.30
QLead Qualification Rate0.10-0.30
FFollow-Up Completion0.10-0.25
SAppointment Conversion0.10-0.25
Layer 2 — Composite
RRS = C·wc + R·wr + Q·wq + F·wf + S·ws
Weighted linear combination, 0-100
Σ weights = 1.0Weights vary by industry
5-Tier Classification
90-100Revenue Recovery Leader
75-89Strong Performer
50-74Moderate Leakage
25-49At Risk
0-24Critical

Exact Formulas — All 5 Sub-Factors

Precise piecewise functions with variable definitions and scoring rubrics.

C — Missed Call Recovery

Weight: Variable (0.10-0.35)

// C — Missed Call Recovery Formula
C = 100 × (1 − missedCallRate) × afterHoursPenalty
Variable Definitions
missedCallRateUnanswered calls ÷ total inbound calls
afterHoursPenalty1.0 if business-hours coverage ≥ 95%; 0.85 if 70-94%; 0.65 if < 70%
Scoring Rubric (0-100)
100≥ 98% answer rate with full after-hours coverageEvery call captured.
80-9985-97% answer rateStrong capture, minor leakage.
60-7970-84% answer rateModerate leakage — 1 in 4 calls missed.
40-5950-69% answer rateSignificant leakage — half the calls lost.
20-3930-49% answer rateMajor leakage — most calls unanswered.
0-19< 30% answer rateCritical — essentially no phone coverage.

R — Response Time Velocity

Weight: Variable (0.20-0.30)

// R — Response Time Velocity Formula
R = 100 × e^(−k × avgResponseMinutes)
Variable Definitions
avgResponseMinutesWeighted average first-response time across voice (40%), web (30%), SMS (20%), email (10%)
kDecay constant: 0.0693 (half-life = 10 minutes)
Scoring Rubric (0-100)
95-100Avg response < 30 secondsInstant. Industry-leading.
85-9430-60 secondsExcellent response velocity.
70-841-5 minutesGood. Within the conversion window.
50-695-30 minutesAverage. Conversion decay accelerating.
25-4930 minutes - 2 hoursSlow. Significant conversion loss.
0-242+ hours or no responseCritical. Leads have moved to competitors.

Q — Lead Qualification Rate

Weight: Variable (0.10-0.30)

// Q — Lead Qualification Rate Formula
Q = 100 × (qualifiedLeads ÷ totalInquiries) × qualificationDepthFactor
Variable Definitions
qualifiedLeadsLeads that pass a documented qualification process
totalInquiriesAll inbound inquiries across all channels
qualificationDepthFactor1.0 if multi-criteria scoring used; 0.75 if single-criterion; 0.50 if no formal process
Scoring Rubric (0-100)
90-100≥ 90% qualified + multi-criteria scoringWorld-class lead intelligence.
75-8975-89% qualifiedStrong qualification discipline.
60-7460-74% qualifiedAdequate, with identified gaps.
40-5940-59% qualifiedWeak. Sales time wasted on unqualified leads.
20-3920-39% qualifiedPoor. No systematic qualification.
0-19< 20% qualified or no processCritical. Every lead treated identically.

F — Follow-Up Completion

Weight: Variable (0.10-0.25)

// F — Follow-Up Completion Formula
F = 100 × (leadsWithFollowUp ÷ totalUnconvertedLeads) × channelMultiplier
Variable Definitions
leadsWithFollowUpUnconverted leads receiving ≥ 2 contact attempts within 48 hours
totalUnconvertedLeadsAll leads that did not convert on first contact
channelMultiplier1.0 if ≥ 3 channels used; 0.80 if 2 channels; 0.60 if 1 channel; 0.40 if no follow-up system
Scoring Rubric (0-100)
90-100≥ 95% follow-up rate + multi-channel (3+)Zero leads abandoned.
75-8980-94% follow-upStrong nurture cadence.
55-7460-79% follow-upModerate. 1 in 4 leads abandoned.
35-5430-59% follow-upWeak. Most leads receive no second touch.
15-3410-29% follow-upPoor. Systematic abandonment.
0-14< 10% follow-upCritical. No nurture whatsoever.

S — Appointment Conversion

Weight: Variable (0.10-0.25)

// S — Appointment Conversion Formula
S = 100 × (bookedAppointments ÷ qualifiedLeads) × (1 − noShowRate) × bookingEaseFactor
Variable Definitions
bookedAppointmentsConfirmed appointments from qualified leads
qualifiedLeadsLeads that passed qualification
noShowRateAppointments not attended without prior cancellation
bookingEaseFactor1.0 if self-service online booking; 0.85 if mixed; 0.65 if phone/email only; 0.50 if no formal scheduling
Scoring Rubric (0-100)
90-100≥ 70% conversion + < 5% no-show + self-serviceFrictionless scheduling engine.
75-8950-69% conversionStrong scheduling operation.
55-7435-49% conversionAverage. Friction exists.
35-5420-34% conversionWeak. Scheduling loses many qualified leads.
15-3410-19% conversionPoor. The scheduling process kills deals.
0-14< 10% conversionCritical. Unbookable.

Industry Normalization Factors

Different industries have different revenue levers. The weighting model adjusts accordingly.

Weight Matrix by Industry

The default weight set (C=0.30, R=0.25, Q=0.20, F=0.15, S=0.10) is the "general business" baseline. Industry-specific weights are applied based on the audited company's primary sector. All weight sets satisfy Σ = 1.0 and all w ∈ [0.10, 0.35].

IndustryC (Call)R (Response)Q (Qualification)F (Follow-Up)S (Scheduling)Rationale
Behavioral Health & Recovery0.350.200.200.150.10Call-driven admissions; phone answer rate is the dominant revenue lever.
Home Healthcare0.300.250.200.150.10Referral-heavy; response time to hospital discharges is critical.
Medical Practice0.250.200.150.150.25Scheduling efficiency dominates — no-shows directly destroy revenue.
Legal0.300.250.250.100.10High-value leads; qualification accuracy prevents wasted partner time.
HVAC / Plumbing / Electrical0.350.300.100.150.10Emergency-driven; call answer rate and response speed define revenue.
Roofing0.250.250.200.200.10Longer sales cycles; follow-up persistence closes deals.
Real Estate0.250.300.150.150.15Speed-to-lead dominant; 5-minute response window defines outcomes.
SaaS / Technology0.100.200.250.250.20Digital-first; qualification and nurture conversion matter most.
Insurance0.200.250.250.200.10Complex qualification required; wrong-fit leads waste underwriting time.
Financial Services0.150.200.300.200.15Regulatory qualification gates; accuracy trumps speed.
Multi-Location Enterprise0.250.200.150.150.10Standardized; remaining 15% allocated to location-variance penalty factor.
Call-Dominant

Behavioral Health, Trades — phone is the primary revenue channel. C + R weights exceed 0.60 combined.

Qualification-Dominant

Legal, Financial Services, Insurance — wrong-fit leads are expensive. Q weight rises to 0.25-0.30.

Scheduling-Dominant

Medical Practice, SaaS — conversion lives in the booking flow. S weight rises to 0.20-0.25.

Industry Benchmarks — Top Quartile

75th-percentile scores by industry, derived from aggregate audit data. Use these as reference targets.

IndustryRRSCRQFSKey Insight
Behavioral Health829288857872Call-driven; high answer rates but scheduling friction from insurance verification.
Home Healthcare798885827570Referral networks buffer leakage; response time to hospital discharges is the critical lever.
Medical Practice767872746885Strong scheduling; weak on call answer and follow-up.
Legal748572806271High-value leads but notoriously slow response.
HVAC / Plumbing / Electrical686570556075Emergency calls drive urgency, but many shops under-index on phone coverage.
Roofing717268707468Follow-up persistence wins; longer sales cycles reward nurture.
Real Estate737062686578Speed-to-lead is the single biggest variable in agent performance.
SaaS804575888582Phone is minor; digital qualification and nurture dominate.
Benchmarks represent 75th-percentile scores from audited organizations in each vertical. Updated quarterly.

Worked Example — Mid-Market HVAC Company

A complete walkthrough of the Revenue Recovery Score™ calculation.

Raw Data (30-Day Period)

Total inbound calls840
Missed calls168(20%)
After-hours call coverage0%No after-hours answering
Avg response time12 minutesBusiness hours only
Web form submissions120
Web forms responded < 5 min18(15%)
Leads qualified320Single-criterion (budget only)
Total inquiries960All channels
Leads with 2+ follow-ups180SMS + email
Unconverted leads720
Booked appointments160Phone-only booking
No-shows40(25%)
Channels for follow-up2SMS, email
Self-service bookingNoPhone/email only
IndustryHVACWeight set: C=0.35, R=0.30, Q=0.10, F=0.15, S=0.10

Step-by-Step Calculation

C — Call Answer Rate

52
Answer rate = (840 − 168) ÷ 840 = 0.80
After-hours coverage = 0%, penalty = 0.65
C = 100 × 0.80 × 0.65 = 52.0

R — Response Time Velocity

44
avgResponseMinutes = 12
k = 0.0693
R = 100 × e^(−0.0693 × 12) = 100 × e^(−0.8316)
  = 100 × 0.4353 = 43.5

Q — Lead Qualification Rate

25
Qual rate = 320 ÷ 960 = 0.333
Single-criterion → depthFactor = 0.75
Q = 100 × 0.333 × 0.75 = 25.0

F — Follow-Up Completion

20
Follow-up rate = 180 ÷ 720 = 0.25
2 channels → channelMult = 0.80
F = 100 × 0.25 × 0.80 = 20.0

S — Appointment Conversion

24
Conversion rate = 160 ÷ 320 = 0.50
Show rate = 1 − (40 ÷ 160) = 0.75
Phone-only → bookingFactor = 0.65
S = 100 × 0.50 × 0.75 × 0.65 = 24.4

Revenue Recovery Score™ — HVAC Weights

C = 52.0 × 0.35= 18.20
R = 43.5 × 0.30= 13.05
Q = 25.0 × 0.10= 2.50
F = 20.0 × 0.15= 3.00
S = 24.4 × 0.10= 2.44
Revenue Recovery Score™39
At RiskMajor leakage. 30-50%+ of revenue recoverable with systemic intervention.

Implementation Reference — TypeScript

Production-ready pseudocode for engineering teams. Complete, typed, and self-documenting.

Step 1: Collect Raw Metrics

TypeScript
function collectMetrics(companyId: string): RawMetrics {
  return {
    totalCalls:        fetchPhoneSystemLogs(companyId, period).inbound,
    missedCalls:       fetchPhoneSystemLogs(companyId, period).missed,
    afterHoursCalls:   fetchPhoneSystemLogs(companyId, period).afterHours,
    afterHoursAnswered:fetchPhoneSystemLogs(companyId, period).afterHoursAnswered,
    webInquiries:      fetchCRM(companyId, period).webFormSubmissions,
    webResponses:      fetchCRM(companyId, period).webFormResponses,
    smsInquiries:      fetchMessagingLogs(companyId, period).smsInbound,
    smsResponses:      fetchMessagingLogs(companyId, period).smsResponses,
    emailInquiries:    fetchCRM(companyId, period).emailInbound,
    emailResponses:    fetchCRM(companyId, period).emailResponses,
    avgResponseTimeMs: fetchCRMTimestamps(companyId, period).avgFirstResponse,
    qualifiedLeads:    fetchCRM(companyId, period).qualifiedCount,
    totalInquiries:    fetchCRM(companyId, period).totalInquiries,
    leadsWithFollowUp: fetchCRM(companyId, period).followedUpCount,
    unconvertedLeads:  fetchCRM(companyId, period).unconvertedCount,
    bookedAppts:       fetchScheduling(companyId, period).booked,
    noShows:           fetchScheduling(companyId, period).noShows,
    channelsUsed:      detectFollowUpChannels(companyId, period),
    hasMultiCriteria:  detectQualificationMethod(companyId),
    hasSelfService:    detectBookingMethod(companyId),
    industry:          fetchCompanyProfile(companyId).industry,
  };
}

Step 2: Calculate Sub-Factor Scores (0-100 each)

TypeScript
function scoreCallAnswer(m: RawMetrics): number {
  const answerRate = (m.totalCalls - m.missedCalls) / m.totalCalls;
  const afterHoursCoverage = m.afterHoursAnswered / m.afterHoursCalls;
  const afterHoursPenalty = afterHoursCoverage >= 0.95 ? 1.0
                         : afterHoursCoverage >= 0.70 ? 0.85
                         : 0.65;
  return clamp(100 * answerRate * afterHoursPenalty, 0, 100);
}

function scoreResponseTime(m: RawMetrics): number {
  // Exponential decay: half-life = 10 minutes
  const avgMinutes = m.avgResponseTimeMs / 60000;
  const k = 0.0693; // ln(2) / 10
  return clamp(100 * Math.exp(-k * avgMinutes), 0, 100);
}

function scoreQualification(m: RawMetrics): number {
  const qualRate = m.qualifiedLeads / m.totalInquiries;
  const depthFactor = m.hasMultiCriteria ? 1.0
                    : m.hasQualification ? 0.75
                    : 0.50;
  return clamp(100 * qualRate * depthFactor, 0, 100);
}

function scoreFollowUp(m: RawMetrics): number {
  const followUpRate = m.leadsWithFollowUp / m.unconvertedLeads;
  const channelMult = m.channelsUsed >= 3 ? 1.0
                    : m.channelsUsed >= 2 ? 0.80
                    : m.channelsUsed >= 1 ? 0.60
                    : 0.40;
  return clamp(100 * followUpRate * channelMult, 0, 100);
}

function scoreScheduling(m: RawMetrics): number {
  const conversionRate = m.bookedAppts / m.qualifiedLeads;
  const showRate = 1 - (m.noShows / m.bookedAppts);
  const bookingFactor = m.hasSelfService ? 1.0
                      : m.hasMixedBooking ? 0.85
                      : m.hasPhoneBooking ? 0.65
                      : 0.50;
  return clamp(100 * conversionRate * showRate * bookingFactor, 0, 100);
}

Step 3: Apply Industry-Specific Weights

TypeScript
const INDUSTRY_WEIGHTS: Record<string, Weights> = {
  "behavioral-health": { c: 0.35, r: 0.20, q: 0.20, f: 0.15, s: 0.10 },
  "home-healthcare":   { c: 0.30, r: 0.25, q: 0.20, f: 0.15, s: 0.10 },
  "medical-practice":  { c: 0.25, r: 0.20, q: 0.15, f: 0.15, s: 0.25 },
  "legal":             { c: 0.30, r: 0.25, q: 0.25, f: 0.10, s: 0.10 },
  "hvac":              { c: 0.35, r: 0.30, q: 0.10, f: 0.15, s: 0.10 },
  "plumbing":          { c: 0.35, r: 0.30, q: 0.10, f: 0.15, s: 0.10 },
  "electrical":        { c: 0.35, r: 0.30, q: 0.10, f: 0.15, s: 0.10 },
  "roofing":           { c: 0.25, r: 0.25, q: 0.20, f: 0.20, s: 0.10 },
  "real-estate":       { c: 0.25, r: 0.30, q: 0.15, f: 0.15, s: 0.15 },
  "saas":              { c: 0.10, r: 0.20, q: 0.25, f: 0.25, s: 0.20 },
  "insurance":         { c: 0.20, r: 0.25, q: 0.25, f: 0.20, s: 0.10 },
  "financial-services":{ c: 0.15, r: 0.20, q: 0.30, f: 0.20, s: 0.15 },
  "enterprise":        { c: 0.25, r: 0.20, q: 0.15, f: 0.15, s: 0.10 },
};
const DEFAULT_WEIGHTS = { c: 0.30, r: 0.25, q: 0.20, f: 0.15, s: 0.10 };

function getWeights(industry: string): Weights {
  return INDUSTRY_WEIGHTS[industry] || DEFAULT_WEIGHTS;
}

Step 4: Compute Revenue Recovery Score™

TypeScript
interface RRSResult {
  score: number;            // 0-100 composite
  tier: string;             // "Leader" | "Strong" | "Moderate" | "At Risk" | "Critical"
  subScores: SubScores;     // Individual factor scores
  weights: Weights;         // Applied weights
  industry: string;         // Industry used for normalization
}

interface SubScores {
  callAnswer: number;       // C — Missed Call Recovery, 0-100
  responseTime: number;     // R — Response Time Velocity, 0-100
  qualification: number;    // Q — Lead Qualification Rate, 0-100
  followUp: number;         // F — Follow-Up Completion, 0-100
  scheduling: number;       // S — Appointment Conversion, 0-100
}

function computeRRS(companyId: string): RRSResult {
  const m = collectMetrics(companyId);
  const weights = getWeights(m.industry);

  const subScores: SubScores = {
    callAnswer:    scoreCallAnswer(m),
    responseTime:  scoreResponseTime(m),
    qualification: scoreQualification(m),
    followUp:      scoreFollowUp(m),
    scheduling:    scoreScheduling(m),
  };

  const score = clamp(
    subScores.callAnswer    * weights.c +
    subScores.responseTime  * weights.r +
    subScores.qualification * weights.q +
    subScores.followUp      * weights.f +
    subScores.scheduling    * weights.s,
    0, 100
  );

  return {
    score: Math.round(score),
    tier: classifyTier(score),
    subScores,
    weights,
    industry: m.industry,
  };
}

function classifyTier(score: number): string {
  if (score >= 90) return "Revenue Recovery Leader";
  if (score >= 75) return "Strong Performer";
  if (score >= 50) return "Moderate Leakage";
  if (score >= 25) return "At Risk";
  return "Critical";
}

function clamp(value: number, min: number, max: number): number {
  return Math.max(min, Math.min(max, value));
}

Step 5: Multi-Location Aggregation

TypeScript
function computeMultiLocationRRS(locationIds: string[]): MultiLocationResult {
  const results = locationIds.map(id => computeRRS(id));

  return {
    enterpriseScore: weightedAverage(results, "revenue"),  // Revenue-weighted
    locationScores: results,
    best: results.reduce((a, b) => a.score > b.score ? a : b),
    worst: results.reduce((a, b) => a.score < b.score ? a : b),
    variance: calculateVariance(results),
    atRiskLocations: results.filter(r => r.score < 50),
  };
}

Implementation Notes

Data freshness: Metrics should be recalculated on a rolling 30-day window. Cache with a 24-hour TTL.
Ingestion: Phone system, CRM, scheduling platform, and messaging logs must expose timestamped event data via API or webhook.
Industry classification: Derived from company profile at audit intake. Industry can be overridden per location in multi-location deployments.
Score history: Store all historical RRS values to power trend lines in the Revenue Command Center™. Minimum: 12 months of monthly snapshots.
Threshold alerts: Trigger notification when RRS drops by ≥ 5 points month-over-month or crosses a tier boundary downward (e.g., "Strong" → "Moderate").

Ready to See Your Revenue Recovery Score™?

This methodology powers every audit. Request yours and receive a complete executive assessment within 48 hours.

Generated by TELEGENT AI™

The Business Impact Platform™

Workforce Intelligence™ For Businesses That Want More Impact.

© 2026 TELEGENT AI™

All Rights Reserved.

Confidential and Proprietary. Prepared exclusively for the recipient organization. This report contains proprietary TELEGENT AI™ methodologies, scoring models, and business intelligence frameworks. No part of this document may be reproduced, distributed, or transmitted without the prior written permission of TELEGENT AI™.

TELEGENT AI
Business Consultant
TELEGENT AI
Welcome. I'm your TELEGENT AI business consultant — I specialize in helping organizations identify where automation can recover revenue, reduce operational drag, and accelerate growth.

Here's what I can do for you in the next few minutes:

Revenue Recovery Assessment — quantify how much revenue you're losing to missed calls, slow response times, and operational gaps
Automation Readiness Diagnostic — evaluate where intelligent automation would deliver the highest ROI in your organization
Solution Recommendation — based on your size, industry, and goals, I'll recommend the right TELEGENT engagement tier
Industry-Specific Analysis — tailored insights for your vertical (healthcare, real estate, legal, professional services, and more)

All conversations are confidential and diagnostic in nature. Where would you like to start?
Confidential Diagnostic No obligation