Loading...
Loading...
Claude-powered ecommerce business review toolkit for D2C stores. Single command: review. Analyzes order transaction data across multiple time periods (30d/90d/365d), produces KPI trees with health signals, structured findings, and concrete action plans. Triggers on: "ecommerce review", "store review", "store health", "revenue analysis", "customer analysis", "product analysis", "business review".
npx skill4agent add takechanman1228/claude-ecom ecom| Command | What it does | Output |
|---|---|---|
| /ecom review | Full business review (auto-selects periods from data) | REVIEW.md |
| /ecom review 30d | Focused on the last 30 days | REVIEW_30D.md |
| /ecom review 90d | Focused on the last 90 days | REVIEW_90D.md |
| /ecom review 365d | Focused on the last 365 days | REVIEW_365D.md |
| /ecom review [question] | Answers a specific question from the data | Inline response |
/ecom review/ecom review 30d/ecom review 365d| Query pattern | Data source |
|---|---|
| last 30 days | |
| last 3 months / last 90 days | |
| last year / this year | |
| last month / specific month name | full run, extract from monthly_trend |
| Q1-Q4 / specific quarter | full run, extract from monthly_trend |
--period 30d~/.claude/skills/ecom/bin/ecom review orders.csv --output <output-dir>
~/.claude/skills/ecom/bin/ecom review orders.csv --period 90d --output <output-dir>~/.claude/skills/ecom/bin/ecom review orders.csv --output <output-dir>review.jsonreview_{period}.jsonreview.jsonreview_{period}.jsonREVIEW_{PERIOD}.md{
"version": "0.1.0",
// --- Metadata ---
"metadata": {
"generated_at": "2026-03-05T18:00:00Z",
"data_start": "2025-01-01",
"data_end": "2025-12-31",
"total_orders": 5784,
"total_customers": 2765,
"total_revenue": 1383651,
"currency": "USD",
"revenue_definition": "Net sales after discounts, before tax and shipping"
},
// --- Data quality warnings (empty array = no issues) ---
"data_quality": [
// Example entries (only present when issues detected):
// { "type": "partial_period", "period": "2026-02", "days_with_data": 3,
// "message": "Latest month (2026-02) has only 3 days of data. MoM comparisons use prior complete months." }
// { "type": "short_data_span", "days": 45, "message": "Data spans only 45 days..." }
// { "type": "limited_data_span", "days": 200, "message": "Data spans 200 days (<1 year)..." }
],
// --- Data coverage: which periods are available ---
"data_coverage": {
"30d": true, // true if >=45 days of data exist
"90d": true, // true if >=120 days of data exist
"365d": true // true if >=400 days of data exist
},
// --- Period metrics (one block per available period) ---
"periods": {
"30d": {
"summary": {
"revenue": 98000,
"revenue_change": -0.003, // vs prior 30d
"orders": 412,
"orders_change": -0.03,
"aov": 238,
"aov_change": -0.001,
"customers": 287,
"customers_change": -0.05
},
"kpi_tree": {
"new_customer_revenue": 38000,
"new_customer_revenue_share": 0.388,
"new_customers": 95,
"new_customers_change": -0.08,
"new_customer_aov": 400,
"returning_customer_revenue": 60000,
"returning_customer_revenue_share": 0.612,
"returning_customers": 192,
"returning_customers_change": -0.03,
"returning_customer_aov": 312
},
"drivers": {
"aov_effect": 1200, // revenue change attributable to AOV
"volume_effect": -1500, // revenue change attributable to order count
"mix_effect": 0 // revenue change attributable to new/returning mix shift
}
},
"90d": { /* same structure */ },
"365d": {
/* same structure as 30d (summary, kpi_tree, drivers) plus: */
"repeat_purchase_rate": 0.38, // only in 365d block
"monthly_trend": [
{ "month": "2025-01", "revenue": 95000, "orders": 420, "aov": 226, "customers": 310, "new_customers": 180, "returning_customers": 130, "days_with_data": 31 },
// ... only months with actual data (no zero-fill for future months)
{ "month": "2025-12", "revenue": 12000, "orders": 45, "aov": 267, "customers": 38, "new_customers": 10, "returning_customers": 28, "days_with_data": 3, "partial": true }
]
}
},
// --- Health checks (powers 🟢/🟡/🔴 markers) ---
"health": {
"checks": [
{
"id": "monthly_revenue_trend", // internal only, never expose
"category": "revenue",
"severity": "high",
"result": "watch", // pass | watch | fail
"message": "MoM revenue growth: -3.8%",
"value": -0.038,
"threshold": 0.0
}
// ... more checks
],
"top_issues": [
// Pre-sorted by severity * impact. Max 10.
{
"id": "multi_item_order_rate",
"category": "product",
"severity": "high",
"result": "fail",
"message": "Multi-item order rate: 0.0%",
"estimated_annual_impact": 77573
}
// ...
]
},
// --- Pre-computed action candidates ---
"action_candidates": [
{
"action": "Introduce product bundles to increase multi-item orders",
"source_check": "multi_item_order_rate", // internal reference
"severity": "high",
"estimated_annual_impact": 77573,
"timeline": "this_month"
}
// ... max 10 candidates, sorted by impact
]
}periodsdata_coveragetrue_changehealth.checkshealth.top_issuesaction_candidatesmonthly_trendmonthly_trend"partial": truedata_qualityPath:references/
review-narratives.mdfinding-clusters.mdrecommended-actions.mdimpact-formulas.mdhealth-checks.mdbenchmarks.md[North Star result + trend across periods]
[What's working: 1-2 strengths confirmed by data -- 80/20 rule]
[What needs attention: the key tension/risk, with data]
[Most important action, with timeline]Revenue reached $1.38M for the year (+25.7% YoY), but growth is decelerating -- the last 90 days grew only 8% vs prior 90 days, and last month was flat (+0.3%). Growth depends on existing customer AOV increases (+14.8%), while new customer acquisition has stalled (share: 42.3%, unchanged). Reallocate 20% of retention budget to acquisition channels by end of this month, targeting CPA below $XX.
30d Pulse 90d Momentum 365d Structure
Revenue $98K (= flat) $340K (+ 8%) $1.38M (+ 26%)
Orders 412 (- 3%) 1,280 (+ 5%) 5,784 (+ 10%)
AOV $238 (= flat) $266 (+ 12%) $239 (+ 15%)
Customers 287 (- 5%) 812 (+ 3%) 2,765 (+ 10%)+-=| Period | Depth | Findings cap | Role |
|---|---|---|---|
| 30d Pulse | Shallow -- KPI tree + 1-2 sentences + max 1 finding | 1 | Flag fires only |
| 90d Momentum | Medium -- KPI tree + drivers + max 2 findings | 2 | Main analytical body |
| 365d Structure | Deep -- KPI tree + drivers + max 3 findings | 3 | Strategic narrative |
Revenue $X (vs prior period: +X%)
|-- 🟢 New Customer Revenue $X (X% of total)
| |-- New Customers: X (+X%)
| |-- New Customer AOV: $X (+X%)
|-- 🟡 Existing Customer Revenue $X (X% of total)
|-- Returning Customers: X (+X%)
|-- Returning AOV: $X (+X%)
|-- Repeat Purchase Rate: X% -- first-to-second purchase conversion (365d only)Immediate (from 30d signals)
1. ...
This Month (from 90d findings)
2. ...
This Quarter (from 365d insights)
3. ...Guardrails: [2-3 metrics that must not deteriorate while executing above actions]Example: AOV must stay above $X | Repeat purchase rate must not drop below X% | Discount rate must stay under X%
metadata.revenue_definitionWhat is: Annual revenue grew 25.7% YoY.
Why it matters: However, despite a 25.4% reduction in discount rate, new customer
revenue share remains at 42.3% -- growth depends entirely on
existing customer AOV increases (+14.8%).
What to do: Reallocate retention budget toward acquisition channels to diversify growth sources.What is: Revenue grew 25.7%.
Why it matters: Rapid growth must be validated. <-- no data, no tension
What to do: Consider improving acquisition. <-- banned verb, no deadlinedata_qualityEach check returns pass / watch / fail. These power the 🟢🟡🔴 KPI tree markers. Check definitions in. Do NOT use numeric scores, letter grades, or percentage-based health ratings.references/health-checks.md
~/.claude/skills/ecom/.venv/~/.claude/skills/ecom/bin/ecom review orders.csv --output <output-dir>
~/.claude/skills/ecom/bin/ecom review orders.csv --period 90d --output <output-dir>loadermetricsdecompositioncohortproductchecksreportreview_engineconfignormalizeperiods