预算分配与 LTV 驱动投放
广告预算不是"平均分"——按渠道 ROAS、按客户 LTV、按产品利润率来动态分配预算,才能最大化整体回报。
预算分配决策树
graph TB
A[总预算] --> B{渠道 ROAS}
B -->|ROAS > 3| C[扩量 +30%]
B -->|ROAS 1-3| D[维持]
B -->|ROAS < 1| E[缩量/暂停]
C --> F{利润率检查}
F -->|毛利率 > ACOS| G[继续扩量]
F -->|毛利率 < ACOS| H[回调出价]
D --> I[A/B 测试优化]
E --> J[分析原因后决策]
style A fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style C fill:#c8e6c9,stroke:#43a047,stroke-width:2px
style E fill:#ffcdd2,stroke:#e53935,stroke-width:2px
预算分配优化器
from dataclasses import dataclass
@dataclass
class ChannelPerformance:
channel: str
spend: float
revenue: float
conversions: int
@property
def roas(self) -> float:
return self.revenue / self.spend if self.spend > 0 else 0
@property
def cpa(self) -> float:
return self.spend / self.conversions if self.conversions > 0 else 0
class BudgetAllocator:
"""基于 ROAS 的预算分配器"""
def __init__(self, total_budget: float, min_roas: float = 1.5):
self.total_budget = total_budget
self.min_roas = min_roas
def allocate(
self, channels: list[ChannelPerformance]
) -> list[dict]:
"""按 ROAS 加权分配预算"""
# 过滤掉 ROAS 低于最低标准的渠道
active = [c for c in channels if c.roas >= self.min_roas]
paused = [c for c in channels if c.roas < self.min_roas]
if not active:
return [{"channel": c.channel, "action": "全部暂停", "budget": 0}
for c in channels]
# ROAS 加权分配
total_roas = sum(c.roas for c in active)
allocations = []
for c in active:
weight = c.roas / total_roas
budget = round(self.total_budget * weight, 2)
change = budget - c.spend
pct_change = (change / c.spend * 100) if c.spend > 0 else 0
allocations.append({
"channel": c.channel,
"current_spend": c.spend,
"new_budget": budget,
"change": f"{change:+.0f} ({pct_change:+.1f}%)",
"roas": round(c.roas, 2),
"action": "扩量" if change > 0 else "缩量",
})
for c in paused:
allocations.append({
"channel": c.channel,
"current_spend": c.spend,
"new_budget": 0,
"change": f"-{c.spend:.0f} (-100%)",
"roas": round(c.roas, 2),
"action": "暂停",
})
return allocations
# 使用示例
channels = [
ChannelPerformance("Google Search", 3000, 12000, 60),
ChannelPerformance("Facebook", 5000, 10000, 80),
ChannelPerformance("TikTok", 2000, 1500, 30),
ChannelPerformance("Shopee Ads", 1000, 4000, 40),
]
allocator = BudgetAllocator(total_budget=10000, min_roas=1.5)
for a in allocator.allocate(channels):
print(f"{a['channel']}: {a['action']} | ROAS={a['roas']} | "
f"预算 {a['current_spend']}→{a['new_budget']} {a['change']}")
客户 LTV 驱动出价
from dataclasses import dataclass
@dataclass
class CustomerCohort:
"""客户群组"""
segment: str
avg_first_order: float
repeat_rate: float # 复购率 %
avg_orders_12m: float # 12个月内平均订单数
avg_order_value: float
@property
def ltv_12m(self) -> float:
"""12 个月客户终身价值"""
return self.avg_order_value * self.avg_orders_12m
@property
def max_cpa(self) -> float:
"""最高可接受 CPA(LTV 的 30%)"""
return self.ltv_12m * 0.30
# 不同客户群的 LTV 差异决定出价策略
COHORTS = [
CustomerCohort("新客-高频", 150, 45, 5.2, 180),
CustomerCohort("新客-低频", 80, 15, 1.3, 90),
CustomerCohort("回头客", 120, 70, 8.5, 160),
CustomerCohort("沉睡客户", 100, 10, 1.1, 85),
]
print(f"{'群组':<12} {'LTV-12M':>10} {'最高CPA':>10}")
print("-" * 35)
for c in COHORTS:
print(f"{c.segment:<12} ¥{c.ltv_12m:>8,.0f} ¥{c.max_cpa:>8,.0f}")
预算分配最佳实践
| 维度 | 推荐方式 | 避免 |
|---|---|---|
| 渠道分配 | ROAS 加权 | 平均分配 |
| 调整频率 | 周度调整 | 每天改来改去 |
| 测试预算 | 总预算 10-20% | 不留测试预算 |
| 新渠道 | 先小额测试 3-4 周 | 大额直接投入 |
| LTV 出价 | 按客户群差异出价 | 统一 CPA 目标 |
| 季节性 | 大促前 2 周加量 | 平时和大促同预算 |
本章小结
- ROAS 加权分配——高回报渠道拿更多预算,低回报暂停
- 最低 ROAS 门槛——低于 1.5x 的渠道直接暂停
- LTV 决定 CPA 上限——高复购客群可以接受更高获客成本
- 10-20% 测试金——总预算留一部分给新渠道和新创意
- 周度调优——数据够了再动手,避免日频操作噪声干扰
下一章:自动出价与创意生成