
Launch Strategy
- 85 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
launch-strategy is a skill that provides phased launch playbooks, ORB channel strategy, and Product Hunt guidance for launching products, features, and pricing changes.
About
This skill provides a playbook for launching products and features, treating a launch as a campaign with pre-launch, launch day, and post-launch phases. It classifies releases into four tiers, plans channels with the Owned/Rented/Borrowed framework, and includes a Product Hunt playbook and time-boxed launch-day checklist. Founders and marketers use it to plan and execute a new product, feature, or pricing launch.
- Provides phased launch plans (pre-launch, launch day, post-launch) with a four-tier classification
- Uses the ORB channel framework (Owned/Rented/Borrowed) to plan launch channels by tier
- Includes Product Hunt playbook, launch-day checklist, and asset checklist
Launch Strategy by the numbers
- 85 all-time installs (skills.sh)
- Ranked #457 of 853 Sales & Marketing skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
launch-strategy capabilities & compatibility
- Capabilities
- launch planning · go to market · product hunt launch · channel strategy
- Use cases
- marketing · planning
- Pricing
- Free
What launch-strategy says it does
A product launch is not an event -- it is a campaign with pre-launch, launch day, and post-launch phases.
Categorize every launch channel as Owned, Rented, or Borrowed:
Submit to Product Hunt (if planned -- see PH section)
npx skills add https://github.com/borghei/claude-skills --skill launch-strategyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 85 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Plan and execute a phased product or feature launch across owned, rented, and borrowed channels including Product Hunt.
Who is it for?
Founders and marketers planning a new product, feature, or pricing launch with a phased campaign.
Skip if: Minor bug-fix changelog updates that need no marketing effort.
When should I use this skill?
You are launching a new product, major feature, pricing change, or planning a Product Hunt launch.
What you get
Produces a tiered, phased launch plan with channel allocation, asset checklist, and launch-day execution steps.
- Phased launch plan
- Channel strategy by tier
- Launch-day checklist
By the numbers
- Four launch tiers from Major Launch to Changelog
- Three launch phases: pre-launch, launch day, post-launch
- ORB channel framework: Owned, Rented, Borrowed
Files
Launch Strategy
Category: Marketing Tags: product launch, feature release, Product Hunt, go-to-market, launch playbook, announcement strategy
Overview
Launch Strategy provides the complete playbook for launching products and features that build momentum, capture attention, and convert interest into users. A product launch is not an event -- it is a campaign with pre-launch, launch day, and post-launch phases. Shipping without a launch plan is leaving growth on the table.
---
Launch Tiers
Not every release deserves the same effort. Classify first.
| Tier | What It Is | Marketing Effort | Examples |
|---|---|---|---|
| Tier 1: Major Launch | New product, major pivot, rebrand | 4-8 weeks prep, all channels | New product launch, platform launch |
| Tier 2: Feature Launch | Significant new capability | 2-4 weeks prep, owned + select channels | Major feature, integration, new plan |
| Tier 3: Update | Improvement to existing feature | 1 week prep, owned channels only | Performance improvement, UI refresh |
| Tier 4: Changelog | Bug fix, minor improvement | Same day, changelog only | Bug fixes, minor UX tweaks |
The rest of this skill focuses on Tier 1-2 launches. Tier 3-4 follow a simplified version of the same process.
---
Phase 1: Pre-Launch (4-8 Weeks Before)
Week 8-6: Foundation
Positioning & Messaging 1. Define the one-sentence value prop for this launch 2. Identify primary audience segment (who cares most about this?) 3. Draft the headline you want to see in coverage 4. Answer the "so what?" question -- why should anyone care?
Positioning Template:
For [target audience] who [need/pain point],
[product/feature] is the [category]
that [key benefit].
Unlike [alternatives],
we [key differentiator].Asset Checklist:
- [ ] Landing page copy and design
- [ ] Product screenshots / demo video
- [ ] Blog post (announcement)
- [ ] Email announcement draft
- [ ] Social media posts (per platform)
- [ ] Press release / media pitch (Tier 1 only)
- [ ] Internal FAQ for team
- [ ] Customer FAQ
Week 6-4: Build Momentum
Audience Warming
- Tease the launch in social posts (building in public)
- Share behind-the-scenes development content
- Engage with potential users about the problem you are solving
- Collect early feedback from beta users
Waitlist / Early Access For Tier 1 launches, consider a waitlist to build anticipation:
Waitlist Landing Page Elements:
1. Clear headline: what is coming
2. One-sentence description: why it matters
3. Email capture form
4. Social proof: "Join [X] others waiting"
5. Expected launch date
6. Share incentive: "Move up the list by sharing"Week 4-2: Prepare Channels
The ORB Channel Framework
Categorize every launch channel as Owned, Rented, or Borrowed:
| Channel Type | Definition | Examples | Control |
|---|---|---|---|
| Owned | You control the audience | Email list, blog, product (in-app), changelog | Full |
| Rented | You pay for access | Paid ads, sponsorships, promoted posts | High (while paying) |
| Borrowed | You earn access through others | Press, influencer mentions, community shares, Product Hunt | Low |
Channel Strategy by Tier:
| Channel | Tier 1 | Tier 2 | Tier 3 |
|---|---|---|---|
| Email (full list) | Yes | Yes | Segment only |
| Blog post | Long-form | Short-form | Changelog |
| Social media | Multi-post campaign | Single announcement | Brief mention |
| In-app notification | Yes | Yes | Optional |
| Product Hunt | If applicable | No | No |
| Press / media | Targeted pitches | No | No |
| Paid amplification | Budget allocated | Small budget | No |
| Partner co-marketing | If applicable | No | No |
| Community posts | HN, Reddit, Discord | HN maybe | No |
Week 2-1: Final Prep
- [ ] All assets created and reviewed
- [ ] Landing page live (or ready to flip)
- [ ] Email sequences loaded and tested
- [ ] Social posts scheduled
- [ ] Team briefed on launch plan and talking points
- [ ] Analytics tracking configured for launch metrics
- [ ] Support team briefed on new feature / expected questions
- [ ] Rollback plan documented (if something goes wrong)
---
Phase 2: Launch Day Execution
Launch Day Checklist (Time-Boxed)
T-2 hours:
- [ ] Final check: landing page, links, tracking all working
- [ ] Team Slack channel open for coordination
- [ ] Support team ready
T-0 (Launch):
- [ ] Flip landing page / feature gate live
- [ ] Send email announcement (Segment 1: most engaged users)
- [ ] Publish blog post
- [ ] Post on social media (all platforms, staggered by 30 min)
- [ ] Submit to Product Hunt (if planned -- see PH section)
- [ ] Post in relevant communities (HN, Reddit, Discord)
- [ ] Notify partners for co-promotion
T+2 hours:
- [ ] Check analytics: traffic, signups, errors
- [ ] Respond to all social media comments/questions
- [ ] Send email announcement (Segment 2: broader list)
- [ ] Monitor Product Hunt ranking (if applicable)
T+6 hours:
- [ ] Share early results with team
- [ ] Address any support issues
- [ ] Engage with community discussion threads
- [ ] Schedule next-day follow-up content
End of Day:
- [ ] Document day-one metrics
- [ ] Thank early adopters publicly
- [ ] Note any issues for immediate fix
- [ ] Confirm next-day plan
Launch Day Communication Rules
1. Respond to everything -- launch day is not the day to ignore comments 2. Founder engagement -- CEO/founders should personally reply on HN, Reddit, PH 3. Celebrate wins publicly -- share milestones as they happen ("500 signups in first 3 hours!") 4. Address issues immediately -- if something breaks, communicate before people complain 5. Never argue -- if someone criticizes, thank them and learn
---
Phase 3: Product Hunt Playbook
Product Hunt is a launch channel, not a launch strategy. It works best when combined with the full ORB approach.
PH Timeline
Week -4: Preparation
- Create / update Maker profile
- Engage genuinely in PH community (comment on other products)
- Build relationships with active PH hunters
- Draft listing: tagline, description, first comment, media
Week -1: Pre-Launch
- Confirm launch date (Tuesday, Wednesday, or Thursday -- avoid Monday/Friday)
- Prepare all PH assets:
- Thumbnail (240x240, clean, recognizable)
- Gallery images (1270x760, show the product, not marketing fluff)
- Demo video or GIF (under 60s)
- First comment (personal, story-driven, not corporate)
- Notify your network: "We are launching on PH on [date]"
- Do NOT ask for upvotes (against PH guidelines and counterproductive)
Launch Day (12:01 AM PT)
- Submit immediately after midnight PT (products are ranked by votes within a 24h window starting at midnight PT)
- Post first comment within 5 minutes (this is your pitch)
- Share across channels: "We launched on Product Hunt today" with direct link
- Respond to EVERY comment on PH within 30 minutes
- Engage authentically -- answer questions, thank feedback, acknowledge criticism
First Comment Template:
Hey PH! [Name] here, [role] at [Company].
We built [product] because [personal story about the problem].
[1-2 sentences about what it does and why it's different]
Here's what you get:
- [Key feature 1]
- [Key feature 2]
- [Key feature 3]
Special for PH: [offer -- extended trial, discount, early access to feature]
Would love your honest feedback. Happy to answer any questions!PH Success Metrics
| Outcome | What It Means |
|---|---|
| Top 5 of the day | Strong launch, badge, homepage visibility |
| Top 10 of the day | Good launch, still gets homepage traffic for 24h |
| Below top 10 | Minimal PH-specific value, but launch content still works elsewhere |
| Product of the week/month | Significant ongoing PH traffic |
---
Phase 4: Post-Launch Momentum (30 Days)
The launch is not over on day one. Most of the value comes from sustained post-launch activity.
Week 1 (Days 2-7)
- [ ] Publish follow-up content: "What we learned from launching"
- [ ] Share metrics publicly if impressive: "1,000 signups in 48 hours"
- [ ] Create comparison pages: [Product] vs [Competitor A], vs [Competitor B]
- [ ] Reach out to people who engaged on launch day for testimonials
- [ ] Fix any issues reported on launch day
Week 2 (Days 8-14)
- [ ] Publish case study or early user story
- [ ] Create interactive demo or product tour
- [ ] Submit to relevant directories and lists (G2, Capterra, AlternativeTo)
- [ ] Pitch guest posts to relevant blogs / newsletters
- [ ] Run retargeting ads to launch day visitors who did not convert
Week 3-4 (Days 15-30)
- [ ] Publish "roundup" email to full list with launch highlights + social proof
- [ ] Create SEO-optimized content around launch keywords
- [ ] Analyze full launch funnel: what worked, what did not, what to repeat
- [ ] Document launch playbook for next time (what you would do differently)
- [ ] Plan next feature launch using learnings
---
Launch Metrics
Pre-Launch Metrics
| Metric | Target | Source |
|---|---|---|
| Waitlist signups | 500+ for Tier 1 | Landing page |
| Email list growth | 10%+ increase | Email platform |
| Social engagement on teaser content | 2x normal | Platform analytics |
Launch Day Metrics
| Metric | Target | Source |
|---|---|---|
| Landing page visitors | 5x normal daily | GA4 |
| Signup/conversion rate | 5-15% of visitors | Product analytics |
| Social shares/mentions | 50+ | Social monitoring |
| Product Hunt rank | Top 5 | Product Hunt |
Post-Launch Metrics (30 day)
| Metric | Target | Source |
|---|---|---|
| Total signups attributed to launch | 2-5x monthly average | Attribution |
| Activation rate of launch signups | Match or exceed normal cohort | Product analytics |
| Press/blog mentions | 3+ organic mentions | Google Alerts |
| SEO keyword rankings | Ranking for launch keywords | Search console |
---
Proactive Triggers
- Feature ship date mentioned with no marketing plan: immediately ask about launch strategy
- Waitlist or early access mentioned: design the full phased funnel, not just a landing page
- Product Hunt considered: trigger the full PH playbook with the 4-week timeline
- Post-launch silence: suggest momentum content if nothing published after day 3
- Pricing change planned: treat it as a Tier 2 launch opportunity
---
Related Skills
| Skill | Use When |
|---|---|
| email-sequence | Building launch announcement and post-launch onboarding sequences |
| social-media-manager | Coordinating social strategy around the launch |
| content-creator | Writing blog posts and landing page copy for the launch |
| analytics-tracking | Setting up tracking for launch conversion metrics |
| ab-test-setup | Testing launch page variants |
---
Troubleshooting
| Symptom | Likely Cause | Resolution |
|---|---|---|
| Launch day traffic spike but near-zero signups | Landing page value proposition unclear or CTA buried | Audit landing page: headline must answer "what is this and why should I care" in 5 seconds |
| Product Hunt submission gets below 50 upvotes | No community warm-up, poor listing assets, or launched on wrong day | Follow 4-week PH playbook; launch Tue-Thu; ensure gallery images show product, not marketing graphics |
| Post-launch momentum dies by day 3 | No post-launch content plan; team assumes launch day is the end | Execute 30-day post-launch plan with follow-up content, testimonials, and retargeting |
| Email open rate below 15% on launch announcement | Subject line not compelling or list not segmented by engagement | A/B test subject lines; segment by engagement (send to most engaged first, then broader list) |
| Support team overwhelmed on launch day | Not briefed on new feature or FAQ not prepared | Include support briefing and FAQ creation in pre-launch checklist, minimum 1 week before launch |
| Metrics dashboard shows no data on launch day | Tracking not configured or UTMs not applied to launch URLs | Include tracking verification in final QA checklist, test all conversion events in staging first |
---
Success Criteria
- Launch readiness score above 80% on readiness checker before go-live decision
- Launch day traffic at least 5x normal daily traffic
- Signup/conversion rate between 5-15% of launch day visitors
- 50+ social shares/mentions on launch day
- Product Hunt top 5 finish (for Tier 1 launches using PH channel)
- Post-launch 30-day signups at 2-5x monthly average
- Activation rate of launch cohort matches or exceeds normal cohort within 10%
---
Scope & Limitations
In Scope: Phased launch planning (Tier 1-4), ORB channel strategy, Product Hunt playbook, launch day execution checklists, post-launch momentum campaigns, waitlist management, launch metrics tracking, launch readiness assessment.
Out of Scope: Product development and feature readiness (engineering responsibility), pricing strategy (see marketing-strategy-pmm skill), ongoing marketing operations (see marketing-ops skill), press and media relationship building (PR function).
Limitations: Launch success depends on product-market fit — no launch strategy compensates for a product that does not solve a real problem. Product Hunt effectiveness varies by product category; B2C and developer tools typically perform better than enterprise B2B. Post-launch metrics require 30 days minimum for meaningful assessment.
---
Scripts
| Script | Purpose | Usage |
|---|---|---|
scripts/launch_readiness_checker.py | Assess go/no-go readiness across positioning, assets, channels, team, tracking | python scripts/launch_readiness_checker.py checklist.json --tier 1 |
scripts/launch_timeline_generator.py | Generate week-by-week launch timeline with tasks and owners | python scripts/launch_timeline_generator.py --date 2026-04-15 --tier 1 |
scripts/launch_metrics_tracker.py | Track actual vs target metrics across pre-launch, launch day, and post-launch | python scripts/launch_metrics_tracker.py metrics.json --demo |
#!/usr/bin/env python3
"""Launch Metrics Tracker - Track and analyze product launch performance metrics.
Compares actual launch metrics against targets across pre-launch, launch day,
and post-launch phases. Generates performance reports with variance analysis.
Usage:
python launch_metrics_tracker.py metrics.json
python launch_metrics_tracker.py metrics.json --json
python launch_metrics_tracker.py --demo
"""
import argparse
import json
import sys
DEFAULT_TARGETS = {
"pre_launch": {
"waitlist_signups": {"target": 500, "unit": "signups", "direction": "higher_better"},
"email_list_growth_pct": {"target": 10, "unit": "%", "direction": "higher_better"},
"social_engagement_multiple": {"target": 2.0, "unit": "x", "direction": "higher_better"},
},
"launch_day": {
"landing_page_visitors": {"target": 5000, "unit": "visitors", "direction": "higher_better"},
"signup_rate": {"target": 8, "unit": "%", "direction": "higher_better"},
"total_signups": {"target": 400, "unit": "signups", "direction": "higher_better"},
"social_mentions": {"target": 50, "unit": "mentions", "direction": "higher_better"},
"product_hunt_rank": {"target": 5, "unit": "rank", "direction": "lower_better"},
},
"post_launch_30d": {
"total_signups_attributed": {"target": 2000, "unit": "signups", "direction": "higher_better"},
"activation_rate": {"target": 35, "unit": "%", "direction": "higher_better"},
"press_mentions": {"target": 3, "unit": "mentions", "direction": "higher_better"},
"seo_keywords_ranking": {"target": 5, "unit": "keywords", "direction": "higher_better"},
"referral_signups_pct": {"target": 15, "unit": "%", "direction": "higher_better"},
},
}
def analyze_metrics(data, targets=None):
"""Analyze launch metrics against targets."""
if targets is None:
targets = DEFAULT_TARGETS
phases = {}
for phase_name, phase_targets in targets.items():
actuals = data.get(phase_name, {})
metrics = []
for metric_name, target_info in phase_targets.items():
actual = actuals.get(metric_name)
target = target_info["target"]
direction = target_info.get("direction", "higher_better")
unit = target_info.get("unit", "")
if actual is not None:
if direction == "higher_better":
variance = actual - target
variance_pct = ((actual - target) / target * 100) if target != 0 else 0
on_track = actual >= target
else:
variance = target - actual
variance_pct = ((target - actual) / target * 100) if target != 0 else 0
on_track = actual <= target
status = "exceeded" if (variance_pct > 10) else ("on_track" if on_track else ("at_risk" if variance_pct > -20 else "missed"))
else:
variance = None
variance_pct = None
on_track = None
status = "no_data"
metrics.append({
"metric": metric_name,
"target": target,
"actual": actual,
"unit": unit,
"variance": round(variance, 1) if variance is not None else None,
"variance_pct": round(variance_pct, 1) if variance_pct is not None else None,
"status": status,
})
# Phase summary
tracked = [m for m in metrics if m["status"] != "no_data"]
on_track_count = len([m for m in tracked if m["status"] in ("on_track", "exceeded")])
phase_score = (on_track_count / len(tracked) * 100) if tracked else 0
phases[phase_name] = {
"metrics": metrics,
"total_metrics": len(metrics),
"tracked": len(tracked),
"on_track": on_track_count,
"phase_score": round(phase_score, 1),
"phase_status": "strong" if phase_score >= 70 else ("moderate" if phase_score >= 40 else "weak"),
}
# Overall launch score
all_tracked = sum(p["tracked"] for p in phases.values())
all_on_track = sum(p["on_track"] for p in phases.values())
overall_score = (all_on_track / all_tracked * 100) if all_tracked else 0
# Key insights
insights = []
for phase_name, phase_data in phases.items():
exceeded = [m for m in phase_data["metrics"] if m["status"] == "exceeded"]
missed = [m for m in phase_data["metrics"] if m["status"] == "missed"]
for m in exceeded:
insights.append({
"type": "positive",
"phase": phase_name,
"insight": f"{m['metric'].replace('_', ' ').title()} exceeded target by {m['variance_pct']:.0f}% ({m['actual']} vs {m['target']} {m['unit']})",
})
for m in missed:
insights.append({
"type": "negative",
"phase": phase_name,
"insight": f"{m['metric'].replace('_', ' ').title()} missed target by {abs(m['variance_pct']):.0f}% ({m['actual']} vs {m['target']} {m['unit']})",
})
return {
"overall_score": round(overall_score, 1),
"overall_status": "successful" if overall_score >= 70 else ("moderate" if overall_score >= 40 else "underperforming"),
"phases": phases,
"insights": insights,
"metrics_tracked": all_tracked,
"metrics_on_track": all_on_track,
}
def get_demo_data():
return {
"pre_launch": {
"waitlist_signups": 720,
"email_list_growth_pct": 12,
"social_engagement_multiple": 2.8,
},
"launch_day": {
"landing_page_visitors": 8200,
"signup_rate": 6.5,
"total_signups": 533,
"social_mentions": 87,
"product_hunt_rank": 3,
},
"post_launch_30d": {
"total_signups_attributed": 2850,
"activation_rate": 32,
"press_mentions": 5,
"seo_keywords_ranking": 8,
"referral_signups_pct": 11,
},
}
def format_report(analysis):
"""Format human-readable metrics report."""
lines = []
lines.append("=" * 70)
lines.append("LAUNCH METRICS REPORT")
lines.append("=" * 70)
lines.append(f"Overall Score: {analysis['overall_score']:.0f}% ({analysis['overall_status'].upper()})")
lines.append(f"Metrics Tracked: {analysis['metrics_on_track']}/{analysis['metrics_tracked']} on track")
lines.append("")
for phase_name, phase_data in analysis["phases"].items():
label = phase_name.replace("_", " ").title()
lines.append(f"--- {label} ({phase_data['phase_status'].upper()}, {phase_data['phase_score']:.0f}%) ---")
lines.append(f"{'Metric':<35} {'Target':>8} {'Actual':>8} {'Var %':>8} {'Status':>10}")
lines.append("-" * 75)
for m in phase_data["metrics"]:
metric_label = m["metric"].replace("_", " ").title()[:34]
target_str = f"{m['target']}{m['unit']}"
actual_str = f"{m['actual']}{m['unit']}" if m["actual"] is not None else "N/A"
var_str = f"{m['variance_pct']:+.0f}%" if m["variance_pct"] is not None else "N/A"
status_marker = {
"exceeded": "[++]",
"on_track": "[OK]",
"at_risk": "[!!]",
"missed": "[XX]",
"no_data": "[--]",
}[m["status"]]
lines.append(f"{metric_label:<35} {target_str:>8} {actual_str:>8} {var_str:>8} {status_marker:>10}")
lines.append("")
# Insights
if analysis["insights"]:
lines.append("--- KEY INSIGHTS ---")
for insight in analysis["insights"]:
marker = "+" if insight["type"] == "positive" else "-"
lines.append(f" [{marker}] {insight['insight']}")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Track and analyze launch performance metrics")
parser.add_argument("input", nargs="?", help="JSON file with actual metrics")
parser.add_argument("--targets", help="Custom targets JSON file")
parser.add_argument("--json", action="store_true", dest="json_output", help="Output JSON")
parser.add_argument("--demo", action="store_true", help="Run with demo data")
args = parser.parse_args()
if args.demo:
data = get_demo_data()
elif args.input:
try:
with open(args.input, "r", encoding="utf-8") as f:
data = json.load(f)
except FileNotFoundError:
print(f"Error: File not found: {args.input}", file=sys.stderr)
sys.exit(1)
else:
parser.print_help()
sys.exit(1)
targets = None
if args.targets:
with open(args.targets, "r", encoding="utf-8") as f:
targets = json.load(f)
analysis = analyze_metrics(data, targets)
if args.json_output:
print(json.dumps(analysis, indent=2))
else:
print(format_report(analysis))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""Launch Readiness Checker - Assess launch preparedness across all dimensions.
Evaluates launch assets, channel preparation, team readiness, and tracking
setup to generate a go/no-go readiness score.
Usage:
python launch_readiness_checker.py checklist.json
python launch_readiness_checker.py checklist.json --json
python launch_readiness_checker.py --tier 1 --interactive
"""
import argparse
import json
import sys
TIER_1_CHECKLIST = {
"positioning": {
"weight": 3,
"items": [
"One-sentence value prop defined",
"Primary audience segment identified",
"Key differentiator documented",
"Competitive positioning clear",
],
},
"assets": {
"weight": 3,
"items": [
"Landing page live or ready to flip",
"Blog post drafted and reviewed",
"Product screenshots or demo video ready",
"Email announcement drafted",
"Social media posts created per platform",
"Press release or media pitch prepared",
"Internal FAQ created",
"Customer FAQ created",
],
},
"channels": {
"weight": 2,
"items": [
"Email sequences loaded and tested",
"Social posts scheduled",
"Product Hunt listing prepared",
"Community posts drafted (HN, Reddit)",
"Paid amplification budget allocated",
"Partner co-marketing confirmed",
],
},
"team": {
"weight": 2,
"items": [
"Team briefed on launch plan",
"Support team briefed on new feature",
"Talking points distributed",
"Launch day schedule shared",
"Escalation contacts identified",
],
},
"tracking": {
"weight": 2,
"items": [
"Analytics tracking configured",
"UTM parameters created",
"Conversion events defined",
"Launch metrics dashboard ready",
],
},
"operations": {
"weight": 1,
"items": [
"Rollback plan documented",
"War room channel created",
"Post-launch follow-up plan ready",
],
},
}
TIER_2_CHECKLIST = {
"positioning": {
"weight": 3,
"items": [
"Value prop defined",
"Target audience identified",
],
},
"assets": {
"weight": 3,
"items": [
"Landing page or feature page ready",
"Blog post drafted",
"Email announcement drafted",
"Social media posts created",
],
},
"channels": {
"weight": 2,
"items": [
"Email loaded and tested",
"Social posts scheduled",
"In-app notification configured",
],
},
"team": {
"weight": 1,
"items": [
"Team briefed",
"Support team aware",
],
},
"tracking": {
"weight": 2,
"items": [
"Analytics tracking configured",
"UTM parameters created",
],
},
}
def assess_readiness(checklist_data, tier=1):
"""Assess launch readiness from checklist responses."""
template = TIER_1_CHECKLIST if tier == 1 else TIER_2_CHECKLIST
category_results = {}
total_weighted_score = 0
total_weight = 0
for category, config in template.items():
items = config["items"]
weight = config["weight"]
responses = checklist_data.get(category, {})
completed = 0
incomplete = []
for item in items:
status = responses.get(item, False)
if status:
completed += 1
else:
incomplete.append(item)
completion_rate = completed / max(len(items), 1)
weighted_score = completion_rate * weight
category_results[category] = {
"total_items": len(items),
"completed": completed,
"completion_rate": round(completion_rate * 100, 1),
"weight": weight,
"weighted_score": round(weighted_score, 2),
"incomplete_items": incomplete,
"status": "ready" if completion_rate >= 0.8 else ("at_risk" if completion_rate >= 0.5 else "not_ready"),
}
total_weighted_score += weighted_score
total_weight += weight
overall_score = (total_weighted_score / total_weight * 100) if total_weight > 0 else 0
# Go/No-Go decision
blocking = []
for cat, result in category_results.items():
if result["status"] == "not_ready" and template[cat]["weight"] >= 2:
blocking.append(cat)
if overall_score >= 80 and not blocking:
decision = "GO"
rationale = "All critical categories meet minimum readiness. Proceed with launch."
elif overall_score >= 60 and not blocking:
decision = "CONDITIONAL GO"
rationale = "Core readiness met. Complete remaining items in parallel with launch."
else:
decision = "NO-GO"
rationale = f"Critical gaps in: {', '.join(blocking)}. Resolve before launching."
# Risk assessment
risks = []
for cat, result in category_results.items():
if result["incomplete_items"]:
severity = "high" if template[cat]["weight"] >= 3 else ("medium" if template[cat]["weight"] >= 2 else "low")
for item in result["incomplete_items"]:
risks.append({
"category": cat,
"item": item,
"severity": severity,
})
risks.sort(key=lambda r: {"high": 0, "medium": 1, "low": 2}[r["severity"]])
return {
"tier": tier,
"overall_score": round(overall_score, 1),
"decision": decision,
"rationale": rationale,
"categories": category_results,
"blocking_categories": blocking,
"risks": risks,
"total_items": sum(r["total_items"] for r in category_results.values()),
"total_completed": sum(r["completed"] for r in category_results.values()),
}
def run_interactive(tier=1):
"""Run interactive readiness check."""
template = TIER_1_CHECKLIST if tier == 1 else TIER_2_CHECKLIST
print(f"=== LAUNCH READINESS CHECK (Tier {tier}) ===")
print("Answer y/n for each item:\n")
checklist_data = {}
for category, config in template.items():
print(f"\n--- {category.upper()} ---")
checklist_data[category] = {}
for item in config["items"]:
try:
answer = input(f" {item}? (y/n): ").strip().lower()
checklist_data[category][item] = answer in ("y", "yes", "1", "true")
except EOFError:
checklist_data[category][item] = False
return checklist_data
def format_report(analysis):
"""Format human-readable report."""
lines = []
lines.append("=" * 65)
lines.append(f"LAUNCH READINESS REPORT (Tier {analysis['tier']})")
lines.append("=" * 65)
lines.append(f"Overall Score: {analysis['overall_score']:.0f}%")
lines.append(f"Decision: {analysis['decision']}")
lines.append(f"Rationale: {analysis['rationale']}")
lines.append(f"Items: {analysis['total_completed']}/{analysis['total_items']} complete")
lines.append("")
# Category breakdown
lines.append("--- CATEGORY BREAKDOWN ---")
for cat, data in analysis["categories"].items():
status_marker = {"ready": "[OK]", "at_risk": "[!!]", "not_ready": "[XX]"}[data["status"]]
bar_full = int(data["completion_rate"] / 5)
bar = "#" * bar_full + "." * (20 - bar_full)
lines.append(f" {status_marker} {cat:<15} [{bar}] {data['completion_rate']:.0f}% ({data['completed']}/{data['total_items']})")
lines.append("")
# Incomplete items by severity
high_risks = [r for r in analysis["risks"] if r["severity"] == "high"]
medium_risks = [r for r in analysis["risks"] if r["severity"] == "medium"]
if high_risks:
lines.append("--- CRITICAL GAPS (must resolve) ---")
for r in high_risks:
lines.append(f" [{r['category']}] {r['item']}")
lines.append("")
if medium_risks:
lines.append("--- IMPORTANT GAPS (should resolve) ---")
for r in medium_risks:
lines.append(f" [{r['category']}] {r['item']}")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Assess launch readiness")
parser.add_argument("input", nargs="?", help="JSON file with checklist responses")
parser.add_argument("--tier", type=int, choices=[1, 2], default=1, help="Launch tier")
parser.add_argument("--json", action="store_true", dest="json_output", help="Output JSON")
parser.add_argument("--interactive", action="store_true", help="Run interactive check")
args = parser.parse_args()
if args.interactive:
checklist_data = run_interactive(args.tier)
elif args.input:
try:
with open(args.input, "r", encoding="utf-8") as f:
checklist_data = json.load(f)
except FileNotFoundError:
print(f"Error: File not found: {args.input}", file=sys.stderr)
sys.exit(1)
else:
parser.print_help()
sys.exit(1)
analysis = assess_readiness(checklist_data, args.tier)
if args.json_output:
print(json.dumps(analysis, indent=2))
else:
print(format_report(analysis))
sys.exit(0 if analysis["decision"] in ("GO", "CONDITIONAL GO") else 1)
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""Launch Timeline Generator - Generate phased launch timelines with milestones.
Creates a week-by-week launch plan based on tier, launch date, and channel strategy.
Usage:
python launch_timeline_generator.py --date 2026-04-15 --tier 1
python launch_timeline_generator.py config.json --json
"""
import argparse
import json
import sys
from datetime import datetime, timedelta
TIER_1_TIMELINE = [
{"week_offset": -8, "phase": "Foundation", "tasks": [
{"task": "Define positioning and messaging", "owner": "PMM", "priority": "critical"},
{"task": "Identify primary audience segment", "owner": "PMM", "priority": "critical"},
{"task": "Draft competitive positioning", "owner": "PMM", "priority": "high"},
{"task": "Begin asset creation brief", "owner": "Marketing", "priority": "high"},
]},
{"week_offset": -6, "phase": "Asset Creation", "tasks": [
{"task": "Write landing page copy", "owner": "Copywriter", "priority": "critical"},
{"task": "Create product screenshots/demo video", "owner": "Design", "priority": "critical"},
{"task": "Draft blog announcement post", "owner": "Content", "priority": "high"},
{"task": "Draft email announcement", "owner": "Email", "priority": "high"},
{"task": "Create social media content calendar", "owner": "Social", "priority": "medium"},
]},
{"week_offset": -4, "phase": "Channel Preparation", "tasks": [
{"task": "Build and test landing page", "owner": "Web", "priority": "critical"},
{"task": "Set up tracking and UTMs", "owner": "Analytics", "priority": "critical"},
{"task": "Prepare Product Hunt listing", "owner": "Marketing", "priority": "medium"},
{"task": "Draft press release / media pitch", "owner": "PR", "priority": "medium"},
{"task": "Begin audience warming on social", "owner": "Social", "priority": "medium"},
{"task": "Set up waitlist if applicable", "owner": "Web", "priority": "medium"},
]},
{"week_offset": -2, "phase": "Final Preparation", "tasks": [
{"task": "Review all assets (final approval)", "owner": "Marketing Lead", "priority": "critical"},
{"task": "Load email sequences and test", "owner": "Email", "priority": "critical"},
{"task": "Schedule social posts", "owner": "Social", "priority": "high"},
{"task": "Brief team on launch plan", "owner": "Marketing Lead", "priority": "critical"},
{"task": "Brief support team", "owner": "Support Lead", "priority": "high"},
{"task": "Configure paid ad campaigns", "owner": "Paid", "priority": "high"},
{"task": "Document rollback plan", "owner": "Engineering", "priority": "medium"},
]},
{"week_offset": -1, "phase": "Pre-Launch Week", "tasks": [
{"task": "Final landing page QA", "owner": "QA", "priority": "critical"},
{"task": "Test all tracking fires correctly", "owner": "Analytics", "priority": "critical"},
{"task": "Confirm partner co-promotions", "owner": "Partnerships", "priority": "medium"},
{"task": "Send pre-launch teaser to VIP list", "owner": "Email", "priority": "medium"},
{"task": "Prepare launch day war room", "owner": "Marketing Lead", "priority": "high"},
]},
{"week_offset": 0, "phase": "LAUNCH WEEK", "tasks": [
{"task": "Launch Day: Flip page live, send emails, publish posts", "owner": "All", "priority": "critical"},
{"task": "Monitor analytics every 2 hours", "owner": "Analytics", "priority": "critical"},
{"task": "Respond to all comments/questions", "owner": "Social + Support", "priority": "critical"},
{"task": "Product Hunt engagement (if applicable)", "owner": "Founders", "priority": "high"},
{"task": "Send Day 2 follow-up content", "owner": "Content", "priority": "high"},
{"task": "Share early results with team", "owner": "Marketing Lead", "priority": "medium"},
]},
{"week_offset": 1, "phase": "Post-Launch Week 1", "tasks": [
{"task": "Publish 'what we learned' content", "owner": "Content", "priority": "high"},
{"task": "Collect early user testimonials", "owner": "CS", "priority": "high"},
{"task": "Create comparison pages", "owner": "Content", "priority": "medium"},
{"task": "Fix any reported issues", "owner": "Engineering", "priority": "critical"},
{"task": "Share public metrics if impressive", "owner": "Social", "priority": "medium"},
]},
{"week_offset": 3, "phase": "Post-Launch Month", "tasks": [
{"task": "Publish case study or user story", "owner": "Content", "priority": "high"},
{"task": "Submit to directories (G2, Capterra)", "owner": "Marketing", "priority": "medium"},
{"task": "Run retargeting on non-converters", "owner": "Paid", "priority": "medium"},
{"task": "Full launch retrospective", "owner": "Marketing Lead", "priority": "high"},
{"task": "Document playbook for next launch", "owner": "Marketing Lead", "priority": "medium"},
]},
]
TIER_2_TIMELINE = [
{"week_offset": -4, "phase": "Foundation & Assets", "tasks": [
{"task": "Define messaging for feature", "owner": "PMM", "priority": "critical"},
{"task": "Write feature page or update", "owner": "Copywriter", "priority": "critical"},
{"task": "Draft blog post", "owner": "Content", "priority": "high"},
{"task": "Create email announcement", "owner": "Email", "priority": "high"},
]},
{"week_offset": -2, "phase": "Preparation", "tasks": [
{"task": "Set up tracking", "owner": "Analytics", "priority": "critical"},
{"task": "Schedule social posts", "owner": "Social", "priority": "high"},
{"task": "Brief team", "owner": "Marketing Lead", "priority": "high"},
{"task": "Load email sequences", "owner": "Email", "priority": "high"},
]},
{"week_offset": 0, "phase": "LAUNCH", "tasks": [
{"task": "Publish page, send email, post social", "owner": "All", "priority": "critical"},
{"task": "Monitor analytics", "owner": "Analytics", "priority": "high"},
{"task": "In-app notification active", "owner": "Product", "priority": "high"},
]},
{"week_offset": 1, "phase": "Follow-Up", "tasks": [
{"task": "Collect feedback and testimonials", "owner": "CS", "priority": "medium"},
{"task": "Share results internally", "owner": "Marketing Lead", "priority": "medium"},
]},
]
def generate_timeline(launch_date, tier=1, custom_tasks=None):
"""Generate a dated timeline from launch date and tier."""
template = TIER_1_TIMELINE if tier == 1 else TIER_2_TIMELINE
if isinstance(launch_date, str):
launch_date = datetime.strptime(launch_date, "%Y-%m-%d")
phases = []
all_tasks = []
for phase_template in template:
offset_days = phase_template["week_offset"] * 7
phase_start = launch_date + timedelta(days=offset_days)
phase = {
"phase": phase_template["phase"],
"start_date": phase_start.strftime("%Y-%m-%d"),
"week_offset": phase_template["week_offset"],
"tasks": [],
}
for task in phase_template["tasks"]:
task_entry = {
"task": task["task"],
"owner": task["owner"],
"priority": task["priority"],
"due_date": phase_start.strftime("%Y-%m-%d"),
"status": "pending",
}
phase["tasks"].append(task_entry)
all_tasks.append(task_entry)
phases.append(phase)
# Add custom tasks
if custom_tasks:
for ct in custom_tasks:
offset = ct.get("week_offset", 0)
task_date = launch_date + timedelta(days=offset * 7)
task_entry = {
"task": ct.get("task", "Custom task"),
"owner": ct.get("owner", "TBD"),
"priority": ct.get("priority", "medium"),
"due_date": task_date.strftime("%Y-%m-%d"),
"status": "pending",
}
all_tasks.append(task_entry)
total_duration = (phases[-1]["start_date"] if phases else launch_date.strftime("%Y-%m-%d"))
prep_start = phases[0]["start_date"] if phases else launch_date.strftime("%Y-%m-%d")
return {
"tier": tier,
"launch_date": launch_date.strftime("%Y-%m-%d"),
"preparation_start": prep_start,
"total_tasks": len(all_tasks),
"critical_tasks": len([t for t in all_tasks if t["priority"] == "critical"]),
"phases": phases,
}
def format_report(timeline):
"""Format human-readable timeline."""
lines = []
lines.append("=" * 70)
lines.append(f"LAUNCH TIMELINE (Tier {timeline['tier']})")
lines.append("=" * 70)
lines.append(f"Launch Date: {timeline['launch_date']}")
lines.append(f"Prep Starts: {timeline['preparation_start']}")
lines.append(f"Total Tasks: {timeline['total_tasks']}")
lines.append(f"Critical Tasks: {timeline['critical_tasks']}")
lines.append("")
for phase in timeline["phases"]:
is_launch = "LAUNCH" in phase["phase"].upper()
marker = ">>>" if is_launch else "---"
lines.append(f"{marker} {phase['phase']} (Week {phase['week_offset']:+d}, {phase['start_date']}) {marker}")
for task in phase["tasks"]:
priority_marker = {"critical": "!!!", "high": "!!", "medium": "!", "low": ""}[task["priority"]]
lines.append(f" [{task['priority'][:1].upper()}] {priority_marker} {task['task']} ({task['owner']})")
lines.append("")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Generate phased launch timelines")
parser.add_argument("input", nargs="?", help="JSON config file")
parser.add_argument("--date", help="Launch date (YYYY-MM-DD)")
parser.add_argument("--tier", type=int, choices=[1, 2], default=1, help="Launch tier")
parser.add_argument("--json", action="store_true", dest="json_output", help="Output JSON")
args = parser.parse_args()
if args.input:
try:
with open(args.input, "r", encoding="utf-8") as f:
config = json.load(f)
launch_date = config.get("launch_date", config.get("date"))
tier = config.get("tier", args.tier)
custom_tasks = config.get("custom_tasks", [])
except FileNotFoundError:
print(f"Error: File not found: {args.input}", file=sys.stderr)
sys.exit(1)
elif args.date:
launch_date = args.date
tier = args.tier
custom_tasks = []
else:
parser.print_help()
sys.exit(1)
timeline = generate_timeline(launch_date, tier, custom_tasks)
if args.json_output:
print(json.dumps(timeline, indent=2))
else:
print(format_report(timeline))
if __name__ == "__main__":
main()
Related skills
FAQ
What is the ORB channel framework?
It categorizes every launch channel as Owned (you control the audience), Rented (you pay for access), or Borrowed (you earn access through others).
How many launch tiers does it define?
Four: Major Launch, Feature Launch, Update, and Changelog, each with different marketing effort.