feat: add GenesysCX study and fix Streamlit chart key collisions
- Add 202512_GenesysCX TEI study (config, seed data, notebooks, README) with NPV $10.8M / ROI 266% including AI-token cost line - Add explicit `key` parameter to all chart wrappers in app/components to prevent StreamlitDuplicateElementId errors when the same figure type renders across Summary/Benefits/Costs tabs - Render benefits bar and cost pie charts on their respective tabs - Add benefits_vs_costs_by_year chart wrapper
This commit is contained in:
231
studies/202512_GenesysCX/seed_data.py
Normal file
231
studies/202512_GenesysCX/seed_data.py
Normal file
@@ -0,0 +1,231 @@
|
||||
"""
|
||||
Seed dataset for the Genesys CX Cloud TEI (Forrester, Dec 2025).
|
||||
|
||||
"The Total Economic Impact™ Of CX Cloud — Cost Savings And Business
|
||||
Benefits Enabled By Genesys And Salesforce" (commissioned by Genesys and
|
||||
Salesforce). Composite: global supply company, $2.5B revenue, 10,000
|
||||
employees, 600 CX agents (400 concurrent licenses), 80,000 weekly
|
||||
interactions averaging 12 minutes.
|
||||
|
||||
Each row uses the friendly value shape accepted by
|
||||
``core.tei_client.TEIClient.update_values``. Benefit values are *nominal*
|
||||
(pre-risk-adjustment); Athena applies the field-level risk adjustment.
|
||||
Cost values are nominal too — push them pre-multiplied by
|
||||
``(1 + risk_adjustment)`` per the Palladium convention (Athena never
|
||||
risk-adjusts costs).
|
||||
|
||||
Published headline (3-yr risk-adjusted, 10% discount)::
|
||||
|
||||
Benefits PV $14,840,638
|
||||
Costs PV $ 4,057,170
|
||||
NPV $10,783,468
|
||||
ROI 266%
|
||||
Payback ~4 months (computed; the study does not headline it)
|
||||
|
||||
Athena discounts Year-0 "Initial" amounts as Year-1 cashflows (Forrester
|
||||
leaves Year 0 undiscounted). With this study's large initial cost
|
||||
($1,309,000 risk-adjusted) that difference is material, so this module
|
||||
also exports ``ATHENA_EXPECTED`` — the totals Athena *should* produce
|
||||
under its own discounting. Verification: match ATHENA_EXPECTED tightly
|
||||
(pipeline correctness), then reconcile to PUBLISHED with the explained
|
||||
Year-0 delta.
|
||||
|
||||
NOTE on the published PDF: the Total Costs table (p.14) prints the
|
||||
implementation initial as $1,304,600, but the detail table, the cash-flow
|
||||
analysis, and the math (1,190,000 × 1.10) all give $1,309,000 — the p.14
|
||||
figure is a typo in the study.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
#: 3-year nominal benefit cashflows. Risk adjustment stored separately.
|
||||
BENEFITS: list[dict] = [
|
||||
{
|
||||
"field_key": "legacy_retirement",
|
||||
"table": "benefits",
|
||||
"label": "Retirement of legacy systems with CX Cloud adoption",
|
||||
"category": "Cost Savings",
|
||||
"year_values": {"1": 680_000, "2": 930_000, "3": 930_000},
|
||||
"risk_adjustment": 0.05,
|
||||
"notes": (
|
||||
"PDF A1–A4. Telephony $250k Y1 ramping to $500k (legacy "
|
||||
"sunset completes mid-Y1) + WFM/recording/transcription apps "
|
||||
"$100k + reduced dev effort $230k (2,400 hrs @ $94) + reduced "
|
||||
"platform mgmt $100k (1,500 hrs @ $65). Risk adj 5%."
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "self_service_savings",
|
||||
"table": "benefits",
|
||||
"label": (
|
||||
"Cost savings from reallocated workers and avoided seasonal "
|
||||
"hires with increased customer self-service"
|
||||
),
|
||||
"category": "Productivity",
|
||||
"year_values": {"1": 2_329_600, "2": 2_329_600, "3": 2_329_600},
|
||||
"risk_adjustment": 0.15,
|
||||
"notes": (
|
||||
"PDF B1–B8. Self-service completion 15%→25% on 80k weekly "
|
||||
"interactions → 8,000 deflected/week → 40 FTEs @ $58,240 "
|
||||
"fully burdened. Risk adj 15%. (PDF B7 formula cites B2 where "
|
||||
"the 12-min interaction length is meant; 40 FTEs is correct.)"
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "agent_efficiency",
|
||||
"table": "benefits",
|
||||
"label": "CX agent efficiency gains",
|
||||
"category": "Productivity",
|
||||
"year_values": {"1": 2_912_000, "2": 2_912_000, "3": 2_912_000},
|
||||
"risk_adjustment": 0.10,
|
||||
"notes": (
|
||||
"PDF C1–C6. MTTR 12→10 min on 60k agent-handled interactions "
|
||||
"per week → 104,000 hrs/yr @ $28 fully burdened. Risk adj 10%."
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "agent_assist_sales",
|
||||
"table": "benefits",
|
||||
"label": "Incremental sales from agent assist capabilities",
|
||||
"category": "Revenue",
|
||||
"year_values": {"1": 600_000, "2": 600_000, "3": 600_000},
|
||||
"risk_adjustment": 0.05,
|
||||
"notes": (
|
||||
"PDF D1–D3. $500M revenue impacted (20% of $2.5B) × 1.5% lift "
|
||||
"× 8% gross margin. Risk adj 5%."
|
||||
),
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
#: Costs are nominal; push × (1 + risk_adjustment). "initial" is the
|
||||
#: Year-0 component (companion non-annual field in Athena).
|
||||
COSTS: list[dict] = [
|
||||
{
|
||||
"field_key": "cx_cloud_licenses",
|
||||
"table": "costs",
|
||||
"label": "CX Cloud solution costs (licenses)",
|
||||
"category": "Subscription",
|
||||
"initial": 0,
|
||||
"year_values": {"1": 840_000, "2": 840_000, "3": 840_000},
|
||||
"risk_adjustment": 0.05,
|
||||
"notes": (
|
||||
"PDF E1–E3. Genesys Cloud CX 2 $170/user/mo + Salesforce "
|
||||
"Voice $25/user/mo + connector $25/user/mo, 400 concurrent "
|
||||
"users, 20% contractual discount → $650k + $95k + $95k. "
|
||||
"Risk adj +5%. Seat licenses ONLY — AI consumption is a "
|
||||
"separate line (genesys_ai_tokens)."
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "implementation",
|
||||
"table": "costs",
|
||||
"label": "Implementation and deployment cost",
|
||||
"category": "Implementation",
|
||||
"initial": 1_190_000,
|
||||
"year_values": {"1": 0, "2": 0, "3": 0},
|
||||
"risk_adjustment": 0.10,
|
||||
"notes": (
|
||||
"PDF F1–F5. 10-week implementation: 20 FTEs @ $80/hr fully "
|
||||
"burdened ($640k) + $550k professional services. Risk adj "
|
||||
"+10% → $1,309,000 (the p.14 Total Costs table's $1,304,600 "
|
||||
"is a typo in the study)."
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "ongoing_management",
|
||||
"table": "costs",
|
||||
"label": "Ongoing management costs",
|
||||
"category": "Operations",
|
||||
"initial": 0,
|
||||
"year_values": {"1": 202_800, "2": 202_800, "3": 202_800},
|
||||
"risk_adjustment": 0.10,
|
||||
"notes": (
|
||||
"PDF G1–G3. 5 people @ 30% time (12 hrs/wk) @ $65/hr. "
|
||||
"Risk adj +10%."
|
||||
),
|
||||
},
|
||||
{
|
||||
"field_key": "genesys_ai_tokens",
|
||||
"table": "costs",
|
||||
"label": "Genesys AI Experience token consumption",
|
||||
"category": "Subscription",
|
||||
"initial": 0,
|
||||
"year_values": {"1": 0, "2": 0, "3": 0},
|
||||
"risk_adjustment": 0.0,
|
||||
"notes": (
|
||||
"NOT in the published study — Forrester modeled $0 AI "
|
||||
"consumption even though benefits B (self-service uplift), "
|
||||
"C (AI coaching/assist), and D (agent assist upsell) all "
|
||||
"depend on AI capabilities that Genesys bills via AI "
|
||||
"Experience tokens. Seeded at $0 to reproduce the published "
|
||||
"totals. For client cases, enter the negotiated annual token "
|
||||
"cost from the Genesys quote and document the quote details "
|
||||
"(token volume, unit price, tier) in these notes."
|
||||
),
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
#: Composite-organization drivers — for scaling to a specific client.
|
||||
ASSUMPTIONS: dict = {
|
||||
"annual_revenue": 2_500_000_000,
|
||||
"employees": 10_000,
|
||||
"agents_fte": 600,
|
||||
"concurrent_licenses": 400,
|
||||
"weekly_interactions": 80_000,
|
||||
"interaction_minutes": 12,
|
||||
"self_service_rate_before": 0.15,
|
||||
"self_service_rate_after": 0.25,
|
||||
"mttr_saved_minutes": 2,
|
||||
"agent_hourly_rate": 28,
|
||||
"agent_annual_salary": 58_240,
|
||||
"revenue_impacted": 500_000_000,
|
||||
"revenue_lift": 0.015,
|
||||
"gross_margin": 0.08,
|
||||
"discount_rate": 0.10,
|
||||
"analysis_years": 3,
|
||||
}
|
||||
|
||||
|
||||
# ────────────────────────────────────────────────────────────────────
|
||||
# Genesys AI Experience tokens
|
||||
#
|
||||
# Genesys bills AI consumption in "AI Experience tokens" — pricing is
|
||||
# tiered, capability-dependent, and deal-specific. Athena stores a
|
||||
# single annual cost value per line, and so do we: enter the negotiated
|
||||
# annual figure from the Genesys quote into ``genesys_ai_tokens`` and
|
||||
# document the quote details (volume, unit price, tier) in the field
|
||||
# notes. For sizing context, the study's own drivers imply ~1,040,000
|
||||
# self-service interactions/yr (B5 × 52) and ~3,120,000 agent-assisted
|
||||
# interactions/yr (C1 × 52) would draw tokens.
|
||||
# ────────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
# ────────────────────────────────────────────────────────────────────
|
||||
# Verification targets
|
||||
# ────────────────────────────────────────────────────────────────────
|
||||
|
||||
#: Published Forrester totals (3-yr risk-adjusted PV @ 10%).
|
||||
PUBLISHED: dict = {
|
||||
"total_benefits_pv": 14_840_638,
|
||||
"total_costs_pv": 4_057_170,
|
||||
"net_present_value": 10_783_468,
|
||||
"roi_percentage": 266,
|
||||
}
|
||||
|
||||
#: What Athena should produce given its own discounting (Year-0 initial
|
||||
#: treated as a Year-1 cashflow: implementation PV = 1,309,000 / 1.10 =
|
||||
#: 1,190,000 instead of 1,309,000). Match these tightly; the difference
|
||||
#: vs PUBLISHED is methodology, not error.
|
||||
ATHENA_EXPECTED: dict = {
|
||||
"total_benefits_pv": 14_840_640,
|
||||
"total_costs_pv": 3_938_170,
|
||||
"net_present_value": 10_902_470,
|
||||
"roi_percentage": 276.8,
|
||||
}
|
||||
|
||||
|
||||
def all_values() -> list[dict]:
|
||||
"""Return BENEFITS + COSTS — single-call payload for update_values."""
|
||||
return BENEFITS + COSTS
|
||||
Reference in New Issue
Block a user