1. Lighthouse

Level 7 · LTV:CAC and payback

The request

From Laura Bennett, Head of Finance

“The board asks two questions about marketing every quarter: how many times over a customer repays what we spent to get them, and how many months it takes to earn the acquisition cost back. Can you answer both for the 2023 and 2024 cohorts?”

Your goal

Return one row per acquisition year (first_year 2023 and 2024 only; 2025 has no full first year yet) with: first_year, new_customers, cac (that year's total marketing spend / new_customers, rounded to 2), first_year_margin (margin per customer from orders placed within 365 days of the customer's first order, i.e. order_date < first_at + INTERVAL 365 DAY, rounded to 2), margin_to_date (all margin per customer through 2025, rounded to 2), ltv_to_cac (margin_to_date / cac, rounded to 2) and payback_months (cac / (first_year_margin / 12), rounded to 1). Per-customer values divide by new_customers. Use unrounded values in every formula. Sort by first_year. The starter's CTEs give first orders, margin per kept line and spend per year.

  • Read from the products tablenot done yet
  • Read from the orders tablenot done yet
  • Show exactly first_year new_customers cac first_year_margin margin_to_date ltv_to_cac payback_monthsnot done yet

Your query

SQL

Loading the editor…

    ResultPreview of products · press Run to see yours
    Preview of products
    product_idnamecategorysubcategoryunit_price
    101Vale Velvet LoveseatFurnitureSofas1659.00
    102Alder Oak Coffee TableFurnitureTables919.00
    103Orchard Rattan Dining ChairFurnitureChairs789.00
    104Upland Oak BookcaseFurnitureStorage429.00

    Mote checks your result

    Press Run. Each row that matches the goal becomes a firefly in your lantern.

    Tables

    Harbor & Pine store data, ready to query.

    products120 rows · 8 columns
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    First 5 rows of products
    product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
    101Vale Velvet LoveseatFurnitureSofas1659.00NULL2023-09-11true
    102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
    103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
    104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
    105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
    orders12,000 rows · 7 columns
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    First 5 rows of orders
    order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
    10011252023-01-01 20:51:19completedweb0.00NULL
    10021562023-01-02 07:58:46completedweb0.00NULL
    1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
    1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
    1005822023-01-02 11:43:36completedweb0.00WELCOME10
    order_items30,338 rows · 6 columns
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    First 5 rows of order_items
    order_item_idorder_idproduct_idquantityunit_pricediscount_pct
    11001121931.990.00
    21001154311.990.00
    31002154411.990.00
    410021941149.000.00
    51002193219.990.00
    returns1,673 rows · 5 columns
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    First 5 rows of returns
    return_idorder_item_idreturned_onreasonrefund_amount
    1142023-01-10damaged83.69
    2422023-01-10wrong_item19.99
    31052023-01-14wrong_item10.99
    4242023-01-16changed_mind26.99
    51262023-01-16late20.99
    marketing_spend3,276 rows · 3 columns
    • spend_datedate
    • channelvarchar
    • amountdecimal
    First 5 rows of marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13
    customers2,018 rows · 9 columns
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    First 5 rows of customers
    customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
    1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
    2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNULL
    3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNULL
    4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
    5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNULL
    employees60 rows · 8 columns
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    First 5 rows of employees
    employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
    1CatherineHaleExecutiveChief Executive OfficerNULL2016-03-01285000
    2RobertKimExecutiveChief Operating Officer12017-01-09235000
    3MeganCollinsSalesHead of Sales12018-04-16172000
    4ChloeGutierrezSalesAccount Executive32020-01-2172000
    5FrankBellSalesAccount Executive32023-05-2173000
    web_sessions40,000 rows · 7 columns
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    First 5 rows of web_sessions
    session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
    1NULL2023-01-01 23:02:24mobilepaid1false
    2182023-01-01 15:07:49desktoppaid1false
    3NULL2023-01-01 16:55:46desktopdirect7false
    4NULL2023-01-01 12:43:28mobileorganic3false
    5NULL2023-01-01 13:06:21mobilesocial2false

    The lesson

    Two questions about every customer you buy

    LTV:CAC compares what a customer is worth with what it cost to acquire them. A ratio of 3 means every dollar spent on acquisition comes back three times as margin. CAC payback asks how long that takes: the number of months of margin needed to earn back the acquisition cost.

    LTV:CAC        = margin LTV / CAC
    payback months = CAC / monthly margin per new customer

    Both use margin, not revenue. At the 2025 margin rate of 53.84%, a customer who keeps $1,000 of purchases leaves the store about $538 to pay for the ad that found them.

    Margin, by cohort

    Margin here is the discounted line value minus quantity * unit_cost, on valid lines of booked orders that were not returned. Nine products have no cost; their lines are left out. Per-customer numbers divide by the cohort’s size (everyone acquired that year), not only by customers who have margin lines.

    Monthly margin for payback comes from each customer’s first 365 days, divided by 12. Why the first year? Payback is about the early months, and every cohort can be compared over the same age. That is why 2025 is excluded: its customers have not had a full year yet.

    The result

    first_year  new_customers     cac  first_year_margin  margin_to_date  ltv_to_cac  payback_months
    2023                  574  665.84            1727.67         2995.81        4.50             4.6
    2024                  525  841.70            1020.11         1276.82        1.52             9.9

    Both cohorts pay back within a year. The 2023 cohort looks far stronger, for two reasons you have met before: it has had three years to buy instead of two, and it includes regulars who signed up before 2023 and only look new because the data starts then.

    Reading the ratio honestly

    The ratio uses margin to date, so it grows every month a cohort keeps buying. A young cohort with 1.52 is not a failure; compare cohorts at the same age, or use a predictive margin LTV (level 4) when you need a forward number. Also remember that blended CAC charges all spend, including email to existing customers, to new customers.

    Common mistakes

    • Revenue LTV over CAC. It overstates the ratio roughly twofold here, because about half of revenue pays for the products.
    • Joining spend to lines. Joining marketing_spend before aggregating repeats each spend row per match. Aggregate each input to one row per year first.
    • Dividing by customers with margin. A customer whose only order was returned still cost CAC.

    Interview note

    “What is a good LTV:CAC?” The textbook answer is about 3:1 with payback under 12 months. The better answer adds that it depends on the LTV definition and the age of the cohort.

    Pick what may run on this site. You can change this any time from "Cookie settings" at the bottom of every page.