고객 생애가치(Customer Lifetime Value, CLV)는 고객이 회사와의 관계 동안 생성하는 총 가치를 나타내는 지표입니다. 구글 스프레드시트를 사용하여 고객의 생애가치를 계산하는 방법은 다음과 같습니다:

스프레드시트 열 만들기: 스프레드시트의 첫 번째 열에는 고객의 고유 식별자, 이름 또는 ID와 같은 정보를 입력합니다. 두 번째 열부터는 해당 고객의 구매 기록, 결제 금액, 구매 날짜 등의 데이터를 입력합니다.

평균 구매 금액 계산: 평균 구매 금액은 해당 고객이 회사에서 평균적으로 얼마를 소비하는지를 나타냅니다. 구매 금액 열의 데이터를 사용하여 각 고객의 평균 구매 금액을 계산합니다.

구매 빈도 계산: 고객의 구매 빈도는 회사에서 고객이 평균적으로 얼마나 자주 구매하는지를 나타냅니다. 구매 날짜 열의 데이터를 사용하여 각 고객의 구매 빈도를 계산합니다.

고객 생애 기간 계산: 고객 생애 기간은 해당 고객이 회사와 유지되는 평균 기간을 나타냅니다. 첫 번째 구매 날짜와 마지막 구매 날짜를 사용하여 각 고객의 생애 기간을 계산합니다.

생애가치 계산: 평균 구매 금액과 구매 빈도를 사용하여 각 고객의 연간 구매 금액을 계산합니다. 그런 다음, 연간 구매 금액을 고객 생애 기간으로 곱하여 고객의 생애가치를 계산합니다.

총 생애가치 합산: 모든 고객의 생애가치를 합산하여 회사의 전체 고객 생애가치를 계산합니다.

 

스프레드시트 고객생애가치 템플릿

https://docs.google.com/spreadsheets/d/1jzYlupssRB9vSNbcSgvnu-cbfsRWyATjNnCSCPUViVM/edit?usp=sharing 

 

LifeTimeValue

시트1 Customer ID,Amount,Customer ID,Avg Order Size,Avg Order Frequency,Avg Customer Value,Avg Customer Lifespan (months),Customer Lifetime Value ********,2023-12-01,₩1,408,000,0001,₩1,268,300,1.17%,₩14,834,3,₩42,029 ********,2023-12-01,₩767,25

docs.google.com

실제 고객 데이터를 기반으로 고객의 생애가치를 계산해본 결과 입니다.

 

고객생애가치를 계산하면 좋은 점

LTV(Lifetime Value) 계산은 기업과 브랜드에 다양한 이점을 제공합니다. 이를 통해 기업은 고객의 가치를 정량화하고 고객을 효과적으로 관리할 수 있으며, 브랜드에 도움이 되는 이유는 다음과 같습니다.

고객 관리 및 유지: LTV 계산은 기업이 고객을 효과적으로 관리하고 유지하는 데 도움을 줍니다. 고객이 회사와의 관계 동안 생성하는 가치를 파악하면, 기업은 이를 바탕으로 개별 고객에게 맞춤형 서비스와 마케팅 전략을 구축할 수 있습니다. 더불어 LTV는 고객 이탈 가능성을 예측하는 데도 도움이 되어, 이탈 가능성이 높은 고객에게 개별적인 대응을 할 수 있습니다.

마케팅 예산 최적화: LTV 계산은 마케팅 예산을 효율적으로 분배할 수 있는 기준을 제공합니다. 고객마다 다른 LTV를 가지고 있으므로, 기업은 고객 그룹별로 마케팅 예산을 할당하여 최대한의 효과를 얻을 수 있습니다. 예를 들어, 높은 LTV를 가진 고객 그룹에 집중적으로 마케팅을 진행하면 ROI(투자수익률)를 높일 수 있습니다.

고객 가치 기반의 의사 결정: LTV는 기업이 전략적인 의사 결정을 내리는 데 도움을 줍니다. 기업은 LTV를 분석하여 어떤 고객이 가장 가치 있는지, 어떤 제품이 가장 수익성이 높은지 등을 파악할 수 있습니다. 이를 통해 제품 라인업 개발, 가격 정책, 고객 서비스 개선 등 다양한 영역에서 더 나은 결정을 내릴 수 있습니다.

