mirror of
https://github.com/wshobson/agents.git
synced 2026-03-18 17:47:16 +00:00
feat: add 5 new specialized agents with 20 skills
Add domain expert agents with comprehensive skill sets: - service-mesh-expert (cloud-infrastructure): Istio/Linkerd patterns, mTLS, observability - event-sourcing-architect (backend-development): CQRS, event stores, projections, sagas - vector-database-engineer (llm-application-dev): embeddings, similarity search, hybrid search - monorepo-architect (developer-essentials): Nx, Turborepo, Bazel, pnpm workspaces - threat-modeling-expert (security-scanning): STRIDE, attack trees, security requirements Update all documentation to reflect correct counts: - 67 plugins, 99 agents, 107 skills, 71 commands
This commit is contained in:
423
plugins/business-analytics/skills/data-storytelling/SKILL.md
Normal file
423
plugins/business-analytics/skills/data-storytelling/SKILL.md
Normal file
@@ -0,0 +1,423 @@
|
||||
---
|
||||
name: data-storytelling
|
||||
description: Transform data into compelling narratives using visualization, context, and persuasive structure. Use when presenting analytics to stakeholders, creating data reports, or building executive presentations.
|
||||
---
|
||||
|
||||
# Data Storytelling
|
||||
|
||||
Transform raw data into compelling narratives that drive decisions and inspire action.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
- Presenting analytics to executives
|
||||
- Creating quarterly business reviews
|
||||
- Building investor presentations
|
||||
- Writing data-driven reports
|
||||
- Communicating insights to non-technical audiences
|
||||
- Making recommendations based on data
|
||||
|
||||
## Core Concepts
|
||||
|
||||
### 1. Story Structure
|
||||
|
||||
```
|
||||
Setup → Conflict → Resolution
|
||||
|
||||
Setup: Context and baseline
|
||||
Conflict: The problem or opportunity
|
||||
Resolution: Insights and recommendations
|
||||
```
|
||||
|
||||
### 2. Narrative Arc
|
||||
|
||||
```
|
||||
1. Hook: Grab attention with surprising insight
|
||||
2. Context: Establish the baseline
|
||||
3. Rising Action: Build through data points
|
||||
4. Climax: The key insight
|
||||
5. Resolution: Recommendations
|
||||
6. Call to Action: Next steps
|
||||
```
|
||||
|
||||
### 3. Three Pillars
|
||||
|
||||
| Pillar | Purpose | Components |
|
||||
|--------|---------|------------|
|
||||
| **Data** | Evidence | Numbers, trends, comparisons |
|
||||
| **Narrative** | Meaning | Context, causation, implications |
|
||||
| **Visuals** | Clarity | Charts, diagrams, highlights |
|
||||
|
||||
## Story Frameworks
|
||||
|
||||
### Framework 1: The Problem-Solution Story
|
||||
|
||||
```markdown
|
||||
# Customer Churn Analysis
|
||||
|
||||
## The Hook
|
||||
"We're losing $2.4M annually to preventable churn."
|
||||
|
||||
## The Context
|
||||
- Current churn rate: 8.5% (industry average: 5%)
|
||||
- Average customer lifetime value: $4,800
|
||||
- 500 customers churned last quarter
|
||||
|
||||
## The Problem
|
||||
Analysis of churned customers reveals a pattern:
|
||||
- 73% churned within first 90 days
|
||||
- Common factor: < 3 support interactions
|
||||
- Low feature adoption in first month
|
||||
|
||||
## The Insight
|
||||
[Show engagement curve visualization]
|
||||
Customers who don't engage in the first 14 days
|
||||
are 4x more likely to churn.
|
||||
|
||||
## The Solution
|
||||
1. Implement 14-day onboarding sequence
|
||||
2. Proactive outreach at day 7
|
||||
3. Feature adoption tracking
|
||||
|
||||
## Expected Impact
|
||||
- Reduce early churn by 40%
|
||||
- Save $960K annually
|
||||
- Payback period: 3 months
|
||||
|
||||
## Call to Action
|
||||
Approve $50K budget for onboarding automation.
|
||||
```
|
||||
|
||||
### Framework 2: The Trend Story
|
||||
|
||||
```markdown
|
||||
# Q4 Performance Analysis
|
||||
|
||||
## Where We Started
|
||||
Q3 ended with $1.2M MRR, 15% below target.
|
||||
Team morale was low after missed goals.
|
||||
|
||||
## What Changed
|
||||
[Timeline visualization]
|
||||
- Oct: Launched self-serve pricing
|
||||
- Nov: Reduced friction in signup
|
||||
- Dec: Added customer success calls
|
||||
|
||||
## The Transformation
|
||||
[Before/after comparison chart]
|
||||
| Metric | Q3 | Q4 | Change |
|
||||
|----------------|--------|--------|--------|
|
||||
| Trial → Paid | 8% | 15% | +87% |
|
||||
| Time to Value | 14 days| 5 days | -64% |
|
||||
| Expansion Rate | 2% | 8% | +300% |
|
||||
|
||||
## Key Insight
|
||||
Self-serve + high-touch creates compound growth.
|
||||
Customers who self-serve AND get a success call
|
||||
have 3x higher expansion rate.
|
||||
|
||||
## Going Forward
|
||||
Double down on hybrid model.
|
||||
Target: $1.8M MRR by Q2.
|
||||
```
|
||||
|
||||
### Framework 3: The Comparison Story
|
||||
|
||||
```markdown
|
||||
# Market Opportunity Analysis
|
||||
|
||||
## The Question
|
||||
Should we expand into EMEA or APAC first?
|
||||
|
||||
## The Comparison
|
||||
[Side-by-side market analysis]
|
||||
|
||||
### EMEA
|
||||
- Market size: $4.2B
|
||||
- Growth rate: 8%
|
||||
- Competition: High
|
||||
- Regulatory: Complex (GDPR)
|
||||
- Language: Multiple
|
||||
|
||||
### APAC
|
||||
- Market size: $3.8B
|
||||
- Growth rate: 15%
|
||||
- Competition: Moderate
|
||||
- Regulatory: Varied
|
||||
- Language: Multiple
|
||||
|
||||
## The Analysis
|
||||
[Weighted scoring matrix visualization]
|
||||
|
||||
| Factor | Weight | EMEA Score | APAC Score |
|
||||
|-------------|--------|------------|------------|
|
||||
| Market Size | 25% | 5 | 4 |
|
||||
| Growth | 30% | 3 | 5 |
|
||||
| Competition | 20% | 2 | 4 |
|
||||
| Ease | 25% | 2 | 3 |
|
||||
| **Total** | | **2.9** | **4.1** |
|
||||
|
||||
## The Recommendation
|
||||
APAC first. Higher growth, less competition.
|
||||
Start with Singapore hub (English, business-friendly).
|
||||
Enter EMEA in Year 2 with localization ready.
|
||||
|
||||
## Risk Mitigation
|
||||
- Timezone coverage: Hire 24/7 support
|
||||
- Cultural fit: Local partnerships
|
||||
- Payment: Multi-currency from day 1
|
||||
```
|
||||
|
||||
## Visualization Techniques
|
||||
|
||||
### Technique 1: Progressive Reveal
|
||||
|
||||
```markdown
|
||||
Start simple, add layers:
|
||||
|
||||
Slide 1: "Revenue is growing" [single line chart]
|
||||
Slide 2: "But growth is slowing" [add growth rate overlay]
|
||||
Slide 3: "Driven by one segment" [add segment breakdown]
|
||||
Slide 4: "Which is saturating" [add market share]
|
||||
Slide 5: "We need new segments" [add opportunity zones]
|
||||
```
|
||||
|
||||
### Technique 2: Contrast and Compare
|
||||
|
||||
```markdown
|
||||
Before/After:
|
||||
┌─────────────────┬─────────────────┐
|
||||
│ BEFORE │ AFTER │
|
||||
│ │ │
|
||||
│ Process: 5 days│ Process: 1 day │
|
||||
│ Errors: 15% │ Errors: 2% │
|
||||
│ Cost: $50/unit │ Cost: $20/unit │
|
||||
└─────────────────┴─────────────────┘
|
||||
|
||||
This/That (emphasize difference):
|
||||
┌─────────────────────────────────────┐
|
||||
│ CUSTOMER A vs B │
|
||||
│ ┌──────────┐ ┌──────────┐ │
|
||||
│ │ ████████ │ │ ██ │ │
|
||||
│ │ $45,000 │ │ $8,000 │ │
|
||||
│ │ LTV │ │ LTV │ │
|
||||
│ └──────────┘ └──────────┘ │
|
||||
│ Onboarded No onboarding │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Technique 3: Annotation and Highlight
|
||||
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
import pandas as pd
|
||||
|
||||
fig, ax = plt.subplots(figsize=(12, 6))
|
||||
|
||||
# Plot the main data
|
||||
ax.plot(dates, revenue, linewidth=2, color='#2E86AB')
|
||||
|
||||
# Add annotation for key events
|
||||
ax.annotate(
|
||||
'Product Launch\n+32% spike',
|
||||
xy=(launch_date, launch_revenue),
|
||||
xytext=(launch_date, launch_revenue * 1.2),
|
||||
fontsize=10,
|
||||
arrowprops=dict(arrowstyle='->', color='#E63946'),
|
||||
color='#E63946'
|
||||
)
|
||||
|
||||
# Highlight a region
|
||||
ax.axvspan(growth_start, growth_end, alpha=0.2, color='green',
|
||||
label='Growth Period')
|
||||
|
||||
# Add threshold line
|
||||
ax.axhline(y=target, color='gray', linestyle='--',
|
||||
label=f'Target: ${target:,.0f}')
|
||||
|
||||
ax.set_title('Revenue Growth Story', fontsize=14, fontweight='bold')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
## Presentation Templates
|
||||
|
||||
### Template 1: Executive Summary Slide
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ KEY INSIGHT │
|
||||
│ ══════════════════════════════════════════════════════════│
|
||||
│ │
|
||||
│ "Customers who complete onboarding in week 1 │
|
||||
│ have 3x higher lifetime value" │
|
||||
│ │
|
||||
├──────────────────────┬──────────────────────────────────────┤
|
||||
│ │ │
|
||||
│ THE DATA │ THE IMPLICATION │
|
||||
│ │ │
|
||||
│ Week 1 completers: │ ✓ Prioritize onboarding UX │
|
||||
│ • LTV: $4,500 │ ✓ Add day-1 success milestones │
|
||||
│ • Retention: 85% │ ✓ Proactive week-1 outreach │
|
||||
│ • NPS: 72 │ │
|
||||
│ │ Investment: $75K │
|
||||
│ Others: │ Expected ROI: 8x │
|
||||
│ • LTV: $1,500 │ │
|
||||
│ • Retention: 45% │ │
|
||||
│ • NPS: 34 │ │
|
||||
│ │ │
|
||||
└──────────────────────┴──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Template 2: Data Story Flow
|
||||
|
||||
```
|
||||
Slide 1: THE HEADLINE
|
||||
"We can grow 40% faster by fixing onboarding"
|
||||
|
||||
Slide 2: THE CONTEXT
|
||||
Current state metrics
|
||||
Industry benchmarks
|
||||
Gap analysis
|
||||
|
||||
Slide 3: THE DISCOVERY
|
||||
What the data revealed
|
||||
Surprising finding
|
||||
Pattern identification
|
||||
|
||||
Slide 4: THE DEEP DIVE
|
||||
Root cause analysis
|
||||
Segment breakdowns
|
||||
Statistical significance
|
||||
|
||||
Slide 5: THE RECOMMENDATION
|
||||
Proposed actions
|
||||
Resource requirements
|
||||
Timeline
|
||||
|
||||
Slide 6: THE IMPACT
|
||||
Expected outcomes
|
||||
ROI calculation
|
||||
Risk assessment
|
||||
|
||||
Slide 7: THE ASK
|
||||
Specific request
|
||||
Decision needed
|
||||
Next steps
|
||||
```
|
||||
|
||||
### Template 3: One-Page Dashboard Story
|
||||
|
||||
```markdown
|
||||
# Monthly Business Review: January 2024
|
||||
|
||||
## THE HEADLINE
|
||||
Revenue up 15% but CAC increasing faster than LTV
|
||||
|
||||
## KEY METRICS AT A GLANCE
|
||||
┌────────┬────────┬────────┬────────┐
|
||||
│ MRR │ NRR │ CAC │ LTV │
|
||||
│ $125K │ 108% │ $450 │ $2,200 │
|
||||
│ ▲15% │ ▲3% │ ▲22% │ ▲8% │
|
||||
└────────┴────────┴────────┴────────┘
|
||||
|
||||
## WHAT'S WORKING
|
||||
✓ Enterprise segment growing 25% MoM
|
||||
✓ Referral program driving 30% of new logos
|
||||
✓ Support satisfaction at all-time high (94%)
|
||||
|
||||
## WHAT NEEDS ATTENTION
|
||||
✗ SMB acquisition cost up 40%
|
||||
✗ Trial conversion down 5 points
|
||||
✗ Time-to-value increased by 3 days
|
||||
|
||||
## ROOT CAUSE
|
||||
[Mini chart showing SMB vs Enterprise CAC trend]
|
||||
SMB paid ads becoming less efficient.
|
||||
CPC up 35% while conversion flat.
|
||||
|
||||
## RECOMMENDATION
|
||||
1. Shift $20K/mo from paid to content
|
||||
2. Launch SMB self-serve trial
|
||||
3. A/B test shorter onboarding
|
||||
|
||||
## NEXT MONTH'S FOCUS
|
||||
- Launch content marketing pilot
|
||||
- Complete self-serve MVP
|
||||
- Reduce time-to-value to < 7 days
|
||||
```
|
||||
|
||||
## Writing Techniques
|
||||
|
||||
### Headlines That Work
|
||||
|
||||
```markdown
|
||||
BAD: "Q4 Sales Analysis"
|
||||
GOOD: "Q4 Sales Beat Target by 23% - Here's Why"
|
||||
|
||||
BAD: "Customer Churn Report"
|
||||
GOOD: "We're Losing $2.4M to Preventable Churn"
|
||||
|
||||
BAD: "Marketing Performance"
|
||||
GOOD: "Content Marketing Delivers 4x ROI vs. Paid"
|
||||
|
||||
Formula:
|
||||
[Specific Number] + [Business Impact] + [Actionable Context]
|
||||
```
|
||||
|
||||
### Transition Phrases
|
||||
|
||||
```markdown
|
||||
Building the narrative:
|
||||
• "This leads us to ask..."
|
||||
• "When we dig deeper..."
|
||||
• "The pattern becomes clear when..."
|
||||
• "Contrast this with..."
|
||||
|
||||
Introducing insights:
|
||||
• "The data reveals..."
|
||||
• "What surprised us was..."
|
||||
• "The inflection point came when..."
|
||||
• "The key finding is..."
|
||||
|
||||
Moving to action:
|
||||
• "This insight suggests..."
|
||||
• "Based on this analysis..."
|
||||
• "The implication is clear..."
|
||||
• "Our recommendation is..."
|
||||
```
|
||||
|
||||
### Handling Uncertainty
|
||||
|
||||
```markdown
|
||||
Acknowledge limitations:
|
||||
• "With 95% confidence, we can say..."
|
||||
• "The sample size of 500 shows..."
|
||||
• "While correlation is strong, causation requires..."
|
||||
• "This trend holds for [segment], though [caveat]..."
|
||||
|
||||
Present ranges:
|
||||
• "Impact estimate: $400K-$600K"
|
||||
• "Confidence interval: 15-20% improvement"
|
||||
• "Best case: X, Conservative: Y"
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
- **Start with the "so what"** - Lead with insight
|
||||
- **Use the rule of three** - Three points, three comparisons
|
||||
- **Show, don't tell** - Let data speak
|
||||
- **Make it personal** - Connect to audience goals
|
||||
- **End with action** - Clear next steps
|
||||
|
||||
### Don'ts
|
||||
- **Don't data dump** - Curate ruthlessly
|
||||
- **Don't bury the insight** - Front-load key findings
|
||||
- **Don't use jargon** - Match audience vocabulary
|
||||
- **Don't show methodology first** - Context, then method
|
||||
- **Don't forget the narrative** - Numbers need meaning
|
||||
|
||||
## Resources
|
||||
|
||||
- [Storytelling with Data (Cole Nussbaumer)](https://www.storytellingwithdata.com/)
|
||||
- [The Pyramid Principle (Barbara Minto)](https://www.amazon.com/Pyramid-Principle-Logic-Writing-Thinking/dp/0273710516)
|
||||
- [Resonate (Nancy Duarte)](https://www.duarte.com/resonate/)
|
||||
426
plugins/business-analytics/skills/kpi-dashboard-design/SKILL.md
Normal file
426
plugins/business-analytics/skills/kpi-dashboard-design/SKILL.md
Normal file
@@ -0,0 +1,426 @@
|
||||
---
|
||||
name: kpi-dashboard-design
|
||||
description: Design effective KPI dashboards with metrics selection, visualization best practices, and real-time monitoring patterns. Use when building business dashboards, selecting metrics, or designing data visualization layouts.
|
||||
---
|
||||
|
||||
# KPI Dashboard Design
|
||||
|
||||
Comprehensive patterns for designing effective Key Performance Indicator (KPI) dashboards that drive business decisions.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
- Designing executive dashboards
|
||||
- Selecting meaningful KPIs
|
||||
- Building real-time monitoring displays
|
||||
- Creating department-specific metrics views
|
||||
- Improving existing dashboard layouts
|
||||
- Establishing metric governance
|
||||
|
||||
## Core Concepts
|
||||
|
||||
### 1. KPI Framework
|
||||
|
||||
| Level | Focus | Update Frequency | Audience |
|
||||
|-------|-------|------------------|----------|
|
||||
| **Strategic** | Long-term goals | Monthly/Quarterly | Executives |
|
||||
| **Tactical** | Department goals | Weekly/Monthly | Managers |
|
||||
| **Operational** | Day-to-day | Real-time/Daily | Teams |
|
||||
|
||||
### 2. SMART KPIs
|
||||
|
||||
```
|
||||
Specific: Clear definition
|
||||
Measurable: Quantifiable
|
||||
Achievable: Realistic targets
|
||||
Relevant: Aligned to goals
|
||||
Time-bound: Defined period
|
||||
```
|
||||
|
||||
### 3. Dashboard Hierarchy
|
||||
|
||||
```
|
||||
├── Executive Summary (1 page)
|
||||
│ ├── 4-6 headline KPIs
|
||||
│ ├── Trend indicators
|
||||
│ └── Key alerts
|
||||
├── Department Views
|
||||
│ ├── Sales Dashboard
|
||||
│ ├── Marketing Dashboard
|
||||
│ ├── Operations Dashboard
|
||||
│ └── Finance Dashboard
|
||||
└── Detailed Drilldowns
|
||||
├── Individual metrics
|
||||
└── Root cause analysis
|
||||
```
|
||||
|
||||
## Common KPIs by Department
|
||||
|
||||
### Sales KPIs
|
||||
|
||||
```yaml
|
||||
Revenue Metrics:
|
||||
- Monthly Recurring Revenue (MRR)
|
||||
- Annual Recurring Revenue (ARR)
|
||||
- Average Revenue Per User (ARPU)
|
||||
- Revenue Growth Rate
|
||||
|
||||
Pipeline Metrics:
|
||||
- Sales Pipeline Value
|
||||
- Win Rate
|
||||
- Average Deal Size
|
||||
- Sales Cycle Length
|
||||
|
||||
Activity Metrics:
|
||||
- Calls/Emails per Rep
|
||||
- Demos Scheduled
|
||||
- Proposals Sent
|
||||
- Close Rate
|
||||
```
|
||||
|
||||
### Marketing KPIs
|
||||
|
||||
```yaml
|
||||
Acquisition:
|
||||
- Cost Per Acquisition (CPA)
|
||||
- Customer Acquisition Cost (CAC)
|
||||
- Lead Volume
|
||||
- Marketing Qualified Leads (MQL)
|
||||
|
||||
Engagement:
|
||||
- Website Traffic
|
||||
- Conversion Rate
|
||||
- Email Open/Click Rate
|
||||
- Social Engagement
|
||||
|
||||
ROI:
|
||||
- Marketing ROI
|
||||
- Campaign Performance
|
||||
- Channel Attribution
|
||||
- CAC Payback Period
|
||||
```
|
||||
|
||||
### Product KPIs
|
||||
|
||||
```yaml
|
||||
Usage:
|
||||
- Daily/Monthly Active Users (DAU/MAU)
|
||||
- Session Duration
|
||||
- Feature Adoption Rate
|
||||
- Stickiness (DAU/MAU)
|
||||
|
||||
Quality:
|
||||
- Net Promoter Score (NPS)
|
||||
- Customer Satisfaction (CSAT)
|
||||
- Bug/Issue Count
|
||||
- Time to Resolution
|
||||
|
||||
Growth:
|
||||
- User Growth Rate
|
||||
- Activation Rate
|
||||
- Retention Rate
|
||||
- Churn Rate
|
||||
```
|
||||
|
||||
### Finance KPIs
|
||||
|
||||
```yaml
|
||||
Profitability:
|
||||
- Gross Margin
|
||||
- Net Profit Margin
|
||||
- EBITDA
|
||||
- Operating Margin
|
||||
|
||||
Liquidity:
|
||||
- Current Ratio
|
||||
- Quick Ratio
|
||||
- Cash Flow
|
||||
- Working Capital
|
||||
|
||||
Efficiency:
|
||||
- Revenue per Employee
|
||||
- Operating Expense Ratio
|
||||
- Days Sales Outstanding
|
||||
- Inventory Turnover
|
||||
```
|
||||
|
||||
## Dashboard Layout Patterns
|
||||
|
||||
### Pattern 1: Executive Summary
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ EXECUTIVE DASHBOARD [Date Range ▼] │
|
||||
├─────────────┬─────────────┬─────────────┬─────────────────┤
|
||||
│ REVENUE │ PROFIT │ CUSTOMERS │ NPS SCORE │
|
||||
│ $2.4M │ $450K │ 12,450 │ 72 │
|
||||
│ ▲ 12% │ ▲ 8% │ ▲ 15% │ ▲ 5pts │
|
||||
├─────────────┴─────────────┴─────────────┴─────────────────┤
|
||||
│ │
|
||||
│ Revenue Trend │ Revenue by Product │
|
||||
│ ┌───────────────────────┐ │ ┌──────────────────┐ │
|
||||
│ │ /\ /\ │ │ │ ████████ 45% │ │
|
||||
│ │ / \ / \ /\ │ │ │ ██████ 32% │ │
|
||||
│ │ / \/ \ / \ │ │ │ ████ 18% │ │
|
||||
│ │ / \/ \ │ │ │ ██ 5% │ │
|
||||
│ └───────────────────────┘ │ └──────────────────┘ │
|
||||
│ │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 🔴 Alert: Churn rate exceeded threshold (>5%) │
|
||||
│ 🟡 Warning: Support ticket volume 20% above average │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Pattern 2: SaaS Metrics Dashboard
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ SAAS METRICS Jan 2024 [Monthly ▼] │
|
||||
├──────────────────────┬──────────────────────────────────────┤
|
||||
│ ┌────────────────┐ │ MRR GROWTH │
|
||||
│ │ MRR │ │ ┌────────────────────────────────┐ │
|
||||
│ │ $125,000 │ │ │ /── │ │
|
||||
│ │ ▲ 8% │ │ │ /────/ │ │
|
||||
│ └────────────────┘ │ │ /────/ │ │
|
||||
│ ┌────────────────┐ │ │ /────/ │ │
|
||||
│ │ ARR │ │ │ /────/ │ │
|
||||
│ │ $1,500,000 │ │ └────────────────────────────────┘ │
|
||||
│ │ ▲ 15% │ │ J F M A M J J A S O N D │
|
||||
│ └────────────────┘ │ │
|
||||
├──────────────────────┼──────────────────────────────────────┤
|
||||
│ UNIT ECONOMICS │ COHORT RETENTION │
|
||||
│ │ │
|
||||
│ CAC: $450 │ Month 1: ████████████████████ 100% │
|
||||
│ LTV: $2,700 │ Month 3: █████████████████ 85% │
|
||||
│ LTV/CAC: 6.0x │ Month 6: ████████████████ 80% │
|
||||
│ │ Month 12: ██████████████ 72% │
|
||||
│ Payback: 4 months │ │
|
||||
├──────────────────────┴──────────────────────────────────────┤
|
||||
│ CHURN ANALYSIS │
|
||||
│ ┌──────────┬──────────┬──────────┬──────────────────────┐ │
|
||||
│ │ Gross │ Net │ Logo │ Expansion │ │
|
||||
│ │ 4.2% │ 1.8% │ 3.1% │ 2.4% │ │
|
||||
│ └──────────┴──────────┴──────────┴──────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Pattern 3: Real-time Operations
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ OPERATIONS CENTER Live ● Last: 10:42:15 │
|
||||
├────────────────────────────┬────────────────────────────────┤
|
||||
│ SYSTEM HEALTH │ SERVICE STATUS │
|
||||
│ ┌──────────────────────┐ │ │
|
||||
│ │ CPU MEM DISK │ │ ● API Gateway Healthy │
|
||||
│ │ 45% 72% 58% │ │ ● User Service Healthy │
|
||||
│ │ ███ ████ ███ │ │ ● Payment Service Degraded │
|
||||
│ │ ███ ████ ███ │ │ ● Database Healthy │
|
||||
│ │ ███ ████ ███ │ │ ● Cache Healthy │
|
||||
│ └──────────────────────┘ │ │
|
||||
├────────────────────────────┼────────────────────────────────┤
|
||||
│ REQUEST THROUGHPUT │ ERROR RATE │
|
||||
│ ┌──────────────────────┐ │ ┌──────────────────────────┐ │
|
||||
│ │ ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▂▃▄▅ │ │ │ ▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁ │ │
|
||||
│ └──────────────────────┘ │ └──────────────────────────┘ │
|
||||
│ Current: 12,450 req/s │ Current: 0.02% │
|
||||
│ Peak: 18,200 req/s │ Threshold: 1.0% │
|
||||
├────────────────────────────┴────────────────────────────────┤
|
||||
│ RECENT ALERTS │
|
||||
│ 10:40 🟡 High latency on payment-service (p99 > 500ms) │
|
||||
│ 10:35 🟢 Resolved: Database connection pool recovered │
|
||||
│ 10:22 🔴 Payment service circuit breaker tripped │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Implementation Patterns
|
||||
|
||||
### SQL for KPI Calculations
|
||||
|
||||
```sql
|
||||
-- Monthly Recurring Revenue (MRR)
|
||||
WITH mrr_calculation AS (
|
||||
SELECT
|
||||
DATE_TRUNC('month', billing_date) AS month,
|
||||
SUM(
|
||||
CASE subscription_interval
|
||||
WHEN 'monthly' THEN amount
|
||||
WHEN 'yearly' THEN amount / 12
|
||||
WHEN 'quarterly' THEN amount / 3
|
||||
END
|
||||
) AS mrr
|
||||
FROM subscriptions
|
||||
WHERE status = 'active'
|
||||
GROUP BY DATE_TRUNC('month', billing_date)
|
||||
)
|
||||
SELECT
|
||||
month,
|
||||
mrr,
|
||||
LAG(mrr) OVER (ORDER BY month) AS prev_mrr,
|
||||
(mrr - LAG(mrr) OVER (ORDER BY month)) / LAG(mrr) OVER (ORDER BY month) * 100 AS growth_pct
|
||||
FROM mrr_calculation;
|
||||
|
||||
-- Cohort Retention
|
||||
WITH cohorts AS (
|
||||
SELECT
|
||||
user_id,
|
||||
DATE_TRUNC('month', created_at) AS cohort_month
|
||||
FROM users
|
||||
),
|
||||
activity AS (
|
||||
SELECT
|
||||
user_id,
|
||||
DATE_TRUNC('month', event_date) AS activity_month
|
||||
FROM user_events
|
||||
WHERE event_type = 'active_session'
|
||||
)
|
||||
SELECT
|
||||
c.cohort_month,
|
||||
EXTRACT(MONTH FROM age(a.activity_month, c.cohort_month)) AS months_since_signup,
|
||||
COUNT(DISTINCT a.user_id) AS active_users,
|
||||
COUNT(DISTINCT a.user_id)::FLOAT / COUNT(DISTINCT c.user_id) * 100 AS retention_rate
|
||||
FROM cohorts c
|
||||
LEFT JOIN activity a ON c.user_id = a.user_id
|
||||
AND a.activity_month >= c.cohort_month
|
||||
GROUP BY c.cohort_month, EXTRACT(MONTH FROM age(a.activity_month, c.cohort_month))
|
||||
ORDER BY c.cohort_month, months_since_signup;
|
||||
|
||||
-- Customer Acquisition Cost (CAC)
|
||||
SELECT
|
||||
DATE_TRUNC('month', acquired_date) AS month,
|
||||
SUM(marketing_spend) / NULLIF(COUNT(new_customers), 0) AS cac,
|
||||
SUM(marketing_spend) AS total_spend,
|
||||
COUNT(new_customers) AS customers_acquired
|
||||
FROM (
|
||||
SELECT
|
||||
DATE_TRUNC('month', u.created_at) AS acquired_date,
|
||||
u.id AS new_customers,
|
||||
m.spend AS marketing_spend
|
||||
FROM users u
|
||||
JOIN marketing_spend m ON DATE_TRUNC('month', u.created_at) = m.month
|
||||
WHERE u.source = 'marketing'
|
||||
) acquisition
|
||||
GROUP BY DATE_TRUNC('month', acquired_date);
|
||||
```
|
||||
|
||||
### Python Dashboard Code (Streamlit)
|
||||
|
||||
```python
|
||||
import streamlit as st
|
||||
import pandas as pd
|
||||
import plotly.express as px
|
||||
import plotly.graph_objects as go
|
||||
|
||||
st.set_page_config(page_title="KPI Dashboard", layout="wide")
|
||||
|
||||
# Header with date filter
|
||||
col1, col2 = st.columns([3, 1])
|
||||
with col1:
|
||||
st.title("Executive Dashboard")
|
||||
with col2:
|
||||
date_range = st.selectbox(
|
||||
"Period",
|
||||
["Last 7 Days", "Last 30 Days", "Last Quarter", "YTD"]
|
||||
)
|
||||
|
||||
# KPI Cards
|
||||
def metric_card(label, value, delta, prefix="", suffix=""):
|
||||
delta_color = "green" if delta >= 0 else "red"
|
||||
delta_arrow = "▲" if delta >= 0 else "▼"
|
||||
st.metric(
|
||||
label=label,
|
||||
value=f"{prefix}{value:,.0f}{suffix}",
|
||||
delta=f"{delta_arrow} {abs(delta):.1f}%"
|
||||
)
|
||||
|
||||
col1, col2, col3, col4 = st.columns(4)
|
||||
with col1:
|
||||
metric_card("Revenue", 2400000, 12.5, prefix="$")
|
||||
with col2:
|
||||
metric_card("Customers", 12450, 15.2)
|
||||
with col3:
|
||||
metric_card("NPS Score", 72, 5.0)
|
||||
with col4:
|
||||
metric_card("Churn Rate", 4.2, -0.8, suffix="%")
|
||||
|
||||
# Charts
|
||||
col1, col2 = st.columns(2)
|
||||
|
||||
with col1:
|
||||
st.subheader("Revenue Trend")
|
||||
revenue_data = pd.DataFrame({
|
||||
'Month': pd.date_range('2024-01-01', periods=12, freq='M'),
|
||||
'Revenue': [180000, 195000, 210000, 225000, 240000, 255000,
|
||||
270000, 285000, 300000, 315000, 330000, 345000]
|
||||
})
|
||||
fig = px.line(revenue_data, x='Month', y='Revenue',
|
||||
line_shape='spline', markers=True)
|
||||
fig.update_layout(height=300)
|
||||
st.plotly_chart(fig, use_container_width=True)
|
||||
|
||||
with col2:
|
||||
st.subheader("Revenue by Product")
|
||||
product_data = pd.DataFrame({
|
||||
'Product': ['Enterprise', 'Professional', 'Starter', 'Other'],
|
||||
'Revenue': [45, 32, 18, 5]
|
||||
})
|
||||
fig = px.pie(product_data, values='Revenue', names='Product',
|
||||
hole=0.4)
|
||||
fig.update_layout(height=300)
|
||||
st.plotly_chart(fig, use_container_width=True)
|
||||
|
||||
# Cohort Heatmap
|
||||
st.subheader("Cohort Retention")
|
||||
cohort_data = pd.DataFrame({
|
||||
'Cohort': ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
|
||||
'M0': [100, 100, 100, 100, 100],
|
||||
'M1': [85, 87, 84, 86, 88],
|
||||
'M2': [78, 80, 76, 79, None],
|
||||
'M3': [72, 74, 70, None, None],
|
||||
'M4': [68, 70, None, None, None],
|
||||
})
|
||||
fig = go.Figure(data=go.Heatmap(
|
||||
z=cohort_data.iloc[:, 1:].values,
|
||||
x=['M0', 'M1', 'M2', 'M3', 'M4'],
|
||||
y=cohort_data['Cohort'],
|
||||
colorscale='Blues',
|
||||
text=cohort_data.iloc[:, 1:].values,
|
||||
texttemplate='%{text}%',
|
||||
textfont={"size": 12},
|
||||
))
|
||||
fig.update_layout(height=250)
|
||||
st.plotly_chart(fig, use_container_width=True)
|
||||
|
||||
# Alerts Section
|
||||
st.subheader("Alerts")
|
||||
alerts = [
|
||||
{"level": "error", "message": "Churn rate exceeded threshold (>5%)"},
|
||||
{"level": "warning", "message": "Support ticket volume 20% above average"},
|
||||
]
|
||||
for alert in alerts:
|
||||
if alert["level"] == "error":
|
||||
st.error(f"🔴 {alert['message']}")
|
||||
elif alert["level"] == "warning":
|
||||
st.warning(f"🟡 {alert['message']}")
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
- **Limit to 5-7 KPIs** - Focus on what matters
|
||||
- **Show context** - Comparisons, trends, targets
|
||||
- **Use consistent colors** - Red=bad, green=good
|
||||
- **Enable drilldown** - From summary to detail
|
||||
- **Update appropriately** - Match metric frequency
|
||||
|
||||
### Don'ts
|
||||
- **Don't show vanity metrics** - Focus on actionable data
|
||||
- **Don't overcrowd** - White space aids comprehension
|
||||
- **Don't use 3D charts** - They distort perception
|
||||
- **Don't hide methodology** - Document calculations
|
||||
- **Don't ignore mobile** - Ensure responsive design
|
||||
|
||||
## Resources
|
||||
|
||||
- [Stephen Few's Dashboard Design](https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf)
|
||||
- [Edward Tufte's Principles](https://www.edwardtufte.com/tufte/)
|
||||
- [Google Data Studio Gallery](https://datastudio.google.com/gallery)
|
||||
Reference in New Issue
Block a user