
Free Tool Strategy
- 79 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
Free Tool Strategy is a Claude skill for planning free marketing tools (calculators, generators, checkers) that generate traffic, leads, and backlinks, from idea scoring to launch.
About
Free Tool Strategy is a Claude skill for planning free marketing tools like calculators, generators, checkers, and graders that generate traffic, leads, and backlinks. It covers idea evaluation with a 6-factor scoring system, lead-capture architecture, SEO landing pages, a launch playbook, and ROI measurement. A developer or marketer uses it to decide which free tool to build and how to convert its traffic.
- 6-factor scoring framework decides whether a free tool is worth building
- Covers lead-capture architecture, SEO landing pages, and launch playbook
- Value-before-gate design for calculators, checkers, and generators
Free Tool Strategy by the numbers
- 79 all-time installs (skills.sh)
- Ranked #1,193 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
free-tool-strategy capabilities & compatibility
Free; no API keys or external services required.
- Capabilities
- form cro · free tool strategy
- Use cases
- marketing · seo · copywriting
- Pricing
- Free
What free-tool-strategy says it does
Free tool marketing strategy covering idea evaluation, tool design, lead
Production-grade framework for building free tools that generate traffic, leads, and backlinks.
Give the core value first. Gate the upgrade.
npx skills add https://github.com/borghei/claude-skills --skill free-tool-strategyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 79 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Decide which free marketing tool to build and design its lead capture, SEO, and launch.
Who is it for?
Deciding which free tool to build for engineering-as-marketing and designing its lead capture, SEO, and launch.
Skip if: Building the paid product itself or non-marketing internal tooling.
When should I use this skill?
You want to evaluate, design, or launch a free tool for traffic, leads, or backlinks.
What you get
A scored, validated free-tool concept with lead-capture, SEO landing-page, and launch plans.
- 6-factor free-tool evaluation scorecard
- Lead-capture, SEO landing-page, and launch plan
By the numbers
- 6-factor evaluation framework scored out of 30
- 7 tool types compared
- build threshold of >500/month search volume
Files
Free Tool Strategy
Production-grade framework for building free tools that generate traffic, leads, and backlinks. Covers idea evaluation with a 6-factor scoring system, tool design patterns, lead capture architecture, SEO landing page strategy, launch playbook, and ROI measurement. Applicable to calculators, generators, checkers, graders, converters, templates, and interactive visualizations.
---
Table of Contents
- When to Build vs When Not To
- Tool Type Selection
- 6-Factor Evaluation Framework
- Tool Design Principles
- Lead Capture Architecture
- SEO Landing Page Strategy
- Launch Playbook
- Distribution Channels
- Measurement Framework
- Maintenance and Iteration
- Output Artifacts
- Related Skills
---
When to Build vs When Not To
Build a free tool when:
- Search volume exists for "[topic] calculator/generator/checker" (> 500/month)
- No excellent free alternative exists (or you can be 10x better)
- The tool naturally connects to your paid product
- You have engineering resources to build AND maintain it
- The tool produces shareable, bookmark-worthy output
Do NOT build when:
- A well-established free tool already exists and is sufficient
- The tool would be a thin wrapper with no unique value
- You cannot maintain it post-launch
- The tool requires data you do not have or cannot access
- Total addressable search volume is < 200/month
---
Tool Type Selection
| Tool Type | What It Does | Build Complexity | Lead Capture Fit | SEO Value | Example |
|---|---|---|---|---|---|
| Calculator | Takes inputs, outputs a number/range | Low-Medium | High (email the full report) | High | ROI calculator, LTV calculator, salary calculator |
| Generator | Creates text, ideas, or structured content | Low (template) to High (AI) | Medium (save/download results) | High | Headline generator, name generator, bio writer |
| Checker/Auditor | Analyzes a URL, text, or file and scores it | Medium-High | Very high (full report via email) | Very high | SEO audit, readability checker, accessibility checker |
| Grader | Scores something against a rubric | Medium | High (detailed scorecard) | High | Website grader, email subject line grader |
| Converter | Transforms input from one format to another | Low-Medium | Low (utility, quick use) | Medium | Unit converter, file converter, timezone converter |
| Template Library | Pre-built fillable documents | Very low | Medium (download gated) | High | Contract templates, brief templates, spreadsheet templates |
| Interactive Visualization | Shows data or concepts visually | High | Medium | Very high (link magnet) | Market maps, comparison charts, trend visualizers |
Selection Decision Tree
What do you want to generate?
├── Leads (email capture) → Checker/Auditor or Calculator (report gating)
├── SEO traffic → Calculator or Checker (high search volume keywords)
├── Backlinks → Interactive Visualization or Template Library (link magnet)
├── Brand awareness → Generator (shareable output, social virality)
└── All of the above → Checker/Auditor (highest combined value)---
6-Factor Evaluation Framework
Score each tool idea 1-5 on each factor. Maximum score: 30.
| Factor | What to Check | 1 (Weak) | 3 (Moderate) | 5 (Strong) |
|---|---|---|---|---|
| Search Volume | Monthly searches for "free [tool]" | < 100/mo | 500-2,000/mo | > 5,000/mo |
| Competition | Quality of existing free tools | Excellent tools exist | Decent tools, room to improve | No good free alternatives |
| Build Effort | Engineering time required | Months of work | 1-2 weeks | Days |
| Lead Capture Potential | Natural email gate opportunity | Forced gate kills UX | Reasonable gate | Natural fit (report, saved results) |
| SEO Value | Topical authority and backlink potential | Thin, one-page utility | Moderate content depth | Deep use case, link magnet |
| Viral Potential | Will users share results or embed? | Nobody would share | Some sharing potential | Results are inherently shareable |
Scoring Thresholds
| Score | Decision |
|---|---|
| 25-30 | Build immediately -- strong across all factors |
| 20-24 | Strong candidate -- validate search volume before committing |
| 15-19 | Conditional -- only if resources are available and strategic fit is strong |
| < 15 | Do not build -- rethink the concept or find a different angle |
---
Tool Design Principles
Value Before Gate
The cardinal rule: Give the core value first. Gate the upgrade.
| Good | Bad |
|---|---|
| Show the score immediately, offer to email the full report | "Enter your email to see your results" |
| Display the generated content, gate the save/export | Block all output behind email wall |
| Free basic analysis, premium detailed breakdown | Nothing visible without signup |
Minimal Friction Input
- Maximum 3 inputs to get initial results
- No account required for core value
- Progressive disclosure: simple first, detailed on request
- Smart defaults where possible (auto-detect, pre-fill)
Shareable Output
Design results so users want to share them:
| Mechanism | Implementation |
|---|---|
| Unique results URL | Each run gets a shareable permalink |
| Social share buttons | "Tweet your score" with pre-filled text |
| Downloadable report | PDF or CSV export |
| Embeddable badge/widget | "Scored 92/100 by [Your Tool]" badge |
| Visual score card | Social-media-ready image with result |
Mobile-First Design
- All inputs work on touch screens
- Results render cleanly on mobile
- Share buttons trigger native share sheet
- No hover-dependent UI elements
---
Lead Capture Architecture
When to Gate
| Gate Decision | Criteria |
|---|---|
| Gate with email | Results are complex (report format), ongoing value (re-run monthly), personalized output |
| Do NOT gate | Core result is a single number, competition offers the same ungated, primary goal is SEO/backlinks |
Progressive Capture
Do not ask for everything at once. Build the profile over multiple interactions.
| Interaction | What to Capture | How |
|---|---|---|
| First use | Email (to save or email results) | Inline form after results display |
| Return use | Name + Role | Contextual prompt, not a blocking form |
| Repeated use | Company + Team size | If they request team features or saved history |
Capture Form Design
- Email-only first gate (single field + submit button)
- Position the form AFTER results are shown (not before)
- Explain the value: "Email me a detailed breakdown" not "Sign up"
- Privacy text: "We'll send your report. No spam."
- Never require account creation for the free tool
---
SEO Landing Page Strategy
Page Structure
H1: Free [Tool Name] -- [What It Does in One Phrase]
Subhead: [Who it is for] + [what problem it solves]
[THE TOOL -- above the fold, interactive]
H2: How [Tool Name] Works
(3-4 steps with screenshots)
H2: Why [Audience] Use [Tool Name]
(Benefits, use cases, 3-5 paragraphs)
H2: [Related Question 1] (FAQ-style, keyword-targeted)
H2: [Related Question 2]
H2: [Related Question 3]
H2: Frequently Asked Questions
(5-7 FAQs with FAQPage schema)SEO Requirements
- Target keyword in: H1, URL slug, meta title, first 100 words, 2+ subheadings
- Meta title: "Free [Tool Name]: [Action Verb] Your [Outcome] | [Brand]"
- Meta description: Include the keyword + what the tool does + "Free, no signup required"
- URL:
/tools/[tool-name]or/free-[tool-name]
Schema Markup
Add SoftwareApplication schema:
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Free [Tool Name]",
"applicationCategory": "BusinessApplication",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"description": "[What the tool does]",
"operatingSystem": "Web"
}Also add FAQPage schema for the FAQ section.
---
Launch Playbook
Pre-Launch (1-2 Weeks Before)
- [ ] SEO landing page published and indexed
- [ ] Schema markup validated
- [ ] Outreach target list built (who links to similar tools?)
- [ ] Product Hunt draft prepared (if applicable)
- [ ] Social media teaser content created
- [ ] Email announcement drafted for existing audience
Launch Week
| Day | Channel | Action |
|---|---|---|
| Day 1 | Email list | Announcement to existing subscribers |
| Day 1 | Social media | Launch post on Twitter/X, LinkedIn |
| Day 1 | Product Hunt | Submit (if applicable, aim for Tuesday-Thursday) |
| Day 2 | Community | Share in relevant Slack groups, Discord, Reddit |
| Day 3 | Outreach | Email bloggers, newsletter editors who cover tools |
| Day 5 | Content | Publish blog post about the tool with use cases |
| Day 7 | Social media | Results round-up, engagement post |
Post-Launch (Weeks 2-8)
- [ ] Monitor search rankings for target keywords
- [ ] Track backlinks with GSC or Ahrefs
- [ ] Reach out to "best [category] tools" listicle authors
- [ ] Submit to tool directories (Free Tools, AlternativeTo, etc.)
- [ ] Iterate based on usage data (most-used features, drop-off points)
---
Distribution Channels
Organic Channels
| Channel | Approach | Expected Impact |
|---|---|---|
| SEO | Target "[type] calculator/checker" keywords | Long-term, compounding traffic |
| Product Hunt | Launch listing | Spike traffic + backlinks |
| Hacker News | "Show HN" post if technically interesting | Spike traffic + developer backlinks |
| Share in relevant subreddits (genuinely helpful, not spammy) | Moderate traffic + community feedback | |
| Twitter/X | Launch thread with tool demo | Engagement + social proof |
| Professional use case post | B2B lead generation | |
| Industry newsletters | Pitch to curators | Targeted audience + backlinks |
Link Acquisition
| Source | Approach |
|---|---|
| "Best [category] tools" listicles | Find existing lists, pitch for inclusion |
| Resource pages | Find industry resource compilations, suggest your tool |
| Blog posts mentioning the problem your tool solves | Reach out with "we built a free tool for this" |
| Comparison sites | Submit to tool comparison platforms |
| Educational content | Pitch to courses, tutorials, guides that cover related topics |
---
Measurement Framework
Key Metrics
| Metric | What It Tells You | Target (90 days) |
|---|---|---|
| Tool usage (sessions) | Is anyone using it? | 500+ sessions/month |
| Completion rate | Do users finish using it? | > 60% |
| Lead conversion rate | Is it generating leads? | 5-15% of completions |
| Organic traffic | Is it ranking? | 500+ sessions/month from organic |
| Referring domains | Is it earning backlinks? | 10+ organic backlinks |
| Email to pipeline rate | Is it generating qualified leads? | Track in CRM |
| Bounce rate | Is the tool engaging? | < 50% |
ROI Calculation
Monthly Cost = Engineering hours x Hourly rate + Hosting cost
Monthly Value = (Leads x Lead-to-Customer Rate x ACV) + (Backlink value estimate)
Break-even month = Total build cost / Monthly value
Target: Break-even within 6 months---
Maintenance and Iteration
Ongoing Maintenance Requirements
| Task | Frequency | Why |
|---|---|---|
| Check for broken APIs/data sources | Monthly | External dependencies change |
| Update calculations/logic if standards change | As needed | Accuracy maintains trust |
| Review and fix UX issues from user feedback | Quarterly | Continuous improvement |
| Update SEO landing page content | Semi-annually | Content freshness |
| Check analytics for usage trends | Monthly | Identify optimization opportunities |
Iteration Based on Data
| Signal | Action |
|---|---|
| High usage, low lead capture | Improve gate positioning or offer |
| Low usage, high search ranking | Improve tool UX and value |
| High leads, low quality | Add qualifying questions to capture form |
| High bounce rate | Improve above-fold messaging and tool visibility |
| Low search ranking | Improve page content depth and backlink acquisition |
---
Output Artifacts
| Artifact | Format | Description |
|---|---|---|
| Tool Idea Evaluation | Scored comparison matrix | 6-factor evaluation of candidate ideas |
| Tool UX Specification | Inputs/outputs/flow design | Inputs, outputs, lead capture flow, share mechanics |
| Landing Page Copy | Full page content | H1, subhead, how it works, FAQ, meta tags |
| Launch Plan | Phased checklist | Pre-launch, launch week, post-launch with channel-specific actions |
| Measurement Dashboard | Metric table | KPIs with targets at 30/60/90 days |
| ROI Model | Revenue calculation | Break-even analysis based on traffic and conversion assumptions |
| Maintenance Schedule | Task calendar | Ongoing tasks with frequency and ownership |
---
Related Skills
- seo-audit -- Use for auditing existing pages and keyword opportunities. Not for tool-based content assets.
- schema-markup -- Use for implementing SoftwareApplication and FAQPage schema on the tool landing page.
- form-cro -- Use for optimizing the lead capture form within the tool.
- page-cro -- Use for optimizing the landing page conversion rate.
- content-creator -- Use for writing the blog post and social content supporting the tool launch.
---
Tool Reference
1. tool_idea_scorer.py
Purpose: Score free tool ideas against the 6-factor evaluation framework and rank candidates.
python scripts/tool_idea_scorer.py tool_ideas.json
python scripts/tool_idea_scorer.py tool_ideas.json --json| Flag | Required | Description |
|---|---|---|
tool_ideas.json | Yes | JSON file with tool idea names and 6-factor scores |
--json | No | Output results as JSON |
2. tool_roi_calculator.py
Purpose: Calculate the ROI and break-even timeline for a free tool based on traffic, conversion, and cost assumptions.
python scripts/tool_roi_calculator.py --build-cost 5000 --monthly-traffic 2000 --conversion-rate 8 --lead-value 50
python scripts/tool_roi_calculator.py --build-cost 5000 --monthly-traffic 2000 --conversion-rate 8 --lead-value 50 --json| Flag | Required | Description |
|---|---|---|
--build-cost | Yes | Total build cost in dollars (engineering time + design) |
--monthly-traffic | Yes | Expected monthly sessions after 90 days |
--conversion-rate | Yes | Expected lead conversion rate as percentage |
--lead-value | Yes | Dollar value per captured lead |
--monthly-hosting | No | Monthly hosting/maintenance cost (default: 50) |
--json | No | Output results as JSON |
3. launch_checklist_generator.py
Purpose: Generate a phased launch checklist (pre-launch, launch week, post-launch) customized to the tool type and distribution channels.
python scripts/launch_checklist_generator.py --tool-type calculator --channels seo,producthunt,social
python scripts/launch_checklist_generator.py --tool-type checker --channels seo,email --json| Flag | Required | Description |
|---|---|---|
--tool-type | Yes | Tool type: calculator, generator, checker, grader, converter, template, visualization |
--channels | No | Comma-separated launch channels (default: seo,social,email) |
--json | No | Output results as JSON |
---
Troubleshooting
| Problem | Likely Cause | Solution |
|---|---|---|
| High traffic to tool but low lead capture | Gate is too aggressive or positioned before value delivery | Show core results first, then gate the detailed report or export; use email-only capture form |
| Tool built but no organic traffic after 3 months | SEO landing page is thin or keywords are too competitive | Add 1500+ words of supporting content (how it works, use cases, FAQ); target long-tail keywords |
| Tool is used once but users do not return | No recurring value or no save/bookmark mechanism | Add saved results, email reports, or periodic re-run reminders; consider a "monitor" mode |
| Build cost exceeded estimate | Scope creep during development | Use tool_roi_calculator.py upfront to set budget ceiling; define MVP scope and ship in 2 weeks max |
| Product Hunt launch got minimal traction | Poor timing or weak positioning | Launch Tuesday-Thursday; lead with the user benefit, not the technology; get 5+ early upvotes from network |
| Tool generates leads but low conversion to paid | Tool attracts wrong audience or no connection to paid product | Ensure the tool solves a problem your paid product also addresses; add contextual upgrade prompts |
---
Success Criteria
- Tool scores 20+ on the 6-factor evaluation framework before committing to build
- Tool achieves 500+ monthly sessions within 90 days of launch
- Lead conversion rate of 5-15% of tool completions
- Tool earns 10+ organic backlinks within 6 months
- Break-even achieved within 6 months (verified by tool_roi_calculator.py)
- Completion rate above 60% (users who start using the tool finish the workflow)
- At least 1 supporting blog post and social launch content published at launch
---
Scope & Limitations
- In scope: Tool idea evaluation, ROI modeling, launch planning, distribution strategy, lead capture architecture, SEO landing page strategy, measurement framework
- Out of scope: Engineering implementation, design/UI work, paid advertising strategy, AI/ML-powered tool features
- Build constraint: All tools should be buildable in 1-4 weeks; if longer, the scope is too large for a free marketing tool
- Maintenance cost: Every tool requires ongoing maintenance (monthly checks, quarterly content updates); budget for this before building
- No API dependencies: Free tools should use client-side logic where possible to avoid ongoing API costs and reliability issues
---
Integration Points
- form-cro -- Use for optimizing the lead capture form embedded within the free tool
- page-cro -- Use for optimizing the SEO landing page that hosts the tool for conversion
- seo-audit -- Use for validating the tool landing page meets technical SEO requirements
- content-creator -- Use for writing the launch blog post, social content, and outreach emails
- schema-markup -- Use for implementing SoftwareApplication and FAQPage schema on the tool page
#!/usr/bin/env python3
"""
Launch Checklist Generator
Generate a phased launch checklist (pre-launch, launch week, post-launch)
customized to the tool type and distribution channels.
Usage:
python launch_checklist_generator.py --tool-type calculator --channels seo,producthunt,social
python launch_checklist_generator.py --tool-type checker --channels seo,email --json
"""
import argparse
import json
import sys
TOOL_TYPES = ["calculator", "generator", "checker", "grader", "converter", "template", "visualization"]
CHANNELS = ["seo", "producthunt", "social", "email", "reddit", "hackernews", "outreach", "newsletters"]
BASE_CHECKLIST = {
"pre_launch": [
{"task": "Finalize tool functionality and test all inputs/outputs", "priority": "HIGH", "days_before": 14},
{"task": "Create SEO landing page with target keyword in H1, title tag, and meta description", "priority": "HIGH", "days_before": 10},
{"task": "Add SoftwareApplication schema markup to landing page", "priority": "MEDIUM", "days_before": 10},
{"task": "Add FAQ section with FAQPage schema (5-7 questions)", "priority": "MEDIUM", "days_before": 10},
{"task": "Set up analytics tracking (form views, interactions, completions, submissions)", "priority": "HIGH", "days_before": 7},
{"task": "Configure lead capture form (email-only, positioned after results)", "priority": "HIGH", "days_before": 7},
{"task": "Test on mobile devices (touch targets, keyboard types, responsive layout)", "priority": "HIGH", "days_before": 5},
{"task": "Create social media preview images (OG tags, Twitter cards)", "priority": "MEDIUM", "days_before": 5},
{"task": "Write launch announcement copy (email, social, blog)", "priority": "MEDIUM", "days_before": 3},
],
"launch_week": [
{"task": "Publish and verify landing page is indexed", "priority": "HIGH", "day": 1},
{"task": "Send announcement to existing email subscribers", "priority": "HIGH", "day": 1},
{"task": "Monitor for critical bugs and fix within 24 hours", "priority": "HIGH", "day": "1-7"},
{"task": "Respond to all user feedback and questions within 12 hours", "priority": "MEDIUM", "day": "1-7"},
],
"post_launch": [
{"task": "Review analytics: usage, completion rate, lead capture rate", "priority": "HIGH", "week": 2},
{"task": "Fix top UX issues based on analytics and feedback", "priority": "HIGH", "week": 2},
{"task": "Submit to relevant tool directories (Free Tools, AlternativeTo)", "priority": "MEDIUM", "week": 3},
{"task": "Reach out to 'best [category] tools' listicle authors for inclusion", "priority": "MEDIUM", "week": 3},
{"task": "Monitor search rankings for target keywords", "priority": "MEDIUM", "week": 4},
{"task": "Publish blog post with use cases and tips", "priority": "MEDIUM", "week": 4},
{"task": "Iterate on lead capture based on conversion data", "priority": "MEDIUM", "week": 6},
{"task": "Track backlinks with GSC or Ahrefs", "priority": "LOW", "week": 8},
],
}
CHANNEL_TASKS = {
"producthunt": {
"pre_launch": [
{"task": "Prepare Product Hunt listing (tagline, description, images, first comment)", "priority": "HIGH", "days_before": 3},
{"task": "Line up 5+ early supporters for launch day upvotes", "priority": "MEDIUM", "days_before": 3},
],
"launch_week": [
{"task": "Submit to Product Hunt (aim for Tuesday-Thursday)", "priority": "HIGH", "day": 1},
{"task": "Engage with every Product Hunt comment within 2 hours", "priority": "HIGH", "day": 1},
],
},
"social": {
"launch_week": [
{"task": "Post launch thread on Twitter/X with tool demo GIF", "priority": "HIGH", "day": 1},
{"task": "Post professional use case on LinkedIn", "priority": "MEDIUM", "day": 1},
{"task": "Share user success stories and results on social", "priority": "LOW", "day": 7},
],
},
"reddit": {
"launch_week": [
{"task": "Share in relevant subreddits (genuinely helpful, not promotional)", "priority": "MEDIUM", "day": 2},
],
},
"hackernews": {
"launch_week": [
{"task": "Submit 'Show HN' post (only if technically interesting)", "priority": "MEDIUM", "day": 2},
],
},
"outreach": {
"post_launch": [
{"task": "Email bloggers and resource page owners who link to similar tools", "priority": "MEDIUM", "week": 2},
{"task": "Pitch to industry newsletter editors for featured mention", "priority": "MEDIUM", "week": 3},
],
},
"newsletters": {
"post_launch": [
{"task": "Submit to relevant newsletter directories for mention", "priority": "LOW", "week": 4},
],
},
"email": {
"launch_week": [
{"task": "Send dedicated launch email to subscriber list", "priority": "HIGH", "day": 1},
],
"post_launch": [
{"task": "Add tool mention to email signature and newsletter footer", "priority": "LOW", "week": 2},
],
},
}
TOOL_TYPE_TASKS = {
"checker": {
"pre_launch": [
{"task": "Ensure detailed report output is gated behind email capture", "priority": "HIGH", "days_before": 7},
{"task": "Add scoring rubric explanation to landing page", "priority": "MEDIUM", "days_before": 5},
],
},
"calculator": {
"pre_launch": [
{"task": "Add shareable results URL or social share button", "priority": "MEDIUM", "days_before": 5},
],
},
"generator": {
"pre_launch": [
{"task": "Add copy-to-clipboard and download buttons for generated content", "priority": "HIGH", "days_before": 5},
{"task": "Add social share with pre-filled text for generated results", "priority": "MEDIUM", "days_before": 5},
],
},
"grader": {
"pre_launch": [
{"task": "Create visual scorecard output (suitable for social sharing)", "priority": "MEDIUM", "days_before": 5},
],
},
"visualization": {
"pre_launch": [
{"task": "Add embed code for users to embed visualization on their sites", "priority": "HIGH", "days_before": 5},
{"task": "Ensure visualization renders correctly at common embed sizes", "priority": "MEDIUM", "days_before": 3},
],
},
"template": {
"pre_launch": [
{"task": "Gate downloads behind email capture (preview visible without email)", "priority": "HIGH", "days_before": 7},
],
},
}
def generate_checklist(tool_type: str, channels: list) -> dict:
"""Generate customized launch checklist."""
checklist = {
"pre_launch": list(BASE_CHECKLIST["pre_launch"]),
"launch_week": list(BASE_CHECKLIST["launch_week"]),
"post_launch": list(BASE_CHECKLIST["post_launch"]),
}
# Add tool-type-specific tasks
type_tasks = TOOL_TYPE_TASKS.get(tool_type, {})
for phase, tasks in type_tasks.items():
checklist[phase].extend(tasks)
# Add channel-specific tasks
for channel in channels:
ch_tasks = CHANNEL_TASKS.get(channel, {})
for phase, tasks in ch_tasks.items():
checklist[phase].extend(tasks)
# Count tasks
total = sum(len(tasks) for tasks in checklist.values())
high_priority = sum(1 for phase in checklist.values() for t in phase if t["priority"] == "HIGH")
return {
"tool_type": tool_type,
"channels": channels,
"summary": {
"total_tasks": total,
"pre_launch_tasks": len(checklist["pre_launch"]),
"launch_week_tasks": len(checklist["launch_week"]),
"post_launch_tasks": len(checklist["post_launch"]),
"high_priority_tasks": high_priority,
},
"checklist": checklist,
}
def format_text(result: dict) -> str:
"""Format results as human-readable text."""
lines = []
lines.append("=" * 60)
lines.append(f"LAUNCH CHECKLIST: {result['tool_type'].upper()} TOOL")
lines.append("=" * 60)
lines.append(f"\nTool Type: {result['tool_type']}")
lines.append(f"Channels: {', '.join(result['channels'])}")
s = result["summary"]
lines.append(f"Total Tasks: {s['total_tasks']} ({s['high_priority_tasks']} high priority)")
for phase_name, phase_label in [("pre_launch", "PRE-LAUNCH (1-2 weeks before)"),
("launch_week", "LAUNCH WEEK"),
("post_launch", "POST-LAUNCH (weeks 2-8)")]:
tasks = result["checklist"][phase_name]
lines.append(f"\n--- {phase_label} ---")
for t in tasks:
priority_marker = "*" if t["priority"] == "HIGH" else " "
timing = ""
if "days_before" in t:
timing = f" [D-{t['days_before']}]"
elif "day" in t:
timing = f" [Day {t['day']}]"
elif "week" in t:
timing = f" [Week {t['week']}]"
lines.append(f" {priority_marker} [ ] {t['task']}{timing}")
lines.append("")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="Generate a phased launch checklist for a free tool."
)
parser.add_argument("--tool-type", required=True, choices=TOOL_TYPES,
help="Type of free tool")
parser.add_argument("--channels", default="seo,social,email",
help="Comma-separated launch channels (default: seo,social,email)")
parser.add_argument("--json", action="store_true", help="Output results as JSON")
args = parser.parse_args()
channels = [c.strip().lower() for c in args.channels.split(",") if c.strip()]
invalid = [c for c in channels if c not in CHANNELS]
if invalid:
print(f"Warning: Unknown channels ignored: {', '.join(invalid)}", file=sys.stderr)
channels = [c for c in channels if c in CHANNELS]
result = generate_checklist(args.tool_type, channels)
if args.json:
print(json.dumps(result, indent=2))
else:
print(format_text(result))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Tool Idea Scorer
Score free tool ideas against the 6-factor evaluation framework
(search volume, competition, build effort, lead capture potential,
SEO value, viral potential) and rank candidates.
Usage:
python tool_idea_scorer.py tool_ideas.json
python tool_idea_scorer.py tool_ideas.json --json
"""
import argparse
import json
import sys
FACTORS = [
{"key": "search_volume", "label": "Search Volume", "max": 5},
{"key": "competition", "label": "Competition (lack of)", "max": 5},
{"key": "build_effort", "label": "Build Effort (ease)", "max": 5},
{"key": "lead_capture", "label": "Lead Capture Potential", "max": 5},
{"key": "seo_value", "label": "SEO Value", "max": 5},
{"key": "viral_potential", "label": "Viral Potential", "max": 5},
]
THRESHOLDS = {
"build_immediately": 25,
"strong_candidate": 20,
"conditional": 15,
}
def score_ideas(data: dict) -> dict:
"""Score and rank tool ideas."""
ideas = data.get("ideas", [])
if not ideas:
return {"error": "No tool ideas provided."}
scored = []
for idea in ideas:
name = idea.get("name", "Unknown")
tool_type = idea.get("type", "unknown")
scores = idea.get("scores", {})
factor_scores = []
total = 0
for factor in FACTORS:
score = min(5, max(0, scores.get(factor["key"], 0)))
factor_scores.append({
"factor": factor["label"],
"key": factor["key"],
"score": score,
"max": factor["max"],
})
total += score
# Decision
if total >= THRESHOLDS["build_immediately"]:
decision = "BUILD IMMEDIATELY"
rationale = "Strong across all factors. Prioritize development."
elif total >= THRESHOLDS["strong_candidate"]:
decision = "STRONG CANDIDATE"
rationale = "Validate search volume before committing resources."
elif total >= THRESHOLDS["conditional"]:
decision = "CONDITIONAL"
rationale = "Build only if resources are available and strategic fit is strong."
else:
decision = "DO NOT BUILD"
rationale = "Score too low. Rethink concept or find a different angle."
# Strengths and weaknesses
sorted_factors = sorted(factor_scores, key=lambda x: x["score"], reverse=True)
strengths = [f for f in sorted_factors if f["score"] >= 4]
weaknesses = [f for f in sorted_factors if f["score"] <= 2]
scored.append({
"name": name,
"type": tool_type,
"total_score": total,
"max_score": 30,
"percentage": round(total / 30 * 100, 1),
"decision": decision,
"rationale": rationale,
"factor_scores": factor_scores,
"strengths": [f["factor"] for f in strengths],
"weaknesses": [f["factor"] for f in weaknesses],
})
scored.sort(key=lambda x: x["total_score"], reverse=True)
return {
"total_ideas_evaluated": len(scored),
"build_immediately": sum(1 for s in scored if s["decision"] == "BUILD IMMEDIATELY"),
"strong_candidates": sum(1 for s in scored if s["decision"] == "STRONG CANDIDATE"),
"ranked_ideas": scored,
"recommendations": _generate_recommendations(scored),
}
def _generate_recommendations(ideas: list) -> list:
"""Generate recommendations."""
recs = []
top = [i for i in ideas if i["decision"] == "BUILD IMMEDIATELY"]
if top:
recs.append({
"priority": "HIGH",
"recommendation": f"Start with '{top[0]['name']}' -- highest score ({top[0]['total_score']}/30).",
})
elif ideas:
recs.append({
"priority": "MEDIUM",
"recommendation": f"No clear winner. Consider improving the top idea '{ideas[0]['name']}' concept to address weaknesses: {', '.join(ideas[0]['weaknesses'][:2])}.",
})
# Common weakness
all_weaknesses = []
for i in ideas:
all_weaknesses.extend(i["weaknesses"])
if all_weaknesses:
from collections import Counter
common = Counter(all_weaknesses).most_common(1)
if common:
recs.append({
"priority": "MEDIUM",
"recommendation": f"Common weakness across ideas: '{common[0][0]}'. Address this in concept refinement.",
})
return recs
def format_text(result: dict) -> str:
"""Format results as human-readable text."""
lines = []
lines.append("=" * 60)
lines.append("TOOL IDEA SCORER -- 6-Factor Evaluation")
lines.append("=" * 60)
lines.append(f"\nIdeas Evaluated: {result['total_ideas_evaluated']}")
lines.append(f"Build Immediately: {result['build_immediately']}")
lines.append(f"Strong Candidates: {result['strong_candidates']}")
for idea in result["ranked_ideas"]:
lines.append(f"\n--- {idea['name']} ({idea['type']}) ---")
lines.append(f"Score: {idea['total_score']}/30 ({idea['percentage']}%)")
lines.append(f"Decision: {idea['decision']}")
lines.append(f"Rationale: {idea['rationale']}")
lines.append(f" Factors:")
for f in idea["factor_scores"]:
bar = "#" * f["score"] + "." * (5 - f["score"])
lines.append(f" {f['factor']:<25} [{bar}] {f['score']}/5")
if idea["strengths"]:
lines.append(f" Strengths: {', '.join(idea['strengths'])}")
if idea["weaknesses"]:
lines.append(f" Weaknesses: {', '.join(idea['weaknesses'])}")
if result["recommendations"]:
lines.append(f"\n--- Recommendations ---")
for r in result["recommendations"]:
lines.append(f"[{r['priority']}] {r['recommendation']}")
lines.append("")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="Score free tool ideas against the 6-factor evaluation framework."
)
parser.add_argument("input_file", help="JSON file with tool ideas and scores")
parser.add_argument("--json", action="store_true", help="Output results as JSON")
args = parser.parse_args()
try:
with open(args.input_file, "r") as f:
data = json.load(f)
except FileNotFoundError:
print(f"Error: File not found: {args.input_file}", file=sys.stderr)
sys.exit(1)
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON in {args.input_file}: {e}", file=sys.stderr)
sys.exit(1)
result = score_ideas(data)
if args.json:
print(json.dumps(result, indent=2))
else:
print(format_text(result))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Tool ROI Calculator
Calculate the ROI and break-even timeline for a free tool based on
traffic, conversion, and cost assumptions.
Usage:
python tool_roi_calculator.py --build-cost 5000 --monthly-traffic 2000 --conversion-rate 8 --lead-value 50
python tool_roi_calculator.py --build-cost 5000 --monthly-traffic 2000 --conversion-rate 8 --lead-value 50 --json
"""
import argparse
import json
import math
import sys
def calculate_roi(build_cost: float, monthly_traffic: int,
conversion_rate: float, lead_value: float,
monthly_hosting: float) -> dict:
"""Calculate free tool ROI."""
monthly_leads = monthly_traffic * (conversion_rate / 100.0)
monthly_value = monthly_leads * lead_value
monthly_net = monthly_value - monthly_hosting
# Break-even calculation
if monthly_net > 0:
breakeven_months = math.ceil(build_cost / monthly_net)
else:
breakeven_months = -1 # Never breaks even
# 12-month projection
monthly_projections = []
cumulative_cost = build_cost
cumulative_revenue = 0
for month in range(1, 13):
# Traffic ramp: 30% in month 1, 60% month 2, 100% month 3+
if month == 1:
traffic_factor = 0.30
elif month == 2:
traffic_factor = 0.60
else:
traffic_factor = 1.0
month_traffic = int(monthly_traffic * traffic_factor)
month_leads = month_traffic * (conversion_rate / 100.0)
month_value = month_leads * lead_value
cumulative_cost += monthly_hosting
cumulative_revenue += month_value
net_position = cumulative_revenue - cumulative_cost
monthly_projections.append({
"month": month,
"traffic": month_traffic,
"leads": round(month_leads, 1),
"revenue": round(month_value, 2),
"cumulative_cost": round(cumulative_cost, 2),
"cumulative_revenue": round(cumulative_revenue, 2),
"net_position": round(net_position, 2),
"profitable": net_position > 0,
})
# Annual summary
annual_revenue = sum(m["revenue"] for m in monthly_projections)
annual_cost = build_cost + (monthly_hosting * 12)
annual_roi = ((annual_revenue - annual_cost) / annual_cost * 100) if annual_cost > 0 else 0
# Scenario analysis
scenarios = []
for traffic_mult, label in [(0.5, "Conservative (50% traffic)"),
(1.0, "Base case"),
(1.5, "Optimistic (150% traffic)"),
(2.0, "Viral (200% traffic)")]:
sc_monthly = monthly_traffic * traffic_mult * (conversion_rate / 100.0) * lead_value
sc_annual = sc_monthly * 12 # Simplified (no ramp)
sc_roi = ((sc_annual - annual_cost) / annual_cost * 100) if annual_cost > 0 else 0
sc_breakeven = math.ceil(build_cost / max(0.01, sc_monthly - monthly_hosting))
scenarios.append({
"scenario": label,
"monthly_revenue": round(sc_monthly, 2),
"annual_revenue": round(sc_annual, 2),
"annual_roi_pct": round(sc_roi, 1),
"breakeven_months": sc_breakeven if sc_monthly > monthly_hosting else -1,
})
return {
"inputs": {
"build_cost": build_cost,
"monthly_traffic": monthly_traffic,
"conversion_rate_pct": conversion_rate,
"lead_value": lead_value,
"monthly_hosting": monthly_hosting,
},
"monthly_metrics": {
"monthly_leads": round(monthly_leads, 1),
"monthly_revenue": round(monthly_value, 2),
"monthly_cost": monthly_hosting,
"monthly_net": round(monthly_net, 2),
},
"annual_summary": {
"annual_revenue": round(annual_revenue, 2),
"annual_cost": round(annual_cost, 2),
"annual_profit": round(annual_revenue - annual_cost, 2),
"annual_roi_pct": round(annual_roi, 1),
"breakeven_month": breakeven_months,
},
"monthly_projections": monthly_projections,
"scenarios": scenarios,
"recommendations": _generate_recommendations(breakeven_months, annual_roi, monthly_leads),
}
def _generate_recommendations(breakeven: int, roi: float, leads: float) -> list:
"""Generate recommendations."""
recs = []
if breakeven <= 0:
recs.append({
"priority": "CRITICAL",
"recommendation": "Tool does not break even. Increase traffic, conversion rate, or lead value -- or reduce build cost.",
})
elif breakeven > 6:
recs.append({
"priority": "HIGH",
"recommendation": f"Break-even at month {breakeven} exceeds 6-month target. Consider reducing scope to lower build cost.",
})
else:
recs.append({
"priority": "INFO",
"recommendation": f"Break-even at month {breakeven} -- within target. Proceed with build.",
})
if leads < 10:
recs.append({
"priority": "MEDIUM",
"recommendation": "Monthly lead volume is low. Consider higher-traffic tool types (calculators, checkers) or broader keyword targeting.",
})
recs.append({
"priority": "MEDIUM",
"recommendation": "Factor in backlink value (not modeled here). Quality backlinks from tool pages can significantly boost domain authority.",
})
return recs
def format_text(result: dict) -> str:
"""Format results as human-readable text."""
lines = []
lines.append("=" * 60)
lines.append("FREE TOOL ROI CALCULATOR")
lines.append("=" * 60)
inp = result["inputs"]
lines.append(f"\n--- Inputs ---")
lines.append(f"Build Cost: ${inp['build_cost']:>10,.2f}")
lines.append(f"Monthly Traffic: {inp['monthly_traffic']:>10,d}")
lines.append(f"Conversion Rate: {inp['conversion_rate_pct']:>10.1f}%")
lines.append(f"Lead Value: ${inp['lead_value']:>10,.2f}")
lines.append(f"Monthly Hosting: ${inp['monthly_hosting']:>10,.2f}")
mm = result["monthly_metrics"]
lines.append(f"\n--- Monthly Metrics (at full traffic) ---")
lines.append(f"Monthly Leads: {mm['monthly_leads']:>10.1f}")
lines.append(f"Monthly Revenue: ${mm['monthly_revenue']:>10,.2f}")
lines.append(f"Monthly Net: ${mm['monthly_net']:>10,.2f}")
an = result["annual_summary"]
lines.append(f"\n--- Annual Summary ---")
lines.append(f"Annual Revenue: ${an['annual_revenue']:>10,.2f}")
lines.append(f"Annual Cost: ${an['annual_cost']:>10,.2f}")
lines.append(f"Annual Profit: ${an['annual_profit']:>10,.2f}")
lines.append(f"Annual ROI: {an['annual_roi_pct']:>10.1f}%")
be = an['breakeven_month']
lines.append(f"Break-Even Month: {'Never' if be <= 0 else str(be):>10}")
lines.append(f"\n--- 12-Month Projection ---")
lines.append(f"{'Month':>6} {'Traffic':>8} {'Leads':>7} {'Revenue':>10} {'Net Pos':>10}")
for m in result["monthly_projections"]:
lines.append(
f"{m['month']:>6d} {m['traffic']:>8,d} {m['leads']:>7.0f} "
f"${m['revenue']:>8,.0f} ${m['net_position']:>8,.0f}"
)
lines.append(f"\n--- Scenarios ---")
lines.append(f"{'Scenario':<30} {'Monthly':>10} {'Annual':>10} {'ROI':>8} {'B/E':>6}")
for s in result["scenarios"]:
be_str = str(s["breakeven_months"]) if s["breakeven_months"] > 0 else "Never"
lines.append(
f"{s['scenario']:<30} ${s['monthly_revenue']:>8,.0f} "
f"${s['annual_revenue']:>8,.0f} {s['annual_roi_pct']:>7.0f}% {be_str:>6}"
)
lines.append(f"\n--- Recommendations ---")
for r in result["recommendations"]:
lines.append(f"[{r['priority']}] {r['recommendation']}")
lines.append("")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="Calculate ROI and break-even for a free marketing tool."
)
parser.add_argument("--build-cost", type=float, required=True,
help="Total build cost in dollars")
parser.add_argument("--monthly-traffic", type=int, required=True,
help="Expected monthly sessions after 90 days")
parser.add_argument("--conversion-rate", type=float, required=True,
help="Expected lead conversion rate as percentage")
parser.add_argument("--lead-value", type=float, required=True,
help="Dollar value per captured lead")
parser.add_argument("--monthly-hosting", type=float, default=50,
help="Monthly hosting/maintenance cost (default: 50)")
parser.add_argument("--json", action="store_true", help="Output results as JSON")
args = parser.parse_args()
result = calculate_roi(args.build_cost, args.monthly_traffic,
args.conversion_rate, args.lead_value,
args.monthly_hosting)
if args.json:
print(json.dumps(result, indent=2))
else:
print(format_text(result))
if __name__ == "__main__":
main()
Related skills
FAQ
How do you decide whether to build a free tool?
Score the idea 1-5 on 6 factors (search volume, competition, build effort, lead-capture potential, SEO value, viral potential) out of 30; 25-30 means build immediately.
What is the value-before-gate rule?
Give the core value first and gate only the upgrade, for example show the score immediately and offer to email the full report.