P paper2skillsPlaybook
AI 路线图 →

DTC Customer Acquisition Attribution — 独立站全渠道获客归因:从首触到首单的因果追踪

Skill-DTC-Customer-Acquisition-Attribution · 06-增长模型

causalexperimentforecastingoptimization广告与投放客服与VOC推荐与搜索MAS与智能体工程WF-B 广告优化WF-C 客服分诊WF-H 复购增长WF-J DTC 独立站增长WF-L 内容营销增长
年化 ROI¥50-150 万
实现难度⭐⭐⭐☆☆
业务视角
适用角色CEO / 增长负责人 · CMO · 财务负责人
适用平台Amazon · TikTok Shop · DTC 独立站 · 多市场
什么情况下用公司增长放缓,不知道是市场饱和还是产品问题还是获客太贵;老板要 12 个月 GMV 预测,只能靠感觉
成功是什么样的建立增长拆解模型找到瓶颈,预测未来 6-12 个月营收区间,支撑融资/战略会议
业务痛点
增长放缓不知道问题在哪CAC 越来越高已经高于 LTV新市场要不要进没有数据支撑

1. 解决的问题

DTC独立站TikTok ROAS看起来亏损于是砍掉投放但整体流量随之崩塌——Shapley多触点因果归因揭示TikTok是Google搜索的上游触发器,正确预算分配后真实ROAS提升20-40%,年化保护GMV50-150万元

2. 核心算法逻辑

DTC 独立站的获客归因比 Amazon 更复杂:用户从 TikTok 看到广告 → Google 搜索品牌词 → 邮件召回 → 最终在独立站购买。LastClick 归因把全部功劳给邮件,导致砍掉 TikTok 预算后流量暴跌——却不知道原因。

3. 业务应用场景

业务问题:独立站月预算 $30K,TikTok $15K,Google $10K,Email $5K。GMO报告显示 TikTok ROAS 0.8(亏损),Google ROAS 4.2(盈利)。运营计划砍掉 TikTok——但这是 Last-Click 归因的错误判断,TikTok 实际上带来了大量首次曝光用户后来被 Google 转化。

数据要求: - 用户级别的触点序列(需要 UTM 参数 + 会话 ID 拼接) - 各渠道的曝光/点击/成本数据 - Shopify 订单数据(含订单 ID、用户 ID、时间戳)

预期产出: - Shapley 归因分配:各渠道真实边际贡献百分比 - 建议预算分配:基于因果 ROAS 而非 Last-Click ROAS - "切断后果"模拟:如果砍掉 TikTok,预测 Google 转化量会下降多少

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估
  • 避免错误砍掉 TikTok 等上漏斗渠道:保护月 GMV ¥30-100 万
  • 正确预算分配后真实 ROAS 提升 20-40%:月增利润 ¥5-20 万
  • 新市场进入渠道决策准确:节省 ¥5-20 万的试错成本
  • 年化综合 ROI:¥50-150 万
  • 实施难度:⭐⭐⭐☆☆(需要 UTM 埋点体系 + Shopify API;Shapley 计算约 2-3 周工程量)

7. 代码模板

代码块数量:2 · 路径:未检测到

"""
DTC Customer Acquisition Attribution
多触点因果归因:Shapley值 + 马尔可夫链模型
"""
import numpy as np
from itertools import combinations
from collections import defaultdict


def generate_dtc_journey_data(n_users=500, seed=42):
    """生成模拟 DTC 独立站用户触点路径数据"""
    np.random.seed(seed)
    channels = ['TikTok', 'Google_Brand', 'Google_NonBrand', 'Email', 'SEO', 'Direct']

    # 转化路径模板(模拟母婴独立站用户行为)
    path_templates = [
        (['TikTok', 'Google_Brand', 'Email'], 0.25),      # TikTok引流→品牌搜索→邮件转化
        (['Google_NonBrand', 'Google_Brand'], 0.20),       # 搜索意图驱动
        (['SEO', 'Email', 'Email'], 0.15),                 # SEO发现→邮件培育
        (['TikTok', 'TikTok', 'Google_Brand'], 0.15),    # 多次曝光→搜索
        (['Google_Brand'], 0.10),                           # 直接搜索转化
        (['Email'], 0.08),                                  # 直接邮件转化
        (['Direct'], 0.07),                                 # 直接访问
    ]

    journeys = []
    for i in range(n_users):
        rand = np.random.random()
        cump = 0
        for path, prob in path_templates:
            cump += prob
            if rand <= cump:
                # 加噪声变化
                actual_path = list(path)
                if np.random.random() < 0.2:
                    extra = np.random.choice(channels)
                    actual_path.insert(np.random.randint(0, len(actual_path)), extra)
                converted = np.random.random() < 0.15  # 15%转化率
                journeys.append({'user_id': f'U{i:04d}', 'path': actual_path, 'converted': converted})
                break

    return journeys


def shapley_attribution(journeys):
    """
    Shapley值多触点归因
    计算每个渠道在所有可能子集中的边际贡献
    """
    # 统计各渠道组合的转化率
    combo_conversions = defaultdict(lambda: {'conversions': 0, 'total': 0})

    for j in journeys:
        channels_set = frozenset(j['path'])
        combo_conversions[channels_set]['total'] += 1
        if j['converted']:
            combo_conversions[channels_set]['conversions'] += 1

    # 转化率函数
    def v(S):

8. 论文来源

  • 2312.09154