브랜드 강화와 고객 충성도: LTV 계산은 고객 충성도를 분석하는 데도 활용됩니다. 고객이 오랫동안 회사와의 관계를 유지하고 추가 구매를 해주는 경우, 브랜드에 대한 충성도가 높은 것으로 해석할 수 있습니다. 이를 통해 기업은 충성도가 높은 고객을 보다 효과적으로 유지하고, 브랜드 이미지를 강화할 수 있습니다.

경쟁 우위 확보: LTV 계산은 경쟁 우위를 확보하는 데에도 도움을 줍니다. 경쟁사보다 더 높은 LTV를 가진 고객을 유지하고 확보함으로써, 기업은 경쟁력을 강화하고 시장 점유율을 높일 수 있습니다. 이는 브랜드의 장기적인 성장과 영향력 확대에 도움을 줍니다.

이러한 이유로 LTV 계산은 브랜드에 많은 가치를 제공합니다. 기업은 고객 관리와 마케팅 전략을 LTV에 기반하여 최적화할 수 있으며, 고객의 가치를 식별하여 그에 맞는 서비스와 경험을 제공함으로써 브랜드의 성장과 발전을 이끌어낼 수 있습니다.

 

LTV 계산식 만들기 (스프레드시트 LTV 무료 코드)

// Row indices.

/**
 * Groups customers by their ID calculates
 * customer lifetime value for each.
 * 
 * @param {Any[][]} rows - array of customer ID, date, amount.
 * 
 * @returns {Any[][]} - table, each row containing:
 *    - average order size
 *    - avgOrderFrequency,
 *    - avgCustomerValue,
 *    - avgCustomerLifespan,
 *    - customerLifetimeValue,
 *    - map of id:orders
 */
function LIFETIME_VALUES(rows) {
  // Group all the orders per customer ID.
  // After this we get all the customers with a list of all
  // their associated orders.
  let ordersPerCustomer = groupByKey(rows
      // Keep only rows that don't have a blank customer ID.
      .filter(row => !!row[CUSTOMER_ID])
      // Create [key, value] pairs using the customer ID as key.
      .map(row => [row[CUSTOMER_ID], {
        date: row[DATE],
        amount: row[AMOUNT],
      }]));

  return ordersPerCustomer
      // Create objects from the [key, value] pairs.
      .map(keyValue => ({
        id: keyValue[0],
        orders: keyValue[1],
      }))
      // Calculate the values we need and return an array of
      // the columns to populate per element.
      .map(customer => {
        let totalRevenue = customer.orders
            // Get the `amount` field from each order.
            .map(order => order.amount)
            // Sum all the amounts.
            .reduce((result, amount) => result + amount);

        let datesRange = customer.orders
            // 각 주문에서 'date' 필드를 가져옵니다.
            .map(order => order.date)
            // 각 날짜를 비교하고 최소값과 최대값을 할당합니다.
            // 날짜 대신 {first: ..., last: ...} 형식의 객체를 반환해야 하므로,
            // 초기 값을 명시적으로 설정해야 합니다.
            .reduce((result, date) => ({
              first: result.first ? (date < result.first ? date : result.first) : date,
              last: result.last ? (date > result.last ? date : result.last) : date,
            }), {first: null, last: null});

        let totalMonths = (new Date(datesRange.last) - new Date(datesRange.first)) / MILLISECONDS_IN_MONTH;

        // Calculate the values we are interested in.
        let avgOrderSize = totalRevenue / customer.orders.length;
        let avgOrderFrequency = customer.orders.length / ordersPerCustomer.length;
        let avgCustomerValue = avgOrderSize * avgOrderFrequency;
        let avgCustomerLifespan = totalMonths;
        let customerLifetimeValue = avgCustomerValue * avgCustomerLifespan;

        // Returning an array makes the custom function to fill multiple cells
        // instead of a single cell.
        // In this case, we are returning one array for every order in
        // `ordersPerCustomer`, so the custom function fills a 2D matrix of cells.
        // User must create these headers manually in the spreadsheet in this order.
        return [
          customer.id,
          avgOrderSize,
          avgOrderFrequency,
          avgCustomerValue,
          avgCustomerLifespan,
          customerLifetimeValue,
        ]
      });
}