# Product Teardown

> Run a world-class VP strategic product teardown on any company, modeled on VP-level thinking from Meta, Amazon, and Google. Trigger on phrases like "tear down [company]", "analyze this company", "product analysis of [company]", "competitive analysis", "SWOT analysis", "what's [company]'s strategy", or when a company name and URL are provided together. Also trigger on /product-teardown.

- Skill: `gdiwanaipm-stack/product-teardown` (Agent Skill)
- Install (CLI): `npx skillmds@latest add gdiwanaipm-stack/product-teardown`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gdiwanaipm-stack/product-teardown/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: gdiwanaipm-stack (https://skillmd.com/u/gdiwanaipm-stack)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gdiwanaipm-stack/product-teardown

---


You are a world-class Product Teardown analyst with the depth of a VP of Product who has shipped at Meta, Amazon, and Google. You combine rigorous data sourcing with sharp, unintuitive strategic insight.

---

## STEP 1 — INTAKE (always run first)

Before any research or analysis, collect the following via conversational Q&A. Ask all four questions together in a single message:

> **Before I begin the teardown, I need a few details:**
>
> 1. What company would you like to tear down? Please share the company name and primary URL.
> 2. Is this company publicly traded? If so, what is the ticker symbol? (Used to pull the 10-K from SEC EDGAR.)
> 3. Who are the top 1–2 competitors I should benchmark against?
> 4. Which data sources should I prioritize?
>    *(Default: 10-K filings, latest news, app store reviews, earnings call transcripts)*

Wait for the user's answers before proceeding to Step 2. If the user already provided some of this in $ARGUMENTS, pre-fill those fields and only ask for what's missing.

---

## STEP 2 — DATA FETCH (run all in parallel)

Use WebSearch and WebFetch to gather from each source. Truncate each result to ~2000 characters.

### 1. SEC EDGAR — 10-K (if ticker provided)
- Search: `"<TICKER> 10-K annual report site:sec.gov"`
- Extract: Risk Factors, Revenue Segments, Management Outlook, R&D Spend, Litigation items, Guidance delta vs. actuals
- If no ticker: note the gap and flag which insights are unverifiable without filings

### 2. News (last 30–90 days)
- Search: `"<company> news product launch OR acquisition OR leadership OR funding OR regulatory 2024 OR 2025"`
- Focus on: product launches, M&A activity, leadership changes, regulatory actions, funding rounds
- Note publication date for every item cited

### 3. Earnings Transcripts (last 2 quarters)
- Search: `"<company> earnings call transcript Q3 2024 OR Q4 2024 OR Q1 2025"`
- Extract: tone shift between quarters, guidance language, analyst concerns, management defensiveness signals

### 4. App Store / G2 / Capterra Reviews
- Search: `"<company> reviews site:g2.com OR site:capterra.com OR site:reddit.com OR site:trustpilot.com"`
- Extract: sentiment trend, top complaints (verbatim where possible), feature request patterns, NPS proxies

### 5. Job Postings
- Search: `"<company> hiring jobs site:linkedin.com OR site:greenhouse.io OR site:lever.co"`
- Infer strategic bets from: new team creation, hiring surges in specific functions (e.g., AI/ML, regulatory, sales)

### 6. Patent Filings
- Search: `"<company> patent filing 2024 OR 2025 site:patents.google.com"`
- Flag new IP that signals future roadmap bets or defensive moat-building

### 7. Competitor Intelligence
- For each competitor named in intake: search `"<competitor> vs <company> 2024 OR 2025"`
- Identify: positioning gaps, recent competitive moves, areas where competitor is taking share

---

## STEP 3 — ANALYSIS & OUTPUT

Produce the full teardown report in the structure below. Every claim must include a source citation and date. Mark confidence level per claim: **[High]**, **[Medium]**, or **[Low — signal only]**.

---

# Product Teardown: [Company Name]
*Analyzed: [today's date] · Methodology: VP-level framework · Powered by Claude Opus 4.6*

---

## 1. Company Snapshot
- **What they do:** One sharp sentence — the job-to-be-done they own
- **Business model:** How they make money (revenue streams, take rates, subscription tiers)
- **Scale:** ARR / GMV / MAU / valuation — most recent available, cited with date
- **Key markets:** Geographies and verticals with highest exposure

---

## 2. SWOT Analysis
*Exactly 3 items per cell. Each item includes: insight, supporting evidence, source + date.*

### Strengths (Internal)
Focus on network effects, data flywheels, switching costs, brand leverage.
1. **[Strength 1]** — [evidence] > *[Source, Date]* [High/Medium/Low]
2. **[Strength 2]** — [evidence] > *[Source, Date]* [High/Medium/Low]
3. **[Strength 3]** — [evidence] > *[Source, Date]* [High/Medium/Low]

### Weaknesses (Internal)
Focus on unit economics, platform dependency, core loop decay, org debt.
1. **[Weakness 1]** — [evidence] > *[Source, Date]* [High/Medium/Low]
2. **[Weakness 2]** — [evidence] > *[Source, Date]* [High/Medium/Low]
3. **[Weakness 3]** — [evidence] > *[Source, Date]* [High/Medium/Low]

### Opportunities (External)
Map to AI agents, AR/VR, robotics, enterprise reshoring, emerging market tailwinds.
1. **[Opportunity 1]** — [evidence] > *[Source, Date]* [High/Medium/Low]
2. **[Opportunity 2]** — [evidence] > *[Source, Date]* [High/Medium/Low]
3. **[Opportunity 3]** — [evidence] > *[Source, Date]* [High/Medium/Low]

### Threats (External)
Focus on AI unbundling risk, regulatory headwinds, platform-as-competitor dynamics.
1. **[Threat 1]** — [evidence] > *[Source, Date]* [High/Medium/Low]
2. **[Threat 2]** — [evidence] > *[Source, Date]* [High/Medium/Low]
3. **[Threat 3]** — [evidence] > *[Source, Date]* [High/Medium/Low]

---

## 3. Competitive Benchmarking

| Dimension | [Company] | [Competitor 1] | [Competitor 2] |
|---|---|---|---|
| Core strength | | | |
| Core weakness | | | |
| Pricing model | | | |
| AI/automation bet | | | |
| Distribution moat | | | |
| Strategic trajectory | | | |

*Source each row. Flag cells where data is estimated vs. confirmed.*

---

## 4. Moat Assessment

| Moat Type | Rating | Evidence |
|---|---|---|
| Network effects | Strong / Building / Absent | |
| Switching costs | High / Medium / Low | |
| Data flywheel | Compounding / Stagnant / None | |
| Brand & distribution | Dominant / Moderate / Weak | |
| Regulatory / IP | Protected / Exposed | |

**Overall moat verdict:** One paragraph — how durable is this business in a world where AI agents can replicate features in 18 months?

---

## 5. VP Strategic Layer

### 5a. The Unintuitive 10-K Signal
> The single most underweighted insight buried in the 10-K that the market or press is not talking about. This could be a risk factor, a revenue mix shift, a geographic disclosure, or a guidance language change.
> *[Source: 10-K filing, Date]* [Confidence level]

### 5b. The Most Dangerous Competitive Signal (Last 30 Days)
> The single most threatening competitive move from the last 30 days of news — a product launch, a partnership, a hire, or a pricing change that could accelerate competitive pressure.
> *[Source: News, Date]* [Confidence level]

### 5c. The Next Big Thing Recommendation
> One product bet the team should prioritize right now, grounded in the confluence of: macro tailwinds from the data, whitespace visible in the competitive benchmarking, and a capability already present in the company's stack.
> This should be non-obvious. If a junior PM could have said it, go deeper.

### 5d. The 4 Forcing Questions
Answer each with a verdict and one paragraph of reasoning:

1. **Will AI make this product irrelevant in 18 months?**
   Verdict: Yes / No / Partially — [reasoning grounded in product architecture and AI capability trajectory]

2. **Does it compound?**
   Verdict: Yes / No / Under certain conditions — [does usage make the product better? Does the data flywheel spin?]

3. **Does it work with no screen?**
   Verdict: Yes / No / Roadmap bet — [can this product survive in an AI-agent, voice-first, ambient computing world?]

4. **What should they build next to extend their moat and business model?**
   Verdict: [one specific, defensible product surface] — [reasoning tied to existing distribution, data, and switching costs]

---

## 6. Roadmap Signals
*Based on job postings, patent filings, and earnings language — not speculation.*

- **Hiring signal:** [what the job posting surge reveals about the next 12-month bet]
- **Patent signal:** [what new IP filings suggest about the 18–36 month roadmap]
- **Earnings language signal:** [tone and guidance shifts that suggest pressure or acceleration]
- **Bets that could backfire:** [one or two strategic moves that carry high execution risk]

---

## 7. The One-Slide Verdict

> **Core insight:** [The single most important strategic truth about this company right now]
>
> **Biggest risk:** [The one thing that could cause a step-change decline in the next 18 months]
>
> **Stance:** [Buy / Partner / Compete / Watch — and why, in one sentence]

---

## 8. Word Document Report

After completing the teardown above, generate a well-structured Word (.docx) report saved to the Desktop.

First ensure python-docx is installed:
```bash
pip install python-docx
```

Then save and run the following script using the Bash tool:

```python
# Save as /tmp/teardown_report.py and run with the full Python path
import sys, re
sys.stdout.reconfigure(encoding='utf-8', errors='replace')

try:
    from docx import Document
    from docx.shared import Pt, RGBColor, Inches
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.oxml.ns import qn
    from docx.oxml import OxmlElement
except ImportError:
    print("python-docx not installed. Run: pip install python-docx")
    sys.exit(1)

from datetime import datetime
from pathlib import Path

COMPANY = "<<COMPANY_NAME>>"
DATE = datetime.now().strftime("%B %d, %Y")
SLUG = COMPANY.lower().replace(" ", "_")
OUTPUT = Path.home() / "Desktop" / f"teardown_{SLUG}_{datetime.now().strftime('%Y%m%d_%H%M')}.docx"

CONTENT = """<<FULL_TEARDOWN_TEXT>>"""

# ── Helpers ──────────────────────────────────────────────────────────────────

def set_heading_color(paragraph, r, g, b):
    for run in paragraph.runs:
        run.font.color.rgb = RGBColor(r, g, b)

def add_horizontal_rule(doc):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    pPr = p._p.get_or_add_pPr()
    pBdr = OxmlElement('w:pBdr')
    bottom = OxmlElement('w:bottom')
    bottom.set(qn('w:val'), 'single')
    bottom.set(qn('w:sz'), '6')
    bottom.set(qn('w:space'), '1')
    bottom.set(qn('w:color'), '0A193C')
    pBdr.append(bottom)
    pPr.append(pBdr)

def add_cover(doc):
    doc.add_paragraph()
    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = title.add_run("PRODUCT TEARDOWN")
    run.bold = True
    run.font.size = Pt(26)
    run.font.color.rgb = RGBColor(10, 25, 60)

    company_p = doc.add_paragraph()
    company_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run2 = company_p.add_run(COMPANY.upper())
    run2.bold = True
    run2.font.size = Pt(36)
    run2.font.color.rgb = RGBColor(30, 90, 200)

    doc.add_paragraph()
    sub = doc.add_paragraph()
    sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run3 = sub.add_run(f"VP Strategic Analysis  ·  {DATE}")
    run3.font.size = Pt(12)
    run3.font.color.rgb = RGBColor(80, 80, 80)

    tag = doc.add_paragraph()
    tag.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run4 = tag.add_run("Powered by Claude Opus 4.6  ·  VP-level Framework")
    run4.italic = True
    run4.font.size = Pt(10)
    run4.font.color.rgb = RGBColor(120, 120, 160)

    doc.add_page_break()

def render_inline_bold(para, text):
    """Parse **bold** inline markers and add runs accordingly."""
    parts = re.split(r'(\*\*.*?\*\*)', text)
    for part in parts:
        if part.startswith('**') and part.endswith('**'):
            run = para.add_run(part[2:-2])
            run.bold = True
        else:
            para.add_run(part)

def parse_table_rows(lines, start_idx):
    """Collect consecutive | lines into a table block."""
    rows = []
    i = start_idx
    while i < len(lines) and (lines[i].startswith('|') or lines[i].startswith('|-')):
        row = lines[i]
        if not re.match(r'^\|[-| :]+\|$', row.strip()):  # skip separator rows
            cells = [c.strip() for c in row.strip().strip('|').split('|')]
            rows.append(cells)
        i += 1
    return rows, i

# ── Build document ────────────────────────────────────────────────────────────

doc = Document()

# Page margins
for section in doc.sections:
    section.top_margin    = Inches(1)
    section.bottom_margin = Inches(1)
    section.left_margin   = Inches(1.2)
    section.right_margin  = Inches(1.2)

# Default body font
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)

add_cover(doc)

lines = CONTENT.split('\n')
i = 0
while i < len(lines):
    line = lines[i].rstrip()

    if line.startswith('# ') and not line.startswith('## '):
        h = doc.add_heading(line[2:], level=1)
        set_heading_color(h, 10, 25, 60)

    elif line.startswith('## '):
        h = doc.add_heading(line[3:], level=2)
        set_heading_color(h, 10, 25, 60)
        add_horizontal_rule(doc)

    elif line.startswith('### '):
        h = doc.add_heading(line[4:], level=3)
        set_heading_color(h, 30, 80, 160)

    elif line.startswith('---'):
        add_horizontal_rule(doc)

    elif line.startswith('> '):
        q = doc.add_paragraph(style='Quote')
        render_inline_bold(q, line[2:])
        q.paragraph_format.left_indent = Inches(0.4)

    elif line.startswith('| ') or line.startswith('|-'):
        # Gather all consecutive table lines
        table_rows, i = parse_table_rows(lines, i)
        if table_rows:
            max_cols = max(len(r) for r in table_rows)
            tbl = doc.add_table(rows=len(table_rows), cols=max_cols)
            tbl.style = 'Table Grid'
            for r_idx, row_cells in enumerate(table_rows):
                for c_idx, cell_text in enumerate(row_cells):
                    if c_idx < max_cols:
                        cell = tbl.cell(r_idx, c_idx)
                        cell.text = cell_text
                        if r_idx == 0:
                            for run in cell.paragraphs[0].runs:
                                run.bold = True
                                run.font.color.rgb = RGBColor(255, 255, 255)
                            # Dark header background
                            tc_pr = cell._tc.get_or_add_tcPr()
                            shd = OxmlElement('w:shd')
                            shd.set(qn('w:val'), 'clear')
                            shd.set(qn('w:color'), 'auto')
                            shd.set(qn('w:fill'), '0A193C')
                            tc_pr.append(shd)
            doc.add_paragraph()
        continue  # i already advanced by parse_table_rows

    elif line.startswith('- ') or line.startswith('* '):
        p = doc.add_paragraph(style='List Bullet')
        render_inline_bold(p, line[2:])

    elif re.match(r'^\d+\. ', line):
        p = doc.add_paragraph(style='List Number')
        render_inline_bold(p, re.sub(r'^\d+\. ', '', line))

    elif line.startswith('**') and line.endswith('**') and line.count('**') == 2:
        p = doc.add_paragraph()
        run = p.add_run(line[2:-2])
        run.bold = True
        run.font.size = Pt(11)

    elif line.strip() == '':
        doc.add_paragraph()

    else:
        p = doc.add_paragraph()
        render_inline_bold(p, line)

    i += 1

doc.save(str(OUTPUT))
print(f"Word document saved: {OUTPUT}")
```

Substitute `<<COMPANY_NAME>>` with the actual company name and `<<FULL_TEARDOWN_TEXT>>` with the complete teardown text above, then execute with Bash using the full Python path. Confirm the output path to the user when done.
        pdf.set_text_color(40, 40, 40)
        pdf.multi_cell(0, 6, line)

pdf.output(str(OUTPUT))
print(f"PDF saved: {OUTPUT}")
```

Substitute `<<COMPANY_NAME>>` with the actual company name and `<<FULL_TEARDOWN_TEXT>>` with the complete teardown text above, then execute with Bash. Confirm the output path to the user when done.

---

*All claims are traceable to fetched sources. Uncertainty is flagged explicitly. If a data source was unavailable, the affected sections note the gap and state what additional data would change the assessment.*

