
Unit Economics Tracking
- 64 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Tracks CAC, LTV, payback period, and contribution margin by cohort and channel with profitability benchmarks and trend analysis.
About
Measures ecommerce unit economics including customer acquisition cost, lifetime value, payback, and contribution margin across cohorts and channels. A developer uses it to judge channel profitability and growth efficiency.
- CAC, LTV, payback, and contribution margin by cohort/channel
- Profitability benchmarks and trend analysis
Unit Economics Tracking by the numbers
- 64 all-time installs (skills.sh)
- Ranked #563 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill unit-economics-trackingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 64 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Tracks CAC, LTV, payback period, and contribution margin by cohort and channel with profitability benchmarks and trend analysis.
Files
Unit Economics Tracking
Overview
Unit economics describes the financial dynamics of a single customer. The four key metrics — Customer Acquisition Cost (CAC), Customer Lifetime Value (LTV), the LTV:CAC ratio, and payback period — tell you whether your business model is economically viable. These metrics are among the most scrutinized by investors and boards because they reveal the underlying health of the business independent of short-term revenue trends.
This skill guides you through calculating and tracking these metrics using your platform's analytics tools and dedicated customer analytics apps.
When to Use This Skill
- When preparing investor materials and needing to present unit economics metrics
- When understanding whether it is profitable to increase marketing spend in a given channel
- When analyzing why CAC has increased over the past 6 months
- When comparing the quality of customers acquired through different channels
- When building a financial model and needing to validate LTV assumptions
- When setting budget guardrails: maximum allowable CAC by channel
- When evaluating a new acquisition channel and projecting its payback period
Core Instructions
Step 1: Choose your unit economics tracking tool by platform
| Platform | Tool | What It Provides |
|---|---|---|
| Shopify | Lifetimely (App Store) | CAC by channel, cohort LTV curves, payback period, predicted CLV per customer |
| Shopify | Triple Whale (App Store) | New customer CAC by channel, blended CAC, LTV vs. CAC ratio |
| Shopify | Polar Analytics (App Store) | CAC tracking with channel breakdown, MER, and LTV trending |
| WooCommerce | Metorik | Customer cohort analysis, repeat purchase rate, LTV by acquisition channel |
| BigCommerce | Glew.io (App Marketplace) | Customer cohort retention, CLV by segment, repeat purchase analysis |
| All platforms | Google Analytics 4 | Acquisition channel reporting; pair with cost data from ad platforms for CAC calculation |
Step 2: Calculate Customer Acquisition Cost (CAC)
CAC is the total marketing and sales spend required to acquire one new customer.
Types of CAC:
| CAC Type | Formula | When to Use |
|---|---|---|
| Blended CAC | Total marketing spend / Total new customers acquired | Overall efficiency trend; monthly reporting |
| Paid CAC | Total paid media spend / New customers from paid channels only | Channel budget decisions |
| Fully-loaded CAC | Total marketing spend + agency fees + marketing tech + team salaries / New customers | Investor presentations; true economic cost |
Getting CAC data by platform:
Shopify with Lifetimely: 1. Install Lifetimely from the Shopify App Store 2. Connect ad accounts (Meta, Google, TikTok) under Integrations 3. Go to Lifetimely → Channels — view CAC by acquisition channel with trend over time 4. Lifetimely tracks "new customers" based on first Shopify order date and attributes them to their first-touch UTM source
Shopify with Triple Whale: 1. Install Triple Whale and connect ad accounts 2. Go to Triple Whale → Summary Dashboard — "New Customer CAC" tile shows blended new customer acquisition cost 3. Go to Triple Whale → Attribution → New Customer Revenue for CAC by channel
Manual CAC calculation (any platform): 1. Export: Monthly marketing spend by channel (from your ad platforms or agency reports) 2. Export: New customer count by acquisition channel and month (from your platform's analytics: Shopify Analytics → New vs. returning customers; Metorik → Customers → First order date) 3. Calculate: CAC by channel = Channel spend / New customers attributed to that channel
Typical CAC benchmarks by channel:
- Google Shopping / Search: $15–$50 (lower for branded, higher for competitive non-branded)
- Meta (Facebook/Instagram): $20–$80 for DTC
- TikTok: $10–$40 (often lower for discovery-driven products)
- Influencer marketing: $15–$60 (highly variable)
- Email/SMS (acquisition via lead gen): $5–$20
Step 3: Calculate Customer Lifetime Value (LTV)
LTV is the total net revenue (or contribution margin) you expect from a customer over their relationship with your business.
Historical (observed) LTV: Pull this from your analytics tool directly.
Shopify + Lifetimely: 1. Go to Lifetimely → Cohorts — see a cohort table showing cumulative revenue per customer at 1, 3, 6, 12, 18, 24 months after acquisition 2. The month-12 and month-24 rows represent your observed LTV at those time horizons 3. Go to Lifetimely → Predicted CLV — Lifetimely's model predicts 12-month and 24-month CLV per customer based on their early purchase behavior
WooCommerce + Metorik: 1. Go to Metorik → Reports → Customer Cohorts — cohort retention table with cumulative revenue per customer by months since acquisition 2. Go to Metorik → Customers → Filter by: First order date range — view average revenue per customer for any acquisition cohort
Predicted LTV formula (for planning models):
When you do not have 12+ months of cohort data, use this simplified formula:
LTV = (Average Order Value × Purchase Frequency per Year × Gross Margin %) / Annual Churn Rate
Example:
AOV: $65
Purchase Frequency: 2.5 orders/year
Gross Margin: 55%
Annual Churn Rate: 40%
LTV = ($65 × 2.5 × 0.55) / 0.40 = $89.375 / 0.40 = $223.44This formula gives steady-state LTV. It assumes stable purchase behavior, which is a simplification — cohort-based analysis is more accurate when you have the data.
Step 4: Calculate LTV:CAC ratio and payback period
LTV:CAC ratio:
LTV:CAC = LTV / CAC
Benchmarks:
2:1 = Minimum viable (barely profitable customer acquisition)
3:1 = Healthy for DTC ecommerce
5:1+ = Excellent; strong case for scaling marketing spend| LTV:CAC | Assessment | Action |
|---|---|---|
| < 2:1 | Unprofitable | Stop scaling paid acquisition; improve retention or reduce costs |
| 2:1 – 3:1 | Marginal | Monitor closely; improve one driver (AOV, repeat rate, or CAC) before scaling |
| 3:1 – 5:1 | Healthy | Good baseline; evaluate where to scale |
| 5:1+ | Excellent | Prioritize scaling this channel or business |
Payback period:
Payback period = CAC / (Monthly Contribution per Customer)
Example:
CAC: $60
AOV: $65
Purchase Frequency: 2.5 orders/year → 0.21 orders/month
Gross Margin: 55%
Fulfillment + other variable costs: 15%
Contribution margin rate: 40%
Monthly contribution per customer = $65 × 0.21 × 0.40 = $5.46
Payback period = $60 / $5.46 = 11 monthsPayback benchmarks:
- <6 months: Excellent; very capital-efficient growth
- 6–12 months: Healthy
- 12–24 months: Acceptable if retention is strong past month 24
- 24+ months: Problematic unless you have significant venture/debt capital to bridge
Step 5: Track unit economics by acquisition channel
The most important dimension for unit economics is acquisition channel — customers from different sources often have dramatically different LTVs, repeat purchase rates, and initial AOVs.
Using Lifetimely (Shopify) to compare channels: 1. Go to Lifetimely → Channels — select "LTV comparison by channel" 2. View 12-month and 24-month LTV by first-touch acquisition source 3. Pair with CAC by channel (from ad platform spend) to calculate LTV:CAC by channel
Channel LTV comparison template:
| Channel | CAC | Month-12 LTV | LTV:CAC | Payback (months) | Assessment |
|---|---|---|---|---|---|
| Google Shopping | $35 | $180 | 5.1:1 | 4 | Excellent; scale |
| Meta Prospecting | $62 | $145 | 2.3:1 | 13 | Marginal; optimize creatives |
| TikTok | $28 | $95 | 3.4:1 | 9 | Healthy; test scaling |
| Influencer | $45 | $210 | 4.7:1 | 6 | Excellent; invest more |
| Organic/SEO | $0 | $165 | ∞ | 0 | Free acquisition; protect this channel |
Key insight from this type of analysis: Meta Prospecting appears to have a high ROAS in Meta's dashboard but has the worst LTV:CAC because those customers have lower repeat purchase rates. This is the power of LTV-based analysis over single-order ROAS.
Step 6: Monitor CAC trends weekly
Rising CAC is the first warning sign of channel saturation or increased competition. Monitor it weekly:
1. Set up a CAC alert in Triple Whale or Polar Analytics: alert when weekly new customer CAC exceeds your maximum allowable CAC by channel 2. Your maximum allowable CAC = LTV / Target LTV:CAC ratio
- Example: If LTV = $180 and target LTV:CAC = 3.0, max CAC = $60
3. Any channel where CAC exceeds the maximum allowable CAC should be reviewed before the next weekly budget cycle
Best Practices
- Use contribution margin LTV, not gross revenue LTV — LTV calculated on revenue overstates actual customer value; use contribution margin (after COGS, fulfillment, and variable costs) for a realistic economic picture
- Segment LTV by acquisition channel from day one — customers from organic search, paid social, and influencer partnerships often have dramatically different LTVs; pooling them into a blended LTV obscures channel economics
- Track LTV curves, not just point estimates — plot cumulative gross profit per customer over 24 months for each cohort; comparing curves across cohorts reveals whether recent cohorts are better or worse than historical averages
- Set maximum CAC guardrails for each channel — derive Max CAC = LTV / Target LTV:CAC ratio; use this as a hard budget guardrail so marketing teams cannot overpay for customers without executive approval
- Validate LTV predictions against cohort actuals — every 6 months, compare LTV predictions against the actual cumulative gross profit of cohorts that are now old enough to measure; recalibrate if predictions are consistently off
- Account for reactivation costs in long-tail LTV — customers who lapse and return via win-back campaigns have reactivation costs (discounts, extra email volume) that should reduce the apparent value of long-tail behavior
Common Pitfalls
| Problem | Solution |
|---|---|
| Using only media spend to calculate CAC | True CAC includes agency fees, marketing technology (email platforms, analytics apps), marketing team salaries, and first-order discounts; using media-only CAC understates true CAC by 20–50% |
| Using ARPU (average revenue per user) instead of contribution margin for LTV | LTV in revenue terms overstates economic value; always use average contribution margin per customer per period |
| Ignoring cohort degradation | Newer cohorts often have worse retention than earlier cohorts as you move from early adopters to broader audiences; always compare cohort curves against each other rather than assuming all cohorts are equal |
| Confusing blended CAC with channel-level CAC | Blended CAC mixes organic (free) and paid customers; since organic customers cost nothing to acquire, blending them flatters paid CAC; use paid CAC by channel for budget decisions |
| Presenting LTV with too-long forecasts when business is young | If your business has 18 months of data, a 36-month LTV is highly speculative; be transparent about what portion of LTV is observed vs. modeled extrapolation |
Related Skills
- @customer-analytics
- @attribution-modeling
- @marketing-spend-analysis
- @financial-analytics-dashboard
- @ecommerce-budgeting-forecasting
{
"context": "Tests whether the agent uses contribution margin (not gross revenue) for LTV, segments LTV by acquisition channel separately, employs cohort-based monthly analysis, compares cohort curves to detect degradation, and correctly handles reacquired customers as distinct from new customers.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Contribution margin basis",
"max_score": 12,
"description": "LTV calculations use gross profit or contribution margin figures, NOT gross revenue or net revenue alone as the numerator/basis for LTV"
},
{
"name": "Channel-level LTV segmentation",
"max_score": 10,
"description": "LTV is computed separately for each acquisition channel (e.g., paid_social, organic, email), producing distinct LTV values per channel rather than a single blended figure"
},
{
"name": "Monthly cohort grouping",
"max_score": 8,
"description": "Customers are grouped into monthly acquisition cohorts (cohort defined by month of first order), not annual or other period groupings"
},
{
"name": "Cumulative per-customer LTV curve",
"max_score": 10,
"description": "Output includes cumulative LTV per customer at each time period (e.g., month 1, 3, 6, 12, 24) for each cohort, not just a single LTV endpoint"
},
{
"name": "Cross-cohort curve comparison",
"max_score": 10,
"description": "The solution explicitly compares LTV curves across different cohorts (e.g., by computing or displaying how later cohorts compare to earlier cohorts at the same months-since-acquisition)"
},
{
"name": "Cohort degradation flag",
"max_score": 10,
"description": "The solution identifies or flags when newer cohorts have lower LTV than older cohorts at equivalent time points (cohort degradation detection)"
},
{
"name": "Reacquired customer separation",
"max_score": 10,
"description": "The solution distinguishes between first-time new customers and reacquired/returning customers (those with a prior lapse), treating them as separate segments rather than combining them"
},
{
"name": "Reactivation cost inclusion",
"max_score": 8,
"description": "When computing LTV for reacquired customers, the solution accounts for win-back campaign costs or reactivation discounts as a cost reducing their net LTV"
},
{
"name": "No gross revenue LTV",
"max_score": 10,
"description": "Does NOT compute LTV using ARPU (average revenue per user) or total revenue per customer as the primary LTV metric — uses contribution margin or gross profit instead"
},
{
"name": "Normalization by cohort size",
"max_score": 12,
"description": "Cumulative LTV metrics are normalized per customer (divided by cohort size), not reported as aggregate cohort totals"
}
]
}
Customer Cohort Profitability Analysis
Problem/Feature Description
Verdana Skincare has been running for three years and acquired customers through three channels: paid social advertising, organic/SEO traffic, and an email referral program. The VP of Marketing believes paid social is their most valuable channel based on volume, but the CFO suspects that organic customers spend more over time and may actually be worth more. They've been having the same debate for six months without resolution because nobody has built the analysis to settle it.
There's a secondary complication: the company ran two large win-back campaigns in 2024 targeting customers who hadn't purchased in over 9 months, offering 30% discounts to re-engage them. Some of these reactivated customers are now showing up in the "active customer" numbers, and leadership wants to understand whether those win-back investments are paying off or inflating the metrics.
Build a Python analysis tool using the provided transaction data that helps the team understand which customers are truly valuable and how customer quality has evolved across cohorts acquired over different time periods.
Output Specification
Write a Python script (cohort_analysis.py) that processes the provided data and writes a JSON report (cohort_report.json) containing:
- LTV analysis broken down by acquisition channel, with separate handling for reacquired customers vs new customers
- Cohort-level cumulative performance at months 1, 3, 6, and 12 after acquisition
- A comparison across cohorts showing whether customer quality is improving or declining over time
- A summary table of channel-level economics
Print a human-readable summary to stdout. Write full results to cohort_report.json.
Input Files
The following files are provided as inputs. Extract them before beginning.
=============== FILE: inputs/customers.json =============== { "customers": [ {"customer_id": "C001", "first_order_date": "2023-01-15", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C002", "first_order_date": "2023-01-22", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C003", "first_order_date": "2023-02-03", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C004", "first_order_date": "2023-02-14", "acquisition_channel": "email_referral", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C005", "first_order_date": "2023-03-05", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C006", "first_order_date": "2023-03-18", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C007", "first_order_date": "2023-04-09", "acquisition_channel": "email_referral", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C008", "first_order_date": "2023-04-22", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C009", "first_order_date": "2023-05-11", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C010", "first_order_date": "2023-06-01", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C011", "first_order_date": "2024-01-08", "acquisition_channel": "paid_social", "is_reacquired": true, "reactivation_cost": 28.50}, {"customer_id": "C012", "first_order_date": "2024-01-15", "acquisition_channel": "email_referral", "is_reacquired": true, "reactivation_cost": 22.00}, {"customer_id": "C013", "first_order_date": "2024-02-05", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C014", "first_order_date": "2024-02-19", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C015", "first_order_date": "2024-03-07", "acquisition_channel": "paid_social", "is_reacquired": true, "reactivation_cost": 31.00}, {"customer_id": "C016", "first_order_date": "2024-03-22", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C017", "first_order_date": "2024-04-14", "acquisition_channel": "email_referral", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C018", "first_order_date": "2024-05-02", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C019", "first_order_date": "2024-05-20", "acquisition_channel": "organic", "is_reacquired": false, "reactivation_cost": 0}, {"customer_id": "C020", "first_order_date": "2024-06-10", "acquisition_channel": "paid_social", "is_reacquired": false, "reactivation_cost": 0} ] }
=============== FILE: inputs/orders.json =============== { "orders": [ {"order_id": "O001", "customer_id": "C001", "order_date": "2023-01-15", "gross_revenue": 89.00, "contribution_margin": 38.50}, {"order_id": "O002", "customer_id": "C001", "order_date": "2023-04-20", "gross_revenue": 112.00, "contribution_margin": 47.00}, {"order_id": "O003", "customer_id": "C001", "order_date": "2023-08-10", "gross_revenue": 95.00, "contribution_margin": 41.00}, {"order_id": "O004", "customer_id": "C001", "order_date": "2024-01-05", "gross_revenue": 130.00, "contribution_margin": 55.50}, {"order_id": "O005", "customer_id": "C002", "order_date": "2023-01-22", "gross_revenue": 75.00, "contribution_margin": 32.00}, {"order_id": "O006", "customer_id": "C002", "order_date": "2023-03-15", "gross_revenue": 88.00, "contribution_margin": 37.50}, {"order_id": "O007", "customer_id": "C002", "order_date": "2023-06-02", "gross_revenue": 102.00, "contribution_margin": 44.00}, {"order_id": "O008", "customer_id": "C002", "order_date": "2023-09-18", "gross_revenue": 91.00, "contribution_margin": 39.00}, {"order_id": "O009", "customer_id": "C002", "order_date": "2024-02-14", "gross_revenue": 115.00, "contribution_margin": 49.00}, {"order_id": "O010", "customer_id": "C003", "order_date": "2023-02-03", "gross_revenue": 65.00, "contribution_margin": 27.00}, {"order_id": "O011", "customer_id": "C003", "order_date": "2023-07-22", "gross_revenue": 78.00, "contribution_margin": 33.00}, {"order_id": "O012", "customer_id": "C004", "order_date": "2023-02-14", "gross_revenue": 95.00, "contribution_margin": 41.50}, {"order_id": "O013", "customer_id": "C004", "order_date": "2023-05-08", "gross_revenue": 110.00, "contribution_margin": 47.50}, {"order_id": "O014", "customer_id": "C004", "order_date": "2023-08-30", "gross_revenue": 88.00, "contribution_margin": 38.00}, {"order_id": "O015", "customer_id": "C005", "order_date": "2023-03-05", "gross_revenue": 82.00, "contribution_margin": 35.50}, {"order_id": "O016", "customer_id": "C005", "order_date": "2023-06-14", "gross_revenue": 97.00, "contribution_margin": 42.00}, {"order_id": "O017", "customer_id": "C005", "order_date": "2023-10-05", "gross_revenue": 110.00, "contribution_margin": 47.50}, {"order_id": "O018", "customer_id": "C005", "order_date": "2024-03-20", "gross_revenue": 125.00, "contribution_margin": 53.50}, {"order_id": "O019", "customer_id": "C006", "order_date": "2023-03-18", "gross_revenue": 70.00, "contribution_margin": 29.00}, {"order_id": "O020", "customer_id": "C006", "order_date": "2023-09-25", "gross_revenue": 85.00, "contribution_margin": 36.50}, {"order_id": "O021", "customer_id": "C007", "order_date": "2023-04-09", "gross_revenue": 98.00, "contribution_margin": 42.50}, {"order_id": "O022", "customer_id": "C007", "order_date": "2023-07-18", "gross_revenue": 115.00, "contribution_margin": 49.50}, {"order_id": "O023", "customer_id": "C007", "order_date": "2023-11-22", "gross_revenue": 102.00, "contribution_margin": 44.00}, {"order_id": "O024", "customer_id": "C008", "order_date": "2023-04-22", "gross_revenue": 88.00, "contribution_margin": 38.00}, {"order_id": "O025", "customer_id": "C008", "order_date": "2023-08-14", "gross_revenue": 105.00, "contribution_margin": 45.00}, {"order_id": "O026", "customer_id": "C008", "order_date": "2024-01-30", "gross_revenue": 118.00, "contribution_margin": 50.50}, {"order_id": "O027", "customer_id": "C009", "order_date": "2023-05-11", "gross_revenue": 72.00, "contribution_margin": 30.00}, {"order_id": "O028", "customer_id": "C009", "order_date": "2023-11-08", "gross_revenue": 89.00, "contribution_margin": 38.00}, {"order_id": "O029", "customer_id": "C010", "order_date": "2023-06-01", "gross_revenue": 91.00, "contribution_margin": 39.50}, {"order_id": "O030", "customer_id": "C010", "order_date": "2023-09-22", "gross_revenue": 108.00, "contribution_margin": 46.50}, {"order_id": "O031", "customer_id": "C010", "order_date": "2024-02-08", "gross_revenue": 122.00, "contribution_margin": 52.00}, {"order_id": "O032", "customer_id": "C011", "order_date": "2024-01-08", "gross_revenue": 68.00, "contribution_margin": 24.50}, {"order_id": "O033", "customer_id": "C011", "order_date": "2024-05-14", "gross_revenue": 82.00, "contribution_margin": 31.50}, {"order_id": "O034", "customer_id": "C012", "order_date": "2024-01-15", "gross_revenue": 75.00, "contribution_margin": 30.00}, {"order_id": "O035", "customer_id": "C013", "order_date": "2024-02-05", "gross_revenue": 58.00, "contribution_margin": 22.50}, {"order_id": "O036", "customer_id": "C013", "order_date": "2024-06-18", "gross_revenue": 70.00, "contribution_margin": 28.00}, {"order_id": "O037", "customer_id": "C014", "order_date": "2024-02-19", "gross_revenue": 84.00, "contribution_margin": 36.00}, {"order_id": "O038", "customer_id": "C014", "order_date": "2024-07-05", "gross_revenue": 98.00, "contribution_margin": 42.00}, {"order_id": "O039", "customer_id": "C015", "order_date": "2024-03-07", "gross_revenue": 65.00, "contribution_margin": 22.00}, {"order_id": "O040", "customer_id": "C016", "order_date": "2024-03-22", "gross_revenue": 79.00, "contribution_margin": 34.00}, {"order_id": "O041", "customer_id": "C017", "order_date": "2024-04-14", "gross_revenue": 92.00, "contribution_margin": 40.00}, {"order_id": "O042", "customer_id": "C018", "order_date": "2024-05-02", "gross_revenue": 62.00, "contribution_margin": 24.00}, {"order_id": "O043", "customer_id": "C019", "order_date": "2024-05-20", "gross_revenue": 77.00, "contribution_margin": 33.00}, {"order_id": "O044", "customer_id": "C020", "order_date": "2024-06-10", "gross_revenue": 55.00, "contribution_margin": 21.00} ] }
{
"context": "Tests whether the agent correctly computes fully-loaded CAC (not just media spend), distinguishes paid channel CAC from blended CAC, derives max-CAC guardrails using the LTV:CAC ratio formula, and applies correct industry benchmark thresholds when assessing unit economics health.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Fully-loaded cost components",
"max_score": 12,
"description": "The CAC computation includes at least 4 of the following beyond raw media spend: agency fees, marketing technology costs, marketing/sales team payroll, first-order discount costs, or free trial costs"
},
{
"name": "Separate paid vs blended CAC",
"max_score": 10,
"description": "The solution produces both a blended CAC (all customers including organic) and a paid/channel-level CAC as distinct values, not a single combined figure"
},
{
"name": "Max CAC guardrail formula",
"max_score": 12,
"description": "Maximum allowable CAC is derived as LTV divided by a target LTV:CAC ratio (Max CAC = LTV / target_ratio), not a fixed arbitrary number"
},
{
"name": "LTV:CAC thresholds",
"max_score": 10,
"description": "LTV:CAC assessment uses thresholds of 2.0 (minimum viable), 3.0 (healthy), and 5.0 (excellent) — all three boundaries present in the classification logic"
},
{
"name": "CAC trend tracking",
"max_score": 8,
"description": "The solution tracks CAC across multiple periods (monthly or weekly) and computes period-over-period change, not just a single-period snapshot"
},
{
"name": "15% threshold alert",
"max_score": 10,
"description": "The solution explicitly flags or alerts when CAC increases by 15% or more versus a prior period"
},
{
"name": "Payback via contribution margin",
"max_score": 10,
"description": "Payback period is computed using contribution margin (not gross revenue), calculated as CAC divided by monthly contribution margin per customer"
},
{
"name": "12-month payback benchmark",
"max_score": 8,
"description": "Payback period assessment references 12 months as the 'healthy' threshold (and/or 6 months as excellent, 24 months as minimum viable)"
},
{
"name": "Channel-level breakdown output",
"max_score": 10,
"description": "Results are broken down or grouped by acquisition channel, not presented only as a single aggregate figure"
},
{
"name": "No media-only CAC for budget decisions",
"max_score": 10,
"description": "The solution does NOT use media-only spend as the sole input when computing CAC for budget guardrails or channel decisions — fully-loaded or paid channel CAC is used instead"
}
]
}
Marketing Spend Efficiency Audit Tool
Problem/Feature Description
Northbrook Goods is a direct-to-consumer home goods brand that has been growing rapidly over the past two years across three acquisition channels: paid social (Meta/TikTok), Google Search, and an influencer affiliate program. The CFO is preparing for a Series B pitch and has asked the growth team to produce a rigorous analysis of whether their customer acquisition spending is actually efficient. In past fundraises, investors pushed back hard on the CAC figures because the team was only counting ad spend — they want to avoid that conversation this time.
The team also wants to operationalize their budget planning. Right now, channel managers can increase budgets freely as long as they hit volume targets, but leadership suspects they may be overpaying for some channels relative to what those customers are actually worth. They want hard limits baked into the planning process, and an alert mechanism so the finance team knows when acquisition costs are drifting.
Output Specification
Build a Python script (cac_audit.py) that accepts the sample cost data below and produces a JSON report (cac_report.json) containing:
- CAC figures for each channel and in aggregate, broken down by cost component
- Channel-level and blended metrics for each period in the input data
- A channel-level budget guardrail calculation given a target LTV:CAC ratio (use 3.0 as the target)
- A trend analysis across periods, including any warning flags for significant cost increases
- A health assessment for each channel based on standard industry benchmarks
The script should print a human-readable summary to stdout and write the full results to cac_report.json.
Input Files
The following files are provided as inputs. Extract them before beginning.
=============== FILE: inputs/cost_data.json =============== { "ltv_by_channel": { "paid_social": 185.00, "google_search": 210.00, "influencer": 145.00 }, "periods": [ { "period": "2025-Q3", "channels": { "paid_social": { "media_spend": 42000, "agency_fees": 5000, "marketing_tech_costs": 1200, "marketing_payroll_allocated": 8000, "first_order_discount_cost": 3100, "new_customers_paid": 310, "new_customers_organic": 95 }, "google_search": { "media_spend": 28000, "agency_fees": 2500, "marketing_tech_costs": 800, "marketing_payroll_allocated": 4500, "first_order_discount_cost": 900, "new_customers_paid": 210, "new_customers_organic": 0 }, "influencer": { "media_spend": 15000, "agency_fees": 3000, "marketing_tech_costs": 400, "marketing_payroll_allocated": 2500, "first_order_discount_cost": 2200, "new_customers_paid": 180, "new_customers_organic": 30 } } }, { "period": "2025-Q4", "channels": { "paid_social": { "media_spend": 51000, "agency_fees": 5500, "marketing_tech_costs": 1200, "marketing_payroll_allocated": 8000, "first_order_discount_cost": 4200, "new_customers_paid": 325, "new_customers_organic": 88 }, "google_search": { "media_spend": 34000, "agency_fees": 2500, "marketing_tech_costs": 800, "marketing_payroll_allocated": 4500, "first_order_discount_cost": 980, "new_customers_paid": 215, "new_customers_organic": 0 }, "influencer": { "media_spend": 18500, "agency_fees": 3200, "marketing_tech_costs": 400, "marketing_payroll_allocated": 2500, "first_order_discount_cost": 2700, "new_customers_paid": 172, "new_customers_organic": 28 } } } ] }
{
"context": "Tests whether the agent uses a discounted cash flow approach for LTV prediction, produces confidence intervals alongside point estimates, clearly distinguishes observed from extrapolated LTV, models subscription and transactional customers separately, and includes a validation framework for comparing predictions to actuals.",
"type": "weighted_checklist",
"checklist": [
{
"name": "DCF LTV formula",
"max_score": 12,
"description": "LTV prediction uses a discounted cash flow formula where each period's margin is discounted by (1+r)^t, with a discount rate parameter (not an undiscounted simple sum)"
},
{
"name": "Survival/churn factor",
"max_score": 10,
"description": "The DCF LTV model applies a survival or retention factor per period — specifically (1 - churn_rate)^(t-1) or equivalent — to account for customer attrition over time"
},
{
"name": "Confidence interval output",
"max_score": 12,
"description": "LTV predictions include a confidence interval or uncertainty range (e.g., lower bound, upper bound, or +/- error margin) alongside the point estimate"
},
{
"name": "Separate subscription model",
"max_score": 10,
"description": "LTV for subscription customers is modeled using a distinct approach from transactional customers (e.g., using contracted MRR/ARR, different churn methodology, or separate function/class)"
},
{
"name": "Separate transactional model",
"max_score": 8,
"description": "LTV for transactional customers explicitly accounts for variable purchase frequency (e.g., purchases per year, order frequency) rather than a fixed monthly payment"
},
{
"name": "Observed vs extrapolated disclosure",
"max_score": 10,
"description": "The output clearly distinguishes how many months of LTV are based on observed actuals versus model extrapolation (e.g., 'observed: 12 months, extrapolated: months 13-36')"
},
{
"name": "Data horizon warning",
"max_score": 8,
"description": "The solution warns or flags when the LTV forecast horizon significantly exceeds the available data history (e.g., projecting 36 months when only 12-18 months of data exist)"
},
{
"name": "Prediction vs actuals validation",
"max_score": 10,
"description": "The solution includes a validation step that compares prior LTV predictions against actual observed cumulative margins for cohorts that have aged sufficiently"
},
{
"name": "Prediction error recalibration",
"max_score": 10,
"description": "The validation output computes prediction error (e.g., % error or absolute difference between predicted and actual LTV) and suggests or applies recalibration"
},
{
"name": "Contribution margin basis",
"max_score": 10,
"description": "LTV predictions are denominated in contribution margin or gross profit, NOT gross revenue"
}
]
}
LTV Forecasting Model for Investor Due Diligence
Problem/Feature Description
Elevate Commerce is a hybrid ecommerce company with two customer segments: subscribers who pay $29/month for a curated product box, and one-time transactional buyers who purchase irregularly based on seasonal promotions. The company is preparing for a growth equity raise and their lead investor has asked for a defensible LTV model as part of due diligence. In a prior preliminary meeting, the investor specifically called out that most DTC companies "make up" their LTV numbers by projecting far beyond their data, and that they want to see the methodology clearly documented.
The company has 24 months of transaction data for subscribers and 18 months for transactional customers. The Head of Finance wants a Python-based LTV model that produces credible, investor-ready forecasts — one that a skeptical investor could scrutinize and trust. The model must include a validation mechanism using historical cohort predictions already in the data so the Finance team can demonstrate the model's track record and reliability.
Output Specification
Write a Python script (ltv_model.py) that reads the provided input data and produces a JSON report (ltv_report.json) containing:
- LTV predictions for both subscriber and transactional customer segments at the 12, 24, and 36 month horizons
- A validation section comparing prior LTV predictions (provided in the input) against actual cohort outcomes
- A summary of model performance and recommendations for improvement
Print a human-readable summary to stdout and write full results to ltv_report.json.
Input Files
The following files are provided as inputs. Extract them before beginning.
=============== FILE: inputs/model_inputs.json =============== { "subscribers": { "segment": "subscription", "monthly_revenue_per_customer": 29.00, "contribution_margin_rate": 0.52, "monthly_churn_rate": 0.045, "data_months_available": 24, "discount_rate_annual": 0.10, "cohort_size": 280 }, "transactional": { "segment": "transactional", "avg_order_value": 87.50, "purchases_per_year": 2.8, "gross_margin_rate": 0.43, "annual_churn_rate": 0.38, "data_months_available": 18, "discount_rate_annual": 0.10, "cohort_size": 640 }, "prior_predictions": [ { "cohort": "2023-Q1", "segment": "subscription", "predicted_ltv_12m": 148.00, "actual_cumulative_margin_12m": 131.50, "months_observed": 12 }, { "cohort": "2023-Q1", "segment": "transactional", "predicted_ltv_12m": 95.00, "actual_cumulative_margin_12m": 88.20, "months_observed": 12 }, { "cohort": "2023-Q2", "segment": "subscription", "predicted_ltv_12m": 152.00, "actual_cumulative_margin_12m": 127.80, "months_observed": 12 }, { "cohort": "2023-Q3", "segment": "subscription", "predicted_ltv_12m": 155.00, "actual_cumulative_margin_12m": 119.40, "months_observed": 12 }, { "cohort": "2023-Q3", "segment": "transactional", "predicted_ltv_12m": 98.00, "actual_cumulative_margin_12m": 82.60, "months_observed": 12 } ] }
{
"name": "finsi/unit-economics-tracking",
"version": "0.1.0",
"summary": "Track customer acquisition cost, lifetime value, payback period, and contribution margin by cohort and channel with profitability benchmarks and trend analysis",
"skills": {
"unit-economics-tracking": {
"path": "SKILL.md"
}
}
}