Analyzing dtc stores
Skill Agent-Engineer-Master/skill-engineer/marketing/analyzing-dtc-stores
Use when the user provides a DTC or ecommerce store URL and asks for a teardown, breakdown, brand analysis, competitor teardown, investor memo, store audit, deep dive, or 'what's going on with [brand]'. Produces an investor-grade markdown teardown report covering brand, market, unit economics, supply chain, channel mix, marketing, reviews, agentic-commerce readiness, risks, and a falsifiable verdict. Triggers: 'dtc teardown', 'brand teardown', 'store teardown', 'competitor teardown', 'analyze this store', 'investor memo on [brand]', 'break down [store url]'. Do NOT use for SEO-only audits, design-system extraction, lead-gen scraping, or general web scraping with no brand/investor focus.From its SKILL.md
npx -y skills add Agent-Engineer-Master/skill-engineer --skill analyzing-dtc-storesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- reads credentialsReads from 1 credential source: `OPENAI_API_KEY`.
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `scripts/recon.py --url <store_url>` and 7 more.
SKILL.md
9.7 KB, ~2.2k tokens by cl100k_base, as published. Nobody here has run it
Analyzing DTC Stores
Produces an investor-grade teardown of a DTC brand from its public URL. Read-only — never writes to the store, sends email, or posts anywhere.
Inputs
- Required:
store_url— brand's primary storefront. - Optional:
depth—quick|standard(default) |deep. - Optional:
focus— free-text bias (e.g. "supply chain", "acquisition target fit"). - Optional:
--no-save— return the report inline and skip saving.
Process
Step 1 — Intake
- Parse
store_url,depth,focus,--no-save. - Derive
brand_slugfrom the domain (e.g.brandname.com→brand-name). - Copy
assets/report-template.mdto a working draft. Do not save to the final path yet.
Step 2 — Recon sweep (scripted)
Run scripts/recon.py --url <store_url> to fetch homepage, robots.txt, sitemap, JSON-LD, and detect platform + apps (Shopify/Klaviyo/Gorgias/Recharge/Triple Whale signatures). Output cached in .cache/recon-[slug].json. Feeds the Tech Stack and Agentic Readiness sections.
Step 3 — Fan-out research (scripted + reasoning)
Load references/sources-playbook.md — required reading, it maps each report section to prescribed sources.
Run every applicable script. Fail gracefully: if a source is unreachable, log [source unavailable] in the report's Sources section and continue — never halt.
Mandatory scripts (all depths):
scripts/meta_ad_library.py --brand <brand>— active ad count, creative lifespan distribution.scripts/importyeti_lookup.py --brand <brand>— supplier + country-of-origin + shipment volume. Mandatory — the #1 skipped source.scripts/similarweb_lookup.py --domain <domain>— traffic with the 50K/mo accuracy floor flag.scripts/store_leads_lookup.py --domain <domain>— Shopify plan, app stack, revenue bracket.scripts/reviews_scan.py --brand <brand> --domain <domain>— Trustpilot + Amazon + YouTube review URLs.scripts/reddit_search.py --brand <brand>— Reddit sentiment via OpenAI web search (requires OPENAI_API_KEY). Returns structured JSON: thread_count, sentiment, top_praise_theme, top_complaint_theme. "0 threads" is a valid finding — log it in §10.
Additional for standard and deep:
scripts/amazon_bsr.py --brand <brand>— BSR + est. monthly unit sales for top SKUs.
For the reasoning steps (brand story, competitive strategic group, verdict framing) use WebSearch + WebFetch directly.
Step 4 — Unit economics
Read references/unit-economics-benchmarks.md for category COGS / CAC / LTV ranges. Run scripts/unit_econ.py --category <cat> --aov <aov> --cac <cac> to produce a CM1 → CM2 → CM3 waterfall. Every figure must carry stated assumptions and a ~ (est., method: …) prefix.
Step 5 — Draft the report
Fill the 16-section template in order. Principles:
- Prefer "Insufficient public data" over speculation. A 2-line section with the sources checked beats 8 lines of filler.
- Cite inline with
[1][2]— the Sources section at the end is the numbered index. - Every numeric claim is either cited or prefixed
~with method shown. Non-negotiable. - Competitors must come from independent discovery, not the brand's own "vs" page. If the brand lists competitors on its site, exclude them until resurfaced via search intent or category overlap.
- Show the CM waterfall, not just gross margin. Apparel especially — returns collapse CM2.
- SimilarWeb under 50K/mo = directional only. Quote a range, not a point estimate; triangulate with ad count + review velocity + headcount.
For depth=deep: after the draft, present three alternative verdict framings (bull, bear, contrarian) and let the user pick before finalising.
Step 6 — Self-check (scripted, mandatory)
Run scripts/validate_report.py --path <draft>. The script fails loud with a remediation list if:
- Any of the 16 sections is missing or empty.
- Any numeric claim is unsourced and not prefixed
~. - The Sources section is empty or has fewer than 5 entries.
- The Verdict section lacks a numerical "what would change my mind" anchor.
- Any banned hype word appears (
revolutionary,disruptive,game-changing,cutting-edge,seamless,unparalleled). - The ImportYeti check is missing from the Sources section (even a "no records found" entry counts).
Fix every failure and re-run. Do not proceed to Step 7 until the validator exits 0.
Step 7 — Save + return
Run scripts/save_report.py --path <draft> --slug <brand_slug> (honors --no-save). Returns the final path. Then output to chat: final path + a 5-bullet executive summary (≤120 words total).
Step 8 — Closing feedback gate
Ask the user exactly once: "Any corrections to this teardown before I log it?"
Route the response:
- Behavioural feedback (tone, framing, depth preference) → append to
references/learnings.md. - Factual exception (platform quirk, blocked source) → append to
references/edge-cases.md. - "Never again" → add a rule to this SKILL.md.
- Approval with no changes → copy final report to
assets/approved-examples/.
Report structure (16 sections, exact order)
- Research confidence & source map
- Executive summary (5 bullets, ≤120 words)
- Brand & positioning
- Product & value proposition
- Market & category (TAM/SAM, growth, tailwinds, regulatory)
- Competitive landscape (5–10 competitors in a table; name the strategic group)
- Pricing & unit economics (CM1/CM2/CM3 waterfall, CAC, payback — show the math)
- Supply chain & sourcing (ImportYeti, FDA, LinkedIn, job ads)
- Channel mix (DTC, Amazon, marketplaces, wholesale, international)
- Marketing & traffic (Meta Ad Library, Similarweb, creative lifespan, SEO)
- Customer voice & sentiment (review volumes, themes, NPS proxy)
- Tech stack
- Agentic / AI readiness (JSON-LD density, agentic storefront signals, checkout friction)
- Risks & red flags (incl. manufacturer-direct threat, tariff exposure)
- Financial summary & valuation (EV/Sales comps, buyer-type implications)
- Investor verdict (bull case, bear case, numerical "change my mind" anchor)
- Sources (numbered, with access dates)
Style: crisp, evidence-led, numerate, slightly sceptical. Voice of a senior analyst writing for a partner with 10 minutes. Length: 1,500–3,000 words for standard.
Gotchas
- Symptom: report states "$X ARR" without a source. Cause: triangulation mistaken for fact. Fix: every revenue figure cites a filing/interview/press release, or prefix
~ (est., method: …)and show the math. - Symptom: competitor list matches the brand's own "vs" page. Cause: used brand marketing as source of truth. Fix: build the competitor set from search intent + category overlap; exclude any competitor named on the brand's own site until independently surfaced.
- Symptom: unit economics cite gross margin only. Cause: stopped at CM1. Fix: always show the CM1 → CM2 → CM3 waterfall with stated assumptions; apparel especially — 24–30% return rates collapse CM2.
- Symptom: SimilarWeb precise visitor count for a small brand. Cause: ignored the 50K/mo accuracy floor. Fix: below 50K/mo, quote a range and label "directional only"; triangulate with ad count, review velocity, LinkedIn headcount.
- Symptom: no ImportYeti entry in Sources. Cause: forgot the mandatory check — the single most commonly skipped DTC source. Fix: Step 3 blocks until
importyeti_lookup.pyhas run; a "no shipment records found" result still counts. - Symptom: verdict hedges ("interesting brand, execution risk at scale"). Cause: analyst avoided commitment. Fix: verdict must contain a numerical anchor (e.g. "investable below $80M valuation") AND a "what would change my mind" line. Validator fails otherwise.
- Symptom: Meta-reported ROAS cited without qualification. Cause: ignored post-iOS14 attribution collapse. Fix: treat brand-reported Meta ROAS as directional; note the ATT caveat; prefer MER or incrementality-adjusted estimates.
- Symptom: blended CAC cited instead of new-customer CAC. Cause: blended metric flatters because returning-customer spend is in the denominator. Fix: separate the two; new-customer CAC is the scaling metric investors care about.
Rules
- SKILL.md is the routing layer. Domain knowledge lives in
references/— load on demand, don't embed. references/sources-playbook.mdis required reading at Step 3. Not optional.scripts/validate_report.pyis a hard gate at Step 6. Not optional.- ImportYeti check is mandatory even on
quickdepth — a "no records found" entry is an acceptable result, silence is not. - Never call this skill "complete" until the validator exits 0.
- Read-only always. Never POST to the store, send email, or publish.
- Banned hype words in output:
revolutionary,disruptive,game-changing,cutting-edge,seamless,unparalleled.
<!-- Built with Agent Engineer Master — get your own production-ready skill: www.agentengineermaster.com/skill-engineer -->
What ships with it: 21 files
80.1 KB alongside SKILL.md, 12 of them executable
assets/
- report-template.md1.9 KB
evals/
- evals.json1.8 KB
- judge.md2.4 KB
- rubric.md5.0 KB
references/
- edge-cases.md539 B
- learnings.md548 B
- sources-playbook.md7.2 KB
- unit-economics-benchmarks.md3.6 KB
- worked-example.md4.5 KB
scripts/
- amazon_bsr.pyruns3.5 KB
- importyeti_lookup.pyruns4.6 KB
- meta_ad_library.pyruns11.2 KB
- _openai_search.pyruns2.0 KB
- recon.pyruns4.4 KB
- reddit_search.pyruns5.3 KB
- reviews_scan.pyruns2.4 KB
- save_report.pyruns1.6 KB
- similarweb_lookup.pyruns4.8 KB
- store_leads_lookup.pyruns5.2 KB
- unit_econ.pyruns3.4 KB
- validate_report.pyruns4.5 KB