Product Strategist
Strategic toolkit for Head of Product to drive vision, alignment, and organizational excellence.
Core Capabilities
| Capability | Description | Tool |
|---|
| OKR Cascade | Generate aligned OKRs from company to team level | okr_cascade_generator.py |
| Alignment Scoring | Measure vertical and horizontal alignment | Built into generator |
| Strategy Templates | 5 pre-built strategy types | Growth, Retention, Revenue, Innovation, Operational |
| Team Configuration | Customize for your org structure | --teams flag |
Quick Start
# Growth strategy with default teams
python scripts/okr_cascade_generator.py growth
# Retention strategy with custom teams
python scripts/okr_cascade_generator.py retention --teams "Engineering,Design,Data"
# Revenue strategy with 40% product contribution
python scripts/okr_cascade_generator.py revenue --contribution 0.4
# Export as JSON for integration
python scripts/okr_cascade_generator.py growth --json > okrs.json
Workflow: Quarterly Strategic Planning
Step 1: Define Strategic Focus
| Strategy | When to Use |
|---|
| Growth | Scaling user base, market expansion |
| Retention | Reducing churn, improving LTV |
| Revenue | Increasing ARPU, new monetization |
| Innovation | Market differentiation, new capabilities |
| Operational | Improving efficiency, scaling operations |
See references/strategy_types.md for detailed guidance.
{
"current": 100000, // Current MAU
"target": 150000, // Target MAU
"current_nps": 40, // Current NPS
"target_nps": 60 // Target NPS
}
# Default teams
python scripts/okr_cascade_generator.py growth
# Custom org structure with contribution percentage
python scripts/okr_cascade_generator.py growth \
--teams "Core,Platform,Mobile,AI" \
--contribution 0.3
Step 4: Review Alignment Scores
| Score | Target | Action if Below |
|---|
| Vertical Alignment | >90% | Ensure all objectives link to parent |
| Horizontal Alignment | >75% | Check for team coordination gaps |
| Coverage | >80% | Validate all company OKRs are addressed |
| Balance | >80% | Redistribute if one team is overloaded |
| Overall | >80% | <60% needs restructuring |
Step 5: Refine, Validate, and Export
Before finalizing:
# Export JSON for tools like Lattice, Ally, Workboard
python scripts/okr_cascade_generator.py growth --json > q1_okrs.json
OKR Cascade Generator
Usage
python scripts/okr_cascade_generator.py [strategy] [options]
Strategies: growth | retention | revenue | innovation | operational
Configuration Options
| Option | Description | Default |
|---|
--teams, -t | Comma-separated team names | Growth,Platform,Mobile,Data |
--contribution, -c | Product contribution to company OKRs (0-1) | 0.3 (30%) |
--json, -j | Output as JSON instead of dashboard | False |
--metrics, -m | Metrics as JSON string | Sample metrics |
Output Examples
Dashboard Output (growth strategy)
============================================================
OKR CASCADE DASHBOARD
Quarter: Q1 2025 | Strategy: GROWTH
Teams: Growth, Platform, Mobile, Data | Product Contribution: 30%
============================================================
🏢 COMPANY OKRS
📌 CO-1: Accelerate user acquisition and market expansion
└─ CO-1-KR1: Increase MAU from 100,000 to 150,000
└─ CO-1-KR2: Achieve 50% MoM growth rate
└─ CO-1-KR3: Expand to 3 new markets
📌 CO-2: Achieve product-market fit in new segments
📌 CO-3: Build sustainable growth engine
🚀 PRODUCT OKRS
📌 PO-1: Build viral product features and market expansion
↳ Supports: CO-1
└─ PO-1-KR1: Increase product MAU to 45,000
└─ PO-1-KR2: Achieve 45% feature adoption rate
👥 TEAM OKRS
Growth Team:
📌 GRO-1: Build viral product features through acquisition and activation
└─ GRO-1-KR1: Increase product MAU to 11,250
└─ GRO-1-KR2: Achieve 11.25% feature adoption rate
🎯 ALIGNMENT SCORES
✓ Vertical Alignment: 100.0%
! Horizontal Alignment: 75.0%
✓ Coverage: 100.0% | ✓ Balance: 97.5% | ✓ Overall: 94.0%
✅ Overall alignment is GOOD (≥80%)
JSON Output (retention --json, truncated)
{
"quarter": "Q1 2025",
"strategy": "retention",
"company": {
"objectives": [
{
"id": "CO-1",
"title": "Create lasting customer value and loyalty",
"key_results": [
{ "id": "CO-1-KR1", "title": "Improve retention from 70% to 85%", "current": 70, "target": 85 }
]
}
]
},
"product": { "contribution": 0.3, "objectives": ["..."] },
"teams": ["..."],
"alignment_scores": {
"vertical_alignment": 100.0, "horizontal_alignment": 75.0,
"coverage": 100.0, "balance": 97.5, "overall": 94.0
}
}
See references/examples/sample_growth_okrs.json for a complete example.
Reference Documents
| Document | Description |
|---|
references/okr_framework.md | OKR methodology, writing guidelines, alignment scoring |
references/strategy_types.md | Detailed breakdown of all 5 strategy types with examples |
references/examples/sample_growth_okrs.json | Complete sample output for growth strategy |
Best Practices
OKR Cascade
- Limit to 3-5 objectives per level, each with 3-5 key results
- Key results must be measurable with current and target values
- Validate parent-child relationships before finalizing
Alignment Scoring
- Target >80% overall alignment; investigate any score below 60%
- Balance scores ensure no team is overloaded
- Horizontal alignment prevents conflicting goals across teams
Team Configuration
- Configure teams to match your actual org structure
- Adjust contribution percentages based on team size
- Platform/Infrastructure teams often support all objectives
- Specialized teams (ML, Data) may only support relevant objectives
- Senior PM (
project-management/senior-pm/) — Portfolio management and risk analysis inform strategic planning
- Competitive Teardown (
product-team/competitive-teardown/) — Competitive intelligence feeds product strategy
OKR Cascade Framework
A practical guide to Objectives and Key Results (OKRs) and how to cascade them across organizational levels.
Table of Contents
What Are OKRs
Objectives and Key Results (OKRs) are a goal-setting framework that connects organizational strategy to measurable outcomes.
Components
| Component |
Definition |
Characteristics |
| Objective |
What you want to achieve |
Qualitative, inspirational, time-bound |
| Key Result |
How you measure progress |
Quantitative, specific, measurable |
OKR Formula
Objective: [Inspirational goal statement]
├── KR1: [Metric] from [current] to [target] by [date]
├── KR2: [Metric] from [current] to [target] by [date]
└── KR3: [Metric] from [current] to [target] by [date]
Example
Objective: Become the go-to solution for enterprise customers
KR1: Increase enterprise ARR from $5M to $8M
KR2: Improve enterprise NPS from 35 to 50
KR3: Reduce enterprise onboarding time from 30 days to 14 days
The Cascade Model
OKRs cascade from company strategy down to individual teams, ensuring alignment at every level.
Cascade Structure
┌─────────────────────────────────────────┐
│ COMPANY LEVEL │
│ Strategic objectives set by leadership │
│ Owned by: CEO, Executive Team │
└───────────────┬─────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ PRODUCT LEVEL │
│ How product org contributes to company │
│ Owned by: Head of Product, CPO │
└───────────────┬─────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ TEAM LEVEL │
│ Specific initiatives and deliverables │
│ Owned by: Product Managers, Tech Leads │
└─────────────────────────────────────────┘
Contribution Model
Each level contributes a percentage to the level above:
| Level |
Typical Contribution |
Range |
| Product → Company |
30% |
20-50% |
| Team → Product |
25% per team |
15-35% |
Note: Contribution percentages should be calibrated based on:
- Number of teams
- Relative team size
- Strategic importance of initiatives
Alignment Types
| Alignment |
Description |
Goal |
| Vertical |
Each level supports the level above |
>90% of objectives linked |
| Horizontal |
Teams coordinate on shared objectives |
No conflicting goals |
| Temporal |
Quarterly OKRs support annual goals |
Clear progression |
Writing Effective Objectives
The 3 Cs of Objectives
| Criterion |
Description |
Example |
| Clear |
Unambiguous intent |
"Improve customer onboarding" not "Make things better" |
| Compelling |
Inspires action |
"Delight enterprise customers" not "Serve enterprise" |
| Challenging |
Stretches capabilities |
Achievable but requires effort |
Objective Templates by Strategy
Growth Strategy:
- Accelerate user acquisition in [segment]
- Expand market presence in [region/vertical]
- Build sustainable acquisition channels
Retention Strategy:
- Create lasting value for [user segment]
- Improve product experience for [use case]
- Maximize customer lifetime value
Revenue Strategy:
- Drive revenue growth through [mechanism]
- Optimize monetization for [segment]
- Expand revenue per customer
Innovation Strategy:
- Pioneer [capability] in the market
- Establish leadership through [innovation area]
- Build competitive differentiation
Operational Strategy:
- Improve delivery efficiency by [mechanism]
- Scale operations to support [target]
- Reduce operational friction in [area]
Objective Anti-Patterns
| Anti-Pattern |
Problem |
Better Alternative |
| "Increase revenue" |
Too vague |
"Grow enterprise ARR to $10M" |
| "Be the best" |
Not measurable |
"Achieve #1 NPS in category" |
| "Fix bugs" |
Too tactical |
"Improve platform reliability" |
| "Launch feature X" |
Output, not outcome |
"Improve [metric] through [capability]" |
Defining Key Results
Key Result Anatomy
[Verb] [metric] from [current baseline] to [target] by [deadline]
Key Result Types
| Type |
Characteristics |
When to Use |
| Metric-based |
Track a number |
Most common, highly measurable |
| Milestone-based |
Track completion |
For binary deliverables |
| Health-based |
Track stability |
For maintenance objectives |
Metric Categories
| Category |
Examples |
| Acquisition |
Signups, trials started, leads generated |
| Activation |
Onboarding completion, first value moment |
| Retention |
D7/D30 retention, churn rate, repeat usage |
| Revenue |
ARR, ARPU, conversion rate, LTV |
| Engagement |
DAU/MAU, session duration, actions per session |
| Satisfaction |
NPS, CSAT, support tickets |
| Efficiency |
Cycle time, automation rate, cost per unit |
Key Result Scoring
| Score |
Status |
Description |
| 0.0-0.3 |
Red |
Significant gap, needs intervention |
| 0.4-0.6 |
Yellow |
Partial progress, on watch |
| 0.7-0.9 |
Green |
Strong progress, on track |
| 1.0 |
Complete |
Target achieved |
Note: Hitting 0.7 is considered success for stretch goals. Consistently hitting 1.0 suggests targets aren't ambitious enough.
Alignment Scoring
The OKR cascade generator calculates alignment scores across four dimensions:
Scoring Dimensions
| Dimension |
Weight |
What It Measures |
| Vertical Alignment |
40% |
% of objectives with parent links |
| Horizontal Alignment |
20% |
Cross-team coordination on shared goals |
| Coverage |
20% |
% of company KRs addressed by product |
| Balance |
20% |
Even distribution of work across teams |
Alignment Score Interpretation
| Score |
Grade |
Interpretation |
| 90-100% |
A |
Excellent alignment, well-cascaded |
| 80-89% |
B |
Good alignment, minor gaps |
| 70-79% |
C |
Adequate, needs attention |
| 60-69% |
D |
Poor alignment, significant gaps |
| <60% |
F |
Misaligned, requires restructuring |
Target Benchmarks
| Metric |
Target |
Red Flag |
| Vertical alignment |
>90% |
<70% |
| Horizontal alignment |
>75% |
<50% |
| Coverage |
>80% |
<60% |
| Balance |
>80% |
<60% |
| Overall |
>80% |
<65% |
Common Pitfalls
OKR Anti-Patterns
| Pitfall |
Symptom |
Fix |
| Too many OKRs |
10+ objectives per level |
Limit to 3-5 objectives |
| Sandbagging |
Always hit 100% |
Set stretch targets (0.7 = success) |
| Task lists |
KRs are tasks, not outcomes |
Focus on measurable impact |
| Set and forget |
No mid-quarter reviews |
Check-ins every 2 weeks |
| Cascade disconnect |
Team OKRs don't link up |
Validate parent relationships |
| Metric gaming |
Optimizing for KR, not intent |
Balance with health metrics |
Warning Signs
- All teams have identical objectives (lack of specialization)
- No team owns a critical company objective (gap in coverage)
- One team owns everything (unrealistic load)
- Objectives change weekly (lack of commitment)
- KRs are activities, not outcomes (wrong focus)
OKR Cadence
Quarterly Rhythm
| Week |
Activity |
| Week -2 |
Leadership sets company OKRs draft |
| Week -1 |
Product and team OKR drafting |
| Week 0 |
OKR finalization and alignment review |
| Week 2 |
First check-in, adjust if needed |
| Week 6 |
Mid-quarter review |
| Week 10 |
Pre-quarter reflection |
| Week 12 |
Quarter close, scoring, learnings |
Check-in Format
Weekly/Bi-weekly Status Update:
1. Confidence level: [Red/Yellow/Green]
2. Progress since last check-in: [specific updates]
3. Blockers: [what's in the way]
4. Asks: [what help is needed]
5. Forecast: [expected end-of-quarter score]
Annual Alignment
Quarterly OKRs should ladder up to annual goals:
Annual Goal: Become a $100M ARR business
Q1: Build enterprise sales motion (ARR: $25M → $32M)
Q2: Expand into APAC region (ARR: $32M → $45M)
Q3: Launch self-serve enterprise tier (ARR: $45M → $65M)
Q4: Scale and optimize (ARR: $65M → $100M)
Quick Reference
OKR Checklist
Before finalizing OKRs:
During the quarter:
End of quarter:
See also: strategy_types.md for strategy-specific OKR templates
Strategy Types for OKR Generation
Comprehensive breakdown of the five core strategy types with objectives, key results, and when to use each.
Table of Contents
Strategy Selection Guide
Decision Matrix
| If your priority is... |
Primary Strategy |
Secondary Strategy |
| Scaling user base |
Growth |
Retention |
| Reducing churn |
Retention |
Revenue |
| Increasing ARPU |
Revenue |
Retention |
| Market differentiation |
Innovation |
Growth |
| Improving efficiency |
Operational |
Revenue |
| New market entry |
Growth |
Innovation |
Strategy by Company Stage
| Stage |
Typical Priority |
Rationale |
| Pre-PMF |
Innovation |
Finding product-market fit |
| Early Growth |
Growth |
Scaling acquisition |
| Growth |
Growth + Retention |
Balancing acquisition with value |
| Scale |
Revenue + Retention |
Optimizing unit economics |
| Mature |
Operational + Revenue |
Efficiency and margins |
Growth Strategy
Focus: Accelerating user acquisition and market expansion
When to Use
- User growth is primary company objective
- Product-market fit is validated
- Acquisition channels are scaling
- Ready to invest in growth loops
Company-Level Objectives
| Objective |
Key Results Template |
| Accelerate user acquisition and market expansion |
- Increase MAU from X to Y - Achieve Z% MoM growth rate - Expand to N new markets |
| Achieve product-market fit in new segments |
- Reach X users in [segment] - Achieve Y% activation rate - Validate Z use cases |
| Build sustainable growth engine |
- Reduce CAC by X% - Improve viral coefficient to Y - Increase organic share to Z% |
Product-Level Cascade
| Product Objective |
Supports |
Key Results |
| Build viral product features |
User acquisition |
- Launch referral program (target: X referrals/user) - Increase shareability by Y% |
| Optimize onboarding experience |
Activation |
- Improve activation rate from X% to Y% - Reduce time-to-value by Z% |
| Create product-led growth loops |
Sustainable growth |
- Increase product-qualified leads by X% - Improve trial-to-paid by Y% |
Team-Level Examples
| Team |
Focus Area |
Sample KRs |
| Growth Team |
Acquisition & activation |
- Improve signup conversion by X% - Launch Y experiments/week |
| Platform Team |
Scale & reliability |
- Support X concurrent users - Maintain Y% uptime |
| Mobile Team |
Mobile acquisition |
- Increase mobile signups by X% - Improve mobile activation by Y% |
Key Metrics to Track
- Monthly Active Users (MAU)
- Growth rate (MoM, YoY)
- Customer Acquisition Cost (CAC)
- Activation rate
- Viral coefficient
- Channel efficiency
Retention Strategy
Focus: Creating lasting customer value and reducing churn
When to Use
- Churn is above industry benchmark
- LTV/CAC needs improvement
- Product stickiness is low
- Expansion revenue is a priority
Company-Level Objectives
| Objective |
Key Results Template |
| Create lasting customer value and loyalty |
- Improve retention from X% to Y% - Increase NPS from X to Y - Reduce churn to below Z% |
| Deliver a superior user experience |
- Achieve X% product stickiness - Improve satisfaction to Y/10 - Reduce support tickets by Z% |
| Maximize customer lifetime value |
- Increase LTV by X% - Improve LTV/CAC ratio to Y - Grow expansion revenue by Z% |
Product-Level Cascade
| Product Objective |
Supports |
Key Results |
| Design sticky user experiences |
Customer retention |
- Increase DAU/MAU ratio from X to Y - Improve weekly return rate by Z% |
| Build habit-forming features |
Product stickiness |
- Achieve X% feature adoption - Increase sessions/user by Y |
| Create expansion opportunities |
Lifetime value |
- Launch N upsell touchpoints - Improve upgrade rate by X% |
Team-Level Examples
| Team |
Focus Area |
Sample KRs |
| Growth Team |
Retention loops |
- Improve D7 retention by X% - Reduce first-week churn by Y% |
| Data Team |
Churn prediction |
- Build churn model (accuracy >X%) - Identify Y at-risk signals |
| Platform Team |
Reliability |
- Reduce error rates by X% - Improve load times by Y% |
Key Metrics to Track
- Retention rates (D1, D7, D30, D90)
- Churn rate
- Net Promoter Score (NPS)
- Customer Satisfaction (CSAT)
- Feature stickiness
- Session frequency
Revenue Strategy
Focus: Driving sustainable revenue growth and monetization
When to Use
- Company is focused on profitability
- Monetization needs optimization
- Pricing strategy is being revised
- Expansion revenue is priority
Company-Level Objectives
| Objective |
Key Results Template |
| Drive sustainable revenue growth |
- Grow ARR from $X to $Y - Achieve Z% revenue growth rate - Maintain X% gross margin |
| Optimize monetization strategy |
- Increase ARPU by X% - Improve pricing efficiency by Y% - Launch Z new pricing tiers |
| Expand revenue per customer |
- Grow expansion revenue by X% - Reduce revenue churn to Y% - Increase upsell rate by Z% |
Product-Level Cascade
| Product Objective |
Supports |
Key Results |
| Optimize product monetization |
Revenue growth |
- Improve conversion to paid by X% - Reduce free tier abuse by Y% |
| Build premium features |
ARPU growth |
- Launch N premium features - Achieve X% premium adoption |
| Create value-based pricing alignment |
Pricing efficiency |
- Implement usage-based pricing - Improve price-to-value ratio by X% |
Team-Level Examples
| Team |
Focus Area |
Sample KRs |
| Growth Team |
Conversion |
- Improve trial-to-paid by X% - Reduce time-to-upgrade by Y days |
| Platform Team |
Usage metering |
- Implement accurate usage tracking - Support X billing scenarios |
| Data Team |
Revenue analytics |
- Build revenue forecasting model - Identify Y expansion signals |
Key Metrics to Track
- Annual Recurring Revenue (ARR)
- Average Revenue Per User (ARPU)
- Gross margin
- Revenue churn (net and gross)
- Expansion revenue
- LTV/CAC ratio
Innovation Strategy
Focus: Building competitive advantage through product innovation
When to Use
- Market is commoditizing
- Competitors are catching up
- New technology opportunity exists
- Company needs differentiation
Company-Level Objectives
| Objective |
Key Results Template |
| Lead the market through product innovation |
- Launch X breakthrough features - Achieve Y% revenue from new products - File Z patents/IP |
| Establish market leadership in [area] |
- Become #1 in category for X - Win Y analyst recognitions - Achieve Z% awareness |
| Build sustainable competitive moat |
- Reduce feature parity gap by X% - Create Y unique capabilities - Build Z switching barriers |
Product-Level Cascade
| Product Objective |
Supports |
Key Results |
| Ship innovative features faster |
Breakthrough innovation |
- Reduce time-to-market by X% - Launch Y experiments/quarter |
| Build unique technical capabilities |
Competitive moat |
- Develop X proprietary algorithms - Achieve Y performance advantage |
| Create platform extensibility |
Ecosystem advantage |
- Launch N API endpoints - Enable X third-party integrations |
Team-Level Examples
| Team |
Focus Area |
Sample KRs |
| Platform Team |
Core technology |
- Build X new infrastructure capabilities - Improve performance by Y% |
| Data Team |
ML/AI innovation |
- Deploy X ML models - Improve prediction accuracy by Y% |
| Mobile Team |
Mobile innovation |
- Launch X mobile-first features - Achieve Y% mobile parity |
Key Metrics to Track
- Time-to-market
- Revenue from new products
- Feature uniqueness score
- Patent/IP filings
- Technology differentiation
- Innovation velocity
Operational Strategy
Focus: Improving efficiency and organizational excellence
When to Use
- Scaling challenges are emerging
- Operational costs are high
- Team productivity needs improvement
- Quality issues are increasing
Company-Level Objectives
| Objective |
Key Results Template |
| Improve organizational efficiency |
- Improve velocity by X% - Reduce cycle time to Y days - Achieve Z% automation |
| Scale operations sustainably |
- Support X users per engineer - Reduce cost per transaction by Y% - Improve operational leverage by Z% |
| Achieve operational excellence |
- Reduce incidents by X% - Improve team NPS to Y - Achieve Z% on-time delivery |
Product-Level Cascade
| Product Objective |
Supports |
Key Results |
| Improve product delivery efficiency |
Velocity |
- Reduce PR cycle time by X% - Increase deployment frequency by Y% |
| Reduce operational toil |
Automation |
- Automate X% of manual processes - Reduce on-call burden by Y% |
| Improve product quality |
Excellence |
- Reduce bugs by X% - Improve test coverage to Y% |
Team-Level Examples
| Team |
Focus Area |
Sample KRs |
| Platform Team |
Infrastructure efficiency |
- Reduce infrastructure costs by X% - Improve deployment reliability to Y% |
| Data Team |
Data operations |
- Improve data pipeline reliability to X% - Reduce data latency by Y% |
| All Teams |
Process improvement |
- Reduce meeting overhead by X% - Improve sprint predictability to Y% |
Key Metrics to Track
- Velocity (story points, throughput)
- Cycle time
- Deployment frequency
- Change failure rate
- Incident count and MTTR
- Team satisfaction (eNPS)
Multi-Strategy Combinations
Common Pairings
| Primary |
Secondary |
Balanced Objectives |
| Growth + Retention |
60/40 |
Grow while keeping users |
| Revenue + Retention |
50/50 |
Monetize without churning |
| Innovation + Growth |
40/60 |
Differentiate to acquire |
| Operational + Revenue |
50/50 |
Efficiency for margins |
Balanced OKR Set Example
Mixed Growth + Retention Strategy:
Company Objective 1: Accelerate user growth (Growth)
├── KR1: Increase MAU from 100K to 200K
├── KR2: Achieve 15% MoM growth rate
└── KR3: Reduce CAC by 20%
Company Objective 2: Improve user retention (Retention)
├── KR1: Improve D30 retention from 20% to 35%
├── KR2: Increase NPS from 40 to 55
└── KR3: Reduce churn to below 5%
Company Objective 3: Improve delivery efficiency (Operational)
├── KR1: Reduce cycle time by 30%
├── KR2: Achieve 95% on-time delivery
└── KR3: Improve team eNPS to 50
Strategy Selection Checklist
Before choosing a strategy:
See also: okr_framework.md for OKR writing best practices
#!/usr/bin/env python3
"""
OKR Cascade Generator
Creates aligned OKRs from company strategy down to team level.
Features:
- Generates company → product → team OKR cascade
- Configurable team structure and contribution percentages
- Alignment scoring across vertical and horizontal dimensions
- Multiple output formats (dashboard, JSON)
Usage:
python okr_cascade_generator.py growth
python okr_cascade_generator.py retention --teams "Engineering,Design,Data"
python okr_cascade_generator.py revenue --contribution 0.4 --json
"""
import json
import argparse
from typing import Dict, List
from datetime import datetime
class OKRGenerator:
"""Generate and cascade OKRs across the organization"""
def __init__(self, teams: List[str] = None, product_contribution: float = 0.3):
"""
Initialize OKR generator.
Args:
teams: List of team names (default: Growth, Platform, Mobile, Data)
product_contribution: Fraction of company KRs that product owns (default: 0.3)
"""
self.teams = teams or ['Growth', 'Platform', 'Mobile', 'Data']
self.product_contribution = product_contribution
self.okr_templates = {
'growth': {
'objectives': [
'Accelerate user acquisition and market expansion',
'Achieve product-market fit in new segments',
'Build sustainable growth engine'
],
'key_results': [
'Increase MAU from {current} to {target}',
'Achieve {target}% MoM growth rate',
'Expand to {target} new markets',
'Reduce CAC by {target}%',
'Improve activation rate to {target}%'
]
},
'retention': {
'objectives': [
'Create lasting customer value and loyalty',
'Deliver a superior user experience',
'Maximize customer lifetime value'
],
'key_results': [
'Improve retention from {current}% to {target}%',
'Increase NPS from {current} to {target}',
'Reduce churn to below {target}%',
'Achieve {target}% product stickiness',
'Increase LTV/CAC ratio to {target}'
]
},
'revenue': {
'objectives': [
'Drive sustainable revenue growth',
'Optimize monetization strategy',
'Expand revenue per customer'
],
'key_results': [
'Grow ARR from ${current}M to ${target}M',
'Increase ARPU by {target}%',
'Launch {target} new revenue streams',
'Achieve {target}% gross margin',
'Reduce revenue churn to {target}%'
]
},
'innovation': {
'objectives': [
'Lead the market through product innovation',
'Establish leadership in key capability areas',
'Build sustainable competitive differentiation'
],
'key_results': [
'Launch {target} breakthrough features',
'Achieve {target}% of revenue from new products',
'File {target} patents/IP',
'Reduce time-to-market by {target}%',
'Achieve {target} innovation score'
]
},
'operational': {
'objectives': [
'Improve organizational efficiency',
'Achieve operational excellence',
'Scale operations sustainably'
],
'key_results': [
'Improve velocity by {target}%',
'Reduce cycle time to {target} days',
'Achieve {target}% automation',
'Improve team satisfaction to {target}',
'Reduce incidents by {target}%'
]
}
}
# Team focus areas for objective relevance matching
self.team_relevance = {
'Growth': ['acquisition', 'growth', 'activation', 'viral', 'onboarding', 'conversion'],
'Platform': ['infrastructure', 'reliability', 'scale', 'performance', 'efficiency', 'automation'],
'Mobile': ['mobile', 'app', 'ios', 'android', 'native'],
'Data': ['analytics', 'metrics', 'insights', 'data', 'measurement', 'experimentation'],
'Engineering': ['delivery', 'velocity', 'quality', 'automation', 'infrastructure'],
'Design': ['experience', 'usability', 'interface', 'user', 'accessibility'],
'Product': ['features', 'roadmap', 'prioritization', 'strategy'],
}
def generate_company_okrs(self, strategy: str, metrics: Dict) -> Dict:
"""Generate company-level OKRs based on strategy"""
if strategy not in self.okr_templates:
strategy = 'growth'
template = self.okr_templates[strategy]
company_okrs = {
'level': 'Company',
'quarter': self._get_current_quarter(),
'strategy': strategy,
'objectives': []
}
for i in range(min(3, len(template['objectives']))):
obj = {
'id': f'CO-{i+1}',
'title': template['objectives'][i],
'key_results': [],
'owner': 'CEO',
'status': 'draft'
}
for j in range(3):
if j < len(template['key_results']):
kr_template = template['key_results'][j]
kr = {
'id': f'CO-{i+1}-KR{j+1}',
'title': self._fill_metrics(kr_template, metrics),
'current': metrics.get('current', 0),
'target': metrics.get('target', 100),
'unit': self._extract_unit(kr_template),
'status': 'not_started'
}
obj['key_results'].append(kr)
company_okrs['objectives'].append(obj)
return company_okrs
def cascade_to_product(self, company_okrs: Dict) -> Dict:
"""Cascade company OKRs to product organization"""
product_okrs = {
'level': 'Product',
'quarter': company_okrs['quarter'],
'parent': 'Company',
'contribution': self.product_contribution,
'objectives': []
}
for company_obj in company_okrs['objectives']:
product_obj = {
'id': f'PO-{company_obj["id"].split("-")[1]}',
'title': self._translate_to_product(company_obj['title']),
'parent_objective': company_obj['id'],
'key_results': [],
'owner': 'Head of Product',
'status': 'draft'
}
for kr in company_obj['key_results']:
product_kr = {
'id': f'PO-{product_obj["id"].split("-")[1]}-KR{kr["id"].split("KR")[1]}',
'title': self._translate_kr_to_product(kr['title']),
'contributes_to': kr['id'],
'current': kr['current'],
'target': kr['target'] * self.product_contribution,
'unit': kr['unit'],
'contribution_pct': self.product_contribution * 100,
'status': 'not_started'
}
product_obj['key_results'].append(product_kr)
product_okrs['objectives'].append(product_obj)
return product_okrs
def cascade_to_teams(self, product_okrs: Dict) -> List[Dict]:
"""Cascade product OKRs to individual teams"""
team_okrs = []
team_contribution = 1.0 / len(self.teams) if self.teams else 0.25
for team in self.teams:
team_okr = {
'level': 'Team',
'team': team,
'quarter': product_okrs['quarter'],
'parent': 'Product',
'contribution': team_contribution,
'objectives': []
}
for product_obj in product_okrs['objectives']:
if self._is_relevant_for_team(product_obj['title'], team):
team_obj = {
'id': f'{team[:3].upper()}-{product_obj["id"].split("-")[1]}',
'title': self._translate_to_team(product_obj['title'], team),
'parent_objective': product_obj['id'],
'key_results': [],
'owner': f'{team} PM',
'status': 'draft'
}
for kr in product_obj['key_results'][:2]:
team_kr = {
'id': f'{team[:3].upper()}-{team_obj["id"].split("-")[1]}-KR{kr["id"].split("KR")[1]}',
'title': self._translate_kr_to_team(kr['title'], team),
'contributes_to': kr['id'],
'current': kr['current'],
'target': kr['target'] * team_contribution,
'unit': kr['unit'],
'status': 'not_started'
}
team_obj['key_results'].append(team_kr)
team_okr['objectives'].append(team_obj)
if team_okr['objectives']:
team_okrs.append(team_okr)
return team_okrs
def generate_okr_dashboard(self, all_okrs: Dict) -> str:
"""Generate OKR dashboard view"""
dashboard = ["=" * 60]
dashboard.append("OKR CASCADE DASHBOARD")
dashboard.append(f"Quarter: {all_okrs.get('quarter', 'Q1 2025')}")
dashboard.append(f"Strategy: {all_okrs.get('strategy', 'growth').upper()}")
dashboard.append(f"Teams: {', '.join(self.teams)}")
dashboard.append(f"Product Contribution: {self.product_contribution * 100:.0f}%")
dashboard.append("=" * 60)
# Company OKRs
if 'company' in all_okrs:
dashboard.append("\n🏢 COMPANY OKRS\n")
for obj in all_okrs['company']['objectives']:
dashboard.append(f"📌 {obj['id']}: {obj['title']}")
for kr in obj['key_results']:
dashboard.append(f" └─ {kr['id']}: {kr['title']}")
# Product OKRs
if 'product' in all_okrs:
dashboard.append("\n🚀 PRODUCT OKRS\n")
for obj in all_okrs['product']['objectives']:
dashboard.append(f"📌 {obj['id']}: {obj['title']}")
dashboard.append(f" ↳ Supports: {obj.get('parent_objective', 'N/A')}")
for kr in obj['key_results']:
dashboard.append(f" └─ {kr['id']}: {kr['title']}")
# Team OKRs
if 'teams' in all_okrs:
dashboard.append("\n👥 TEAM OKRS\n")
for team_okr in all_okrs['teams']:
dashboard.append(f"\n{team_okr['team']} Team:")
for obj in team_okr['objectives']:
dashboard.append(f" 📌 {obj['id']}: {obj['title']}")
for kr in obj['key_results']:
dashboard.append(f" └─ {kr['id']}: {kr['title']}")
# Alignment Matrix
dashboard.append("\n\n📊 ALIGNMENT MATRIX\n")
dashboard.append("Company → Product → Teams")
dashboard.append("-" * 40)
if 'company' in all_okrs and 'product' in all_okrs:
for c_obj in all_okrs['company']['objectives']:
dashboard.append(f"\n{c_obj['id']}")
for p_obj in all_okrs['product']['objectives']:
if p_obj.get('parent_objective') == c_obj['id']:
dashboard.append(f" ├─ {p_obj['id']}")
if 'teams' in all_okrs:
for team_okr in all_okrs['teams']:
for t_obj in team_okr['objectives']:
if t_obj.get('parent_objective') == p_obj['id']:
dashboard.append(f" └─ {t_obj['id']} ({team_okr['team']})")
return "\n".join(dashboard)
def calculate_alignment_score(self, all_okrs: Dict) -> Dict:
"""Calculate alignment score across OKR cascade"""
scores = {
'vertical_alignment': 0,
'horizontal_alignment': 0,
'coverage': 0,
'balance': 0,
'overall': 0
}
# Vertical alignment: How well each level supports the above
total_objectives = 0
aligned_objectives = 0
if 'product' in all_okrs:
for obj in all_okrs['product']['objectives']:
total_objectives += 1
if 'parent_objective' in obj:
aligned_objectives += 1
if 'teams' in all_okrs:
for team in all_okrs['teams']:
for obj in team['objectives']:
total_objectives += 1
if 'parent_objective' in obj:
aligned_objectives += 1
if total_objectives > 0:
scores['vertical_alignment'] = round((aligned_objectives / total_objectives) * 100, 1)
# Horizontal alignment: How well teams coordinate
if 'teams' in all_okrs and len(all_okrs['teams']) > 1:
shared_objectives = set()
for team in all_okrs['teams']:
for obj in team['objectives']:
parent = obj.get('parent_objective')
if parent:
shared_objectives.add(parent)
scores['horizontal_alignment'] = min(100, len(shared_objectives) * 25)
# Coverage: How much of company OKRs are covered
if 'company' in all_okrs and 'product' in all_okrs:
company_krs = sum(len(obj['key_results']) for obj in all_okrs['company']['objectives'])
covered_krs = sum(len(obj['key_results']) for obj in all_okrs['product']['objectives'])
if company_krs > 0:
scores['coverage'] = round((covered_krs / company_krs) * 100, 1)
# Balance: Distribution across teams
if 'teams' in all_okrs:
objectives_per_team = [len(team['objectives']) for team in all_okrs['teams']]
if objectives_per_team:
avg_objectives = sum(objectives_per_team) / len(objectives_per_team)
variance = sum((x - avg_objectives) ** 2 for x in objectives_per_team) / len(objectives_per_team)
scores['balance'] = round(max(0, 100 - variance * 10), 1)
# Overall score
scores['overall'] = round(sum([
scores['vertical_alignment'] * 0.4,
scores['horizontal_alignment'] * 0.2,
scores['coverage'] * 0.2,
scores['balance'] * 0.2
]), 1)
return scores
def _get_current_quarter(self) -> str:
"""Get current quarter"""
now = datetime.now()
quarter = (now.month - 1) // 3 + 1
return f"Q{quarter} {now.year}"
def _fill_metrics(self, template: str, metrics: Dict) -> str:
"""Fill template with actual metrics"""
result = template
for key, value in metrics.items():
result = result.replace(f'{{{key}}}', str(value))
return result
def _extract_unit(self, kr_template: str) -> str:
"""Extract measurement unit from KR template"""
if '%' in kr_template:
return '%'
elif '$' in kr_template:
return '$'
elif 'days' in kr_template.lower():
return 'days'
elif 'score' in kr_template.lower():
return 'points'
return 'count'
def _translate_to_product(self, company_objective: str) -> str:
"""Translate company objective to product objective"""
translations = {
'Accelerate user acquisition': 'Build viral product features',
'Achieve product-market fit': 'Validate product hypotheses',
'Build sustainable growth': 'Create product-led growth loops',
'Create lasting customer value': 'Design sticky user experiences',
'Drive sustainable revenue': 'Optimize product monetization',
'Lead the market through': 'Ship innovative features to',
'Improve organizational': 'Improve product delivery'
}
for key, value in translations.items():
if key in company_objective:
return company_objective.replace(key, value)
return f"Product: {company_objective}"
def _translate_kr_to_product(self, kr: str) -> str:
"""Translate KR to product context"""
product_terms = {
'MAU': 'product MAU',
'growth rate': 'feature adoption rate',
'CAC': 'product onboarding efficiency',
'retention': 'product retention',
'NPS': 'product NPS',
'ARR': 'product-driven revenue',
'churn': 'product churn'
}
result = kr
for term, replacement in product_terms.items():
if term in result:
result = result.replace(term, replacement)
break
return result
def _translate_to_team(self, objective: str, team: str) -> str:
"""Translate objective to team context"""
team_focus = {
'Growth': 'acquisition and activation',
'Platform': 'infrastructure and reliability',
'Mobile': 'mobile experience',
'Data': 'analytics and insights',
'Engineering': 'technical delivery',
'Design': 'user experience',
'Product': 'product strategy'
}
focus = team_focus.get(team, 'delivery')
return f"{objective} through {focus}"
def _translate_kr_to_team(self, kr: str, team: str) -> str:
"""Translate KR to team context"""
return f"[{team}] {kr}"
def _is_relevant_for_team(self, objective: str, team: str) -> bool:
"""Check if objective is relevant for team"""
keywords = self.team_relevance.get(team, [])
objective_lower = objective.lower()
# Platform is always relevant (infrastructure supports everything)
if team == 'Platform':
return True
return any(keyword in objective_lower for keyword in keywords)
def parse_teams(teams_str: str) -> List[str]:
"""Parse comma-separated team string into list"""
if not teams_str:
return None
return [t.strip() for t in teams_str.split(',') if t.strip()]
def main():
parser = argparse.ArgumentParser(
description='Generate OKR cascade from company strategy to team level',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Generate growth strategy OKRs with default teams
python okr_cascade_generator.py growth
# Custom teams
python okr_cascade_generator.py retention --teams "Engineering,Design,Data,Growth"
# Custom product contribution percentage
python okr_cascade_generator.py revenue --contribution 0.4
# JSON output
python okr_cascade_generator.py innovation --json
# All options combined
python okr_cascade_generator.py operational --teams "Core,Platform" --contribution 0.5 --json
"""
)
parser.add_argument(
'strategy',
nargs='?',
choices=['growth', 'retention', 'revenue', 'innovation', 'operational'],
default='growth',
help='Strategy type (default: growth)'
)
parser.add_argument(
'--teams', '-t',
type=str,
help='Comma-separated list of team names (default: Growth,Platform,Mobile,Data)'
)
parser.add_argument(
'--contribution', '-c',
type=float,
default=0.3,
help='Product contribution to company OKRs as decimal (default: 0.3 = 30%%)'
)
parser.add_argument(
'--json', '-j',
action='store_true',
help='Output as JSON instead of dashboard'
)
parser.add_argument(
'--metrics', '-m',
type=str,
help='Metrics as JSON string (default: sample metrics)'
)
args = parser.parse_args()
# Parse teams
teams = parse_teams(args.teams)
# Parse metrics
if args.metrics:
metrics = json.loads(args.metrics)
else:
metrics = {
'current': 100000,
'target': 150000,
'current_revenue': 10,
'target_revenue': 15,
'current_nps': 40,
'target_nps': 60
}
# Validate contribution
if not 0 < args.contribution <= 1:
print("Error: Contribution must be between 0 and 1")
return 1
# Generate OKRs
generator = OKRGenerator(teams=teams, product_contribution=args.contribution)
company_okrs = generator.generate_company_okrs(args.strategy, metrics)
product_okrs = generator.cascade_to_product(company_okrs)
team_okrs = generator.cascade_to_teams(product_okrs)
all_okrs = {
'quarter': company_okrs['quarter'],
'strategy': args.strategy,
'company': company_okrs,
'product': product_okrs,
'teams': team_okrs
}
alignment = generator.calculate_alignment_score(all_okrs)
if args.json:
all_okrs['alignment_scores'] = alignment
all_okrs['config'] = {
'teams': generator.teams,
'product_contribution': generator.product_contribution
}
print(json.dumps(all_okrs, indent=2))
else:
dashboard = generator.generate_okr_dashboard(all_okrs)
print(dashboard)
print("\n\n🎯 ALIGNMENT SCORES")
print("-" * 40)
for metric, score in alignment.items():
status = "✓" if score >= 80 else "!" if score >= 60 else "✗"
print(f"{status} {metric.replace('_', ' ').title()}: {score}%")
if alignment['overall'] >= 80:
print("\n✅ Overall alignment is GOOD (≥80%)")
elif alignment['overall'] >= 60:
print("\n⚠️ Overall alignment NEEDS ATTENTION (60-80%)")
else:
print("\n❌ Overall alignment is POOR (<60%)")
if __name__ == "__main__":
main()