| name | kpi-dashboard-design |
| description | Design and build dashboards that track key performance indicators. Select relevant metrics, visualize data effectively, and communicate insights to stakeholders. |
KPI Dashboard Design
Overview
Effective KPI dashboards make performance visible, enable data-driven decisions, and help teams align around shared goals.
When to Use
- Creating performance measurement systems
- Leadership reporting and visibility
- Operational monitoring
- Project progress tracking
- Team performance management
- Customer health monitoring
- Financial reporting
Instructions
1. KPI Selection Framework
# Select relevant, measurable KPIs
class KPISelection:
KPI_CRITERIA = {
'Relevant': 'Directly aligned with business strategy',
'Measurable': 'Can be quantified and tracked',
'Actionable': 'Team can influence the metric',
'Timely': 'Measured frequently (daily/weekly)',
'Bounded': 'Has clear target/threshold',
'Simple': 'Easy to understand'
}
def identify_business_goals(self):
"""Map goals to KPIs"""
return {
'Revenue Growth': [
'Monthly Recurring Revenue (MRR)',
'Annual Recurring Revenue (ARR)',
'Customer Lifetime Value (CLV)',
'Average Revenue Per User (ARPU)'
],
'Customer Acquisition': [
'Customer Acquisition Cost (CAC)',
'Conversion Rate',
'Traffic to Lead Rate',
'Sales Pipeline Value'
],
'Customer Retention': [
'Churn Rate',
'Net Promoter Score (NPS)',
'Customer Satisfaction (CSAT)',
'Retention Rate'
],
'Operational Efficiency': [
'Cost per Customer',
'Time to Value',
'System Uptime',
'Support Response Time'
],
'Product Quality': [
'Defect Rate',
'Feature Adoption',
'User Engagement',
'Performance Score'
]
}
def validate_kpi(self, kpi):
"""Check KPI against criteria"""
validation = {}
for criterion, definition in self.KPI_CRITERIA.items():
validation[criterion] = {
'definition': definition,
'assessment': self.assess_criterion(kpi, criterion),
'rating': 'Pass' if self.assess_criterion(kpi, criterion) else 'Fail'
}
is_valid = all(v['rating'] == 'Pass' for v in validation.values())
return {
'kpi': kpi.name,
'validation': validation,
'is_valid': is_valid,
'recommendation': 'Include in dashboard' if is_valid else 'Refine or exclude'
}
def define_kpi_target(self, kpi):
"""Set measurable targets"""
return {
'kpi': kpi.name,
'current_value': kpi.current,
'target_value': kpi.target,
'time_period': 'Q1 2025',
'improvement': f"{(kpi.target - kpi.current) / kpi.current * 100:.1f}%",
'owner': kpi.owner,
'review_frequency': 'Weekly',
'threshold_green': kpi.target,
'threshold_yellow': kpi.target * 0.9,
'threshold_red': kpi.target * 0.7
}
2. Dashboard Design
Dashboard Design Template:
Name: Sales Performance Dashboard
Audience: Sales Team, Management
Update Frequency: Daily
Users: 15 sales reps, 3 managers
---
## Dashboard Structure
### Top Section: Executive Summary (30% height)
- Total Revenue (YTD): $2.5M (vs $2.2M target)
- Pipeline Value: $8.7M (vs $7.5M target)
- Win Rate: 28% (vs 25% target) - GREEN
- Average Deal Size: $125K (vs $120K target)
### Left Column: Sales Performance (35% width)
Sales by Rep (Ranked)
- John Smith: $850K
- Jane Doe: $720K
- Bob Johnson: $630K
- ...visualization: Horizontal bar chart
Sales Trend (YTD)
- Chart type: Line chart
- X-axis: Months
- Y-axis: Revenue
- Target line overlaid
- Goal: Show trend vs plan
### Right Column: Pipeline Analysis (35% width)
Pipeline by Stage
- Prospecting: $1.2M (12 deals)
- Qualification: $2.1M (18 deals)
- Proposal: $3.2M (15 deals)
- Negotiation: $2.2M (8 deals)
- Visualization: Funnel chart
Deal Velocity
- Avg days in stage by stage
- Bottlenecks identification
- Conversion rates
### Bottom Section: Detailed Metrics (20% height)
Key Metrics Row:
- Deals Closed This Month: 6
- Average Sales Cycle: 45 days
- Win Rate vs. Competitors: 28% vs 22%
- Customer Satisfaction: 4.3/5
---
## Visual Design Principles
Color Coding:
Green (On Target): #4CAF50
Yellow (At Risk): #FFC107
Red (Off Track): #F44336
Gray (No Data): #9E9E9E
Data Visualization:
- Sales Performance: Line or Column chart
- Pipeline Stage: Funnel or Waterfall chart
- Geographic: Map with heat zones
- Trend: Area or Line chart
- Distribution: Bar or Pie chart
- Comparison: Grouped bar chart
Interactivity:
- Click to drill down to details
- Filter by rep, region, product
- Time period selector
- Export to PDF/Excel
- Alerts for threshold violations
---
## Refresh Strategy
Real-Time (every 5 minutes):
- Active sales calls
- Deal status changes
Hourly:
- Revenue totals
- Pipeline updates
Daily (overnight):
- Historical trends
- Aggregated reports
Manual:
- Target adjustments
- Threshold changes
3. Dashboard Implementation
// Build dashboard with data integration
class KPIDashboard {
constructor(config) {
this.config = config;
this.widgets = [];
this.data = {};
this.alerts = [];
}
createWidget(kpi) {
return {
id: `widget-${kpi.id}`,
title: kpi.name,
metric_value: kpi.current_value,
target_value: kpi.target_value,
threshold: this.calculateThreshold(kpi),
visualization: {
type: kpi.chart_type, // 'gauge', 'number', 'chart'
config: this.getVisualizationConfig(kpi)
},
drill_down: true,
refresh_frequency: kpi.refresh_rate || 'hourly'
};
}
calculateThreshold(kpi) {
const range = kpi.target_value - kpi.minimum_value;
return {
green: kpi.target_value,
yellow: kpi.target_value - (range * 0.2),
red: kpi.target_value - (range * 0.5),
status: this.getStatus(kpi),
trend: this.calculateTrend(kpi)
};
}
getStatus(kpi) {
const percentOfTarget = kpi.current_value / kpi.target_value;
if (percentOfTarget >= 1) return 'Green';
if (percentOfTarget >= 0.8) return 'Yellow';
return 'Red';
}
calculateTrend(kpi) {
const change = kpi.current_value - kpi.previous_period_value;
const changePercent = (change / kpi.previous_period_value) * 100;
return {
direction: change > 0 ? 'Up' : 'Down',
value: Math.abs(changePercent).toFixed(1),
momentum: this.assessMomentum(change, kpi)
};
}
generateAlerts() {
return this.widgets
.filter(w => w.threshold.status !== 'Green')
.map(w => ({
severity: w.threshold.status,
message: `${w.title} is ${w.threshold.status} (${w.metric_value} vs ${w.target_value} target)`,
action: 'Review and investigate',
timestamp: new Date()
}));
}
exportReport() {
return {
format: ['PDF', 'Excel', 'CSV'],
include: ['Metrics', 'Charts', 'Trends', 'Commentary'],
schedule: 'Weekly, every Monday morning'
};
}
}
4. KPI Monitoring & Governance
KPI Governance Framework:
Quarterly KPI Review:
- Review progress against targets
- Adjust targets if needed
- Celebrate achievements
- Identify improvement areas
- Update documentation
Annual KPI Assessment:
- Reassess KPI relevance
- Align with strategy changes
- Remove obsolete metrics
- Add new metrics as needed
- Update dashboard design
---
KPI Health Check:
Ask these questions monthly:
1. Is this KPI still relevant?
If No: Mark for retirement
2. Do we have accurate data?
If No: Fix data source
3. Is it actionable?
If No: Drill down to driver metrics
4. Is target realistic?
If No: Adjust based on new data
5. Are we taking action on insights?
If No: Improve governance/communication
---
Common KPI Mistakes to Avoid:
1. Too Many KPIs (limit to 5-7)
2. Lagging metrics only (include leading too)
3. No ownership assigned
4. Targets not aligned with strategy
5. Dashboard not updated regularly
6. No drill-down capability
7. Metrics not actionable by team
8. Ignoring data quality issues
9. No connection to compensation/goals
10. Dashboard unused by stakeholders
Best Practices
✅ DO
- Start with business goals, not data
- Limit dashboards to 5-7 core metrics
- Include both leading and lagging indicators
- Assign clear metric ownership
- Update dashboards regularly
- Make drill-down available
- Use visual hierarchy effectively
- Test with actual users
- Include context and benchmarks
- Document metric definitions
❌ DON'T
- Create dashboards without clear purpose
- Include too many metrics (analysis paralysis)
- Forget about data quality
- Build without stakeholder input
- Use confusing visualizations
- Leave dashboards stale
- Ignore mobile viewing experience
- Skip training on dashboard usage
- Create metrics no one can influence
- Change metrics frequently
KPI Dashboard Tips
- Use traffic light colors (green/yellow/red)
- Include month-to-date and year-to-date views
- Show trend arrows for quick scanning
- Add comparison to previous period
- Enable drill-down to supporting data