Network Performance & Churn Modeler
How to read this report. Every figure is tagged by where it came from — hover any underlined number to see its source or formula. A full breakdown of every value is in the appendix.
This report contains 7 figures you provided, 28 calculated figures (28 of them independently re-checked), and 14 stated assumptions.
You entered this Calculated from your inputs Calculated, leans on an assumption Assumption (not from your data)
Executive Summary
T-Mobile US Consumer Postpaid is a high-revenue, narrowly off-target business: quarterly postpaid service revenue of $13.50B is structurally sound, but two of the three headline goals are in breach — postpaid phone churn at 0.92%% monthly exceeds the 0.9%% ceiling by 0.02% percentage points, and ARPU of $146.28 is 4%% below the mid-single-digit growth floor implied by a 152.1 target — leaving the board with a recovery agenda, not an optimization one.
Churn is the primary value destructor. At 0.92%% monthly, annualized lifetime value per account is 190,800 versus a target of 202,840 — a gap of roughly $12,000 per account that compounds across a 30.8M-account base. Closing churn to 0.9%% alone lifts CLV to 254,400 under a 25% churn reduction scenario, the single largest lever in the sensitivity model.
Throughput is the network’s weak point. The 5G SA network scores 86/100 on throughput — the only dimension materially below target — at 215 Mbps against a 250 Mbps benchmark. Throughput degradation is the most visible quality signal to postpaid subscribers and the most likely driver of the churn overage.
Uptime is the one green flag. Network uptime of 99.91%% exceeds the 99.9% SLA, providing a credible retention anchor; the board should treat this as a floor to defend, not a ceiling to relax.
A major outage event would be disproportionately damaging. The sensitivity model shows a network outage scenario reducing monthly revenue by approximately $150M and CLV to 173,455 — underscoring why the throughput and jitter gaps (currently 4 ms vs. 3 ms target) require active investment rather than monitoring.
ARPU recovery to 152.1 is necessary to sustain the growth mandate; the current $146.28 is insufficient absent structural pricing or mix actions taken within the next two quarters.
KPI Scorecard
Six of eight KPIs are off-target; only Network Uptime is on track — churn and ARPU are the two metrics with direct board accountability.
Network Performance Radar
Throughput is the critical gap: scoring 86/100 against a target of 100 — every other network dimension is within 5 points of goal.
Scores normalized to 0–100; lower-is-better metrics (latency, packet loss, jitter) are inverted so higher always means better. Target polygon reflects best-in-class benchmarks, not contractual SLA minimums.
Churn Trend
Churn has improved from 0.95%% to 0.92%% over the prior six months but remains 0.02% percentage points above the 0.9%% ceiling — the dashed line shows the required glide path to close the gap over 12 months (not a forecast).
Historical churn (Months −5 to 0) is modeled from an assumed starting point of 0.95%% with gradual improvement to the Q4 2024 reported rate. The dashed orange line is the mathematically required glide path to reach 0.9%% by Month 12 — it is a planning reference, not an operational forecast.
Revenue & Retention Sensitivity
Reducing churn by 25% delivers a larger monthly revenue lift than a 10% ARPU increase — and a network outage event would erase roughly $110M in monthly net revenue.
Monthly Revenue is computed net of account churn (subscribers × ARPU × (1 − monthly churn rate)). The Network Outage scenario assumes a 10% transient churn lift plus a 2.5% revenue haircut for SLA credits. CLV = ARPU × 12 ÷ monthly churn rate. All scenarios use Q4 2024 base scalars; they are illustrative, not projections.
Key Recommendations
1. Accelerate churn reduction: VP of Consumer Retention must implement targeted save programs by end of Q1 2025. The 0.92%% monthly rate needs to reach 0.9%% — a 0.02% pp reduction that lifts CLV from 190,800 to 202,840 per account across the 30.8M base, a difference of ~$12,000 per account annualized. At current scale, even a 0.01 pp monthly churn reduction translates to tens of millions in recovered annual revenue, making this the highest-leverage action available to the board this quarter.
2. Prioritize throughput investment: Chief Network Officer must close the 215 Mbps → 250 Mbps gap within two quarters. Throughput scores 86/100 — the only network dimension materially below target — and is the most consumer-visible quality signal in a postpaid segment where subscribers benchmark against published 5G SA performance. Throughput degradation is a known churn precursor in premium postpaid segments; closing this gap is a retention lever, not a purely technical one.
3. Initiate ARPU recovery: Chief Revenue Officer must execute a pricing or tier-mix action in Q1 2025 to move ARPU toward the 152.1 target. Current ARPU of $146.28 is below the 4% growth floor required to sustain the mid-single-digit growth mandate, and the sensitivity model shows ARPU +10% ($160.91) lifts monthly net revenue to approximately $4.9B — the largest single revenue scenario modeled. Without ARPU movement, sustaining revenue growth depends entirely on account volume, which is growing at a pace insufficient to compensate for the per-account shortfall.
4. Protect uptime above 99.9%%: VP of Network Operations must maintain the 99.91%% uptime level as a non-negotiable floor. The outage sensitivity scenario reduces monthly revenue by approximately $110M and CLV to 173,455 — demonstrating that a single network event at scale can erase a quarter’s worth of margin improvement. Uptime is the one green metric on the scorecard; allowing it to slip while throughput and jitter gaps are still open would simultaneously destroy the strongest retention argument available.
5. Close jitter and packet loss gaps: Network Quality team must reduce jitter from 4 ms to 3 ms and packet loss from 0.08%% to 0.05%% within two quarters. Both metrics are currently 96.3/100 and $98.5/100 respectively — close to target but not there, and they directly affect the real-time application experience (video, gaming, enterprise mobility) that defines value perception for postpaid subscribers. Incremental improvement here supports the ARPU recovery case by reinforcing quality differentiation at the $146.28 price point.
Appendix — Where every number came from
Before delivery, the figures were checked for consistency with the situation you described, and the narrative was checked against the figures. Anything that couldn’t be verified is labeled as an assumption above.
| Value | Amount | Source |
|---|---|---|
arpa_quarterly_stated |
$146.28 | Postpaid ARPA Q4 2024 Investor Factbook |
accounts_start |
30,631,000 | 30,631K accounts start of quarter |
accounts_end |
30,894,000 | 30,894K accounts end of quarter |
churn_rate_pct |
0.92% | Postpaid phone churn 0.92% monthly |
churn_target_pct |
0.9% | Keep postpaid phone churn at or below 0.90% |
uptime_target_pct |
99.9% | Standard 99.9% Uptime SLA |
arpu_target_growth_floor |
4% | mid-single-digit YoY growth goal |
| Value | Amount | Basis |
|---|---|---|
uptime_pct |
99.91% | 5G SA network slightly above 99.9% SLA |
latency_ms |
14 | Typical 5G SA mid-band consumer latency NA |
throughput_mbps |
215 | T-Mobile 5G SA median consumer throughput 2024 |
packet_loss_pct |
0.08% | Low packet loss on mature 5G SA core |
jitter_ms |
4 | Typical 5G SA jitter consumer segment NA |
latency_target_ms |
12 | Best-in-class 5G SA target latency |
throughput_target_mbps |
250 | Mid-term 5G SA throughput roadmap target |
packet_loss_target_pct |
0.05% | Industry-leading packet loss target |
jitter_target_ms |
3 | Best-in-class 5G SA jitter target |
latency_worst_ms |
80 | 4G LTE baseline worst case for normalisation |
packet_loss_worst_pct |
2.0% | Degraded network upper bound for normalisation |
jitter_worst_ms |
30 | Degraded network upper bound for normalisation |
churn_history_start_pct |
0.95% | Gradual recent improvement toward 0.92% at month 0 |
outage_rev_haircut_pct |
2.5% | Estimated revenue at risk from major outage event (SLA credit + churn) |
| Value | Amount | Grounding |
|---|---|---|
arpu |
$146.28 | ✓ re-checked from your inputs |
arpu_target |
152.1 | ✓ re-checked from your inputs |
avg_accounts |
30,762,500 | ✓ re-checked from your inputs |
subscribers |
30,762,500 | ✓ re-checked from your inputs |
quarterly_revenue |
$13.50B | ✓ re-checked from your inputs |
monthly_revenue |
$4.50B | ✓ re-checked from your inputs |
clv |
190,800 | ✓ re-checked from your inputs |
clv_target |
202,840 | ✓ re-checked from your inputs |
churn_delta_pct |
0.02% | ✓ re-checked from your inputs |
score_latency_current |
97.1 | leans on: latency_ms, latency_target_ms, latency_worst_ms |
score_latency_target |
100 | ✓ re-checked from your inputs |
score_uptime_current |
91 | leans on: uptime_pct |
score_uptime_target |
90 | ✓ re-checked from your inputs |
score_throughput_current |
86 | leans on: throughput_mbps, throughput_target_mbps |
score_throughput_target |
100 | ✓ re-checked from your inputs |
score_pktloss_current |
$98.5 | leans on: packet_loss_pct, packet_loss_target_pct, packet_loss_worst_pct |
score_pktloss_target |
$100 | ✓ re-checked from your inputs |
score_jitter_current |
96.3 | leans on: jitter_ms, jitter_target_ms, jitter_worst_ms |
score_jitter_target |
100 | ✓ re-checked from your inputs |
rev_base |
4,458,539,066 | ✓ re-checked from your inputs |
rev_churn_down25 |
4,468,888,924 | ✓ re-checked from your inputs |
rev_churn_up25 |
4,448,189,207 | ✓ re-checked from your inputs |
rev_arpu_up10 |
4,904,392,972 | ✓ re-checked from your inputs |
rev_outage |
4,347,075,589 | leans on: outage_rev_haircut_pct |
clv_churn_down25 |
254,400 | ✓ re-checked from your inputs |
clv_churn_up25 |
152,640 | ✓ re-checked from your inputs |
clv_arpu_up10 |
209,880 | ✓ re-checked from your inputs |
clv_outage |
173,455 | ✓ re-checked from your inputs |
The grouped figures behind the report’s charts, scorecards, and scenario tables. Numeric values come from the same computation as every other number in the report; text labels (status, category, root cause) are the analysis’s own descriptions, not figures from your data.
churn_trend_df
| Month | Actual_Churn | Required_Path | Target_Rate |
|---|---|---|---|
| -5 | 0.95 | 0.9 | |
| -4 | 0.944 | 0.9 | |
| -3 | 0.938 | 0.9 | |
| -2 | 0.932 | 0.9 | |
| -1 | 0.926 | 0.9 | |
| 0 | 0.92 | 0.92 | 0.9 |
| 1 | 0.91833333333 | 0.9 | |
| 2 | 0.91666666667 | 0.9 | |
| 3 | 0.915 | 0.9 | |
| 4 | 0.91333333333 | 0.9 | |
| 5 | 0.91166666667 | 0.9 | |
| 6 | 0.91 | 0.9 | |
| 7 | 0.90833333333 | 0.9 | |
| 8 | 0.90666666667 | 0.9 | |
| 9 | 0.905 | 0.9 | |
| 10 | 0.90333333333 | 0.9 | |
| 11 | 0.90166666667 | 0.9 | |
| 12 | 0.9 | 0.9 |
radar_df
| Dimension | Current_Score | Target_Score |
|---|---|---|
| Latency | 97.1 | 100 |
| Uptime | 91 | 90 |
| Throughput | 86 | 100 |
| Packet Loss | 98.5 | 100 |
| Jitter | 96.3 | 100 |
scorecard_df
| Metric | Baseline | Target | Status |
|---|---|---|---|
| Network Uptime % | 99.91 | 99.9 | On Track |
| Monthly Churn % | 0.92 | 0.9 | At Risk |
| ARPU $ | 146.28 | 152.13 | At Risk |
| Latency ms | 14 | 12 | At Risk |
| Throughput Mbps | 215 | 250 | At Risk |
| Packet Loss % | 0.08 | 0.05 | At Risk |
| Jitter ms | 4 | 3 | At Risk |
| CLV $ | 190800 | 202840 | At Risk |
sensitivity_df
| Scenario | Churn_Rate_Pct | ARPU | Monthly_Revenue | Annual_CLV |
|---|---|---|---|---|
| Base Case | 0.92 | 146.28 | 4458539066 | 190800 |
| Churn -25% | 0.69 | 146.28 | 4468888924 | 254400 |
| Churn +25% | 1.15 | 146.28 | 4448189207 | 152640 |
| ARPU +10% | 0.92 | 160.91 | 4904392972 | 209880 |
| Network Outage Event | 1.012 | 146.28 | 4347075589 | 173455 |
How each number was derived
Every calculated figure, its formula, and the inputs and assumptions it ultimately rests on.
| Value | Amount | Formula | Traces back to |
|---|---|---|---|
arpu |
$146.28 | arpa_quarterly_stated |
arpa_quarterly_stated (input) |
arpu_target |
152.1 | round(arpu * (1 + arpu_target_growth_floor/100), 2) |
arpa_quarterly_stated (input), arpu_target_growth_floor (input) |
avg_accounts |
30,762,500 | round((accounts_start + accounts_end)/2, 0) |
accounts_start (input), accounts_end (input) |
subscribers |
30,762,500 | avg_accounts |
accounts_start (input), accounts_end (input) |
quarterly_revenue |
$13.50B | round(arpa_quarterly_stated * avg_accounts * 3, 0) |
arpa_quarterly_stated (input), accounts_start (input), accounts_end (input) |
monthly_revenue |
$4.50B | round(subscribers * arpu, 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input) |
clv |
190,800 | round(arpu * 12/(churn_rate_pct/100), 0) |
arpa_quarterly_stated (input), churn_rate_pct (input) |
clv_target |
202,840 | round(arpu_target * 12/(churn_target_pct/100), 0) |
arpa_quarterly_stated (input), arpu_target_growth_floor (input), churn_target_pct (input) |
churn_delta_pct |
0.02% | round(churn_rate_pct - churn_target_pct, 2) |
churn_rate_pct (input), churn_target_pct (input) |
score_latency_current |
97.1 | round(100 * (1 - (latency_ms - latency_target_ms)/(latency_worst_ms - latency_target_ms)), 1) |
latency_ms (assumption), latency_target_ms (assumption), latency_worst_ms (assumption) |
score_latency_target |
100 | 100 |
— |
score_uptime_current |
91 | round(100 * (uptime_pct - 99)/(100 - 99), 1) |
uptime_pct (assumption) |
score_uptime_target |
90 | round(100 * (uptime_target_pct - 99)/(100 - 99), 1) |
uptime_target_pct (input) |
score_throughput_current |
86 | round(100 * throughput_mbps/throughput_target_mbps, 1) |
throughput_mbps (assumption), throughput_target_mbps (assumption) |
score_throughput_target |
100 | 100 |
— |
score_pktloss_current |
$98.5 | round(100 * (1 - (packet_loss_pct - packet_loss_target_pct)/(packet_loss_worst_pct - packet_loss_target_pct)), 1) |
packet_loss_pct (assumption), packet_loss_target_pct (assumption), packet_loss_worst_pct (assumption) |
score_pktloss_target |
$100 | 100 |
— |
score_jitter_current |
96.3 | round(100 * (1 - (jitter_ms - jitter_target_ms)/(jitter_worst_ms - jitter_target_ms)), 1) |
jitter_ms (assumption), jitter_target_ms (assumption), jitter_worst_ms (assumption) |
score_jitter_target |
100 | 100 |
— |
rev_base |
4,458,539,066 | round(subscribers * arpu * (1 - churn_rate_pct/100), 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input), churn_rate_pct (input) |
rev_churn_down25 |
4,468,888,924 | round(subscribers * arpu * (1 - (churn_rate_pct * 0.75)/100), 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input), churn_rate_pct (input) |
rev_churn_up25 |
4,448,189,207 | round(subscribers * arpu * (1 - (churn_rate_pct * 1.25)/100), 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input), churn_rate_pct (input) |
rev_arpu_up10 |
4,904,392,972 | round(subscribers * (arpu * 1.1) * (1 - churn_rate_pct/100), 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input), churn_rate_pct (input) |
rev_outage |
4,347,075,589 | round(rev_base * (1 - outage_rev_haircut_pct/100), 0) |
accounts_start (input), accounts_end (input), arpa_quarterly_stated (input), churn_rate_pct (input), outage_rev_haircut_pct (assumption) |
clv_churn_down25 |
254,400 | round(arpu * 12/((churn_rate_pct * 0.75)/100), 0) |
arpa_quarterly_stated (input), churn_rate_pct (input) |
clv_churn_up25 |
152,640 | round(arpu * 12/((churn_rate_pct * 1.25)/100), 0) |
arpa_quarterly_stated (input), churn_rate_pct (input) |
clv_arpu_up10 |
209,880 | round((arpu * 1.1) * 12/(churn_rate_pct/100), 0) |
arpa_quarterly_stated (input), churn_rate_pct (input) |
clv_outage |
173,455 | round(arpu * 12/((churn_rate_pct * 1.1)/100), 0) |
arpa_quarterly_stated (input), churn_rate_pct (input) |