Files
palladium/studies/202512_GenesysCX/seed_data.py
Robert Helewka 64fb83257d 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
2026-06-10 14:26:49 -04:00

232 lines
9.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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 A1A4. 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 B1B8. 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 C1C6. 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 D1D3. $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 E1E3. 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 F1F5. 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 G1G3. 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