Customer LTV Analysis in Snowflake by Acquisition Channel

Calculate customer lifetime value from Snowflake order data by acquisition channel and cohort, on a gross-margin basis, with fields, sample output and setup.

Summary

A customer LTV analysis in Snowflake sums each customer's gross profit over a fixed window, such as 12 or 24 months from their first order, and compares the averages by acquisition channel, first product or region. Fixed windows keep cohorts comparable; gross margin keeps LTV comparable with acquisition cost.

On this page
  1. Who this report is for
  2. What the report includes
  3. How to build it in Better Analyst from Snowflake
  4. Questions to ask
  5. Sample output
  6. Charts to use
  7. Keep it up to date
  8. Further reading
  9. FAQ

Who this report is for

Growth, finance and marketing analysts deciding where to spend acquisition budget, with order history and customer attributes in Snowflake.

What the report includes

Metrics and dimensions in this report
MetricSource fieldWhy it matters
CustomerFACT_ORDERS.CUSTOMER_ID (example schema)The unit LTV is calculated for.
First order dateCalculated: MIN(FACT_ORDERS.ORDER_DATE) per customerStarts each customer's LTV window.
Gross profitFACT_ORDERS.NET_REVENUE − FACT_ORDERS.COGS (example schema)LTV on gross profit is what you can compare with CAC.
Acquisition channelDIM_CUSTOMER.ACQUISITION_CHANNEL (example schema)The main lens for budget decisions.
12-month LTVCalculated: SUM(gross profit) within 365 days of first order ÷ customersA fixed window that every cohort old enough can be measured on.
Repeat rateCalculated: customers with 2+ orders in window ÷ customersExplains whether LTV differences come from repeat buying or order size.

How to build it in Better Analyst from Snowflake

  1. Create a dedicated Snowflake role and user with SELECT on the schemas you want to analyse (the Snowflake connector docs include the SQL).
  2. In Better Analyst, open Connectors, choose Add Connector, then Snowflake, and enter the account identifier, username, password, warehouse and database, plus an optional schema and role.
  3. Click Test Connection (the warehouse must be running) and save.
  4. Ask for 12-month gross-profit LTV by acquisition channel for customers whose first order was at least 12 months ago, with customer counts and repeat rate.

Questions to ask

  • “Calculate 12-month gross-profit LTV by acquisition channel for customers acquired in 2025.”
  • “Which first-purchased product leads to the highest 24-month LTV?”
  • “Compare LTV for customers acquired with and without a discount.”
  • “Show cumulative gross profit per customer by month since first order, by channel.”

Sample output

Sample data for illustration, not real account data.

Sample data: 12-month LTV by acquisition channel, 2025 cohorts (illustrative)
ChannelCustomersRepeat rate12-month gross profit12-month LTV
Organic search6,42034.1%$1,123,500$175.00
Paid social9,88021.6%$1,195,480$121.00
Referral2,15041.8%$451,500$210.00
Marketplace4,31015.2%$353,420$82.00

Charts to use

  • 12-month LTV by channel (Bar chart): Average gross-profit LTV per channel, sorted.
  • Cumulative gross profit curves (Line chart): How quickly each channel's customers accumulate value month by month.

Keep it up to date

Rerun the LTV table quarterly as a scheduled task; a Data Flow can write it to a Snowflake table so marketing dashboards and spreadsheets read the same numbers.

Further reading

Try Better Analyst free

Frequently asked questions

Why use a fixed 12-month window instead of lifetime?
Customers acquired last month have had less time to buy than those acquired two years ago. A fixed window measured only on cohorts old enough to complete it keeps channels comparable.
Should LTV use revenue or gross profit?
Use gross profit when comparing with acquisition cost; revenue LTV overstates what you can afford to spend.
What if acquisition channel isn't in Snowflake?
Join it from wherever it lives, for example a CRM export in Google Sheets, or use first-touch source from your web analytics, and document the rule in Data Context.