广告技术系列(六):计费与预算控制
前五篇建立了广告技术的完整认知框架:商业逻辑、交易机制、数据基建、度量优化、聚合变现。但贯穿这一切的"钱"的问题——广告费用是怎么计算的、预算是怎么花出去的、最终如何结算到各方口袋——始终是一条隐藏的主线。本篇专门拆解这条主线。
计费不只是"事后算账",它是广告系统的实时约束:每一次竞价决策都受预算余额限制,每一次扣费都影响后续投放策略,预算控速的精度直接决定了广告主的投放效率和媒体的变现质量。计费系统的工程复杂度,远超大多数人的预期。
一、计费模型演进:从买时间到买效果
广告计费模型的演进,本质上是风险在广告主与媒体之间的重新分配。
CPT / CPD:买广告位的时间
最早的在线广告计费方式直接沿用了线下媒体的逻辑——按时间售卖广告位。CPT(Cost Per Time)按时间段计费,CPD(Cost Per Day)按天计费。广告主花钱买下某个页面某个位置在某段时间内的独占展示权,无论这段时间内有多少用户访问、点击了多少次,费用固定不变。
这种模式对媒体极为有利:收入确定,无需承担流量波动风险。对广告主而言风险最高:如果某天媒体流量骤降,广告主仍要按约付费。
CPM:按展示付费,引入流量计量
CPM(Cost Per Mille,千次展示费用)将计费粒度从"时间段"细化到"展示次数",媒体开始对流量进行计量。广告主按实际曝光量付费,计费公式为:
费用 = 展示次数 / 1000 × CPM 出价
CPM 模式将流量质量风险部分转移给了广告主——广告展示给了多少人、效果如何,是广告主自己的问题。媒体只负责提供展示机会,不保证效果。
CPM 至今仍是品牌广告的主流计费方式,特别适合以提升曝光、品牌认知为目标的投放场景。
CPC:按点击付费,效果导向的第一步
CPC(Cost Per Click)将扣费时机后移到用户点击动作。只有用户真正点击广告,才会产生费用:
费用 = 点击次数 × CPC 出价
CPC 看似对广告主更友好,但并非免费的午餐。媒体为了对冲风险,会在内部将 CPC 出价换算成预期 CPM 进行排序(eCPM = CPC × 预期点击率 × 1000),点击率低的广告会在竞价中系统性地处于劣势,倒逼广告主优化创意质量。
CPC 的典型应用场景是搜索广告和效果类信息流广告——用户有明确意图,点击代表真实兴趣。
CPA / CPS / CPL:按转化付费,效果闭环
CPA(Cost Per Action)将计费进一步推迟到用户完成特定转化动作,如下载 App、注册账号、完成购买等。变体形式包括 CPS(Cost Per Sale,按销售额抽佣)和 CPL(Cost Per Lead,按获取线索计费)。
| 模型 | 计费触发点 | 典型场景 | 媒体承担的风险 |
|---|---|---|---|
| CPM | 广告展示 | 品牌曝光 | 低(只提供展示) |
| CPC | 用户点击 | 搜索广告、信息流 | 中(要有人点) |
| CPA | 用户转化 | App 推广、电商 | 高(转化漏斗全在广告主侧) |
| CPS | 产生销售 | 电商联盟、导购 | 极高(依赖商品和价格竞争力) |
纯 CPA 模式对媒体风险极高——广告主的落地页质量、商品竞争力都在媒体控制范围之外,转化率完全不可控。因此主流平台很少做纯 CPA,而是演化出了 oCPX 智能计费体系。
oCPX:智能计费,风险重新分担
oCPX(Optimized Cost Per X)是当前主流效果广告平台的核心计费机制,代表形态包括:
- oCPM:广告主设定目标 CPA 出价,系统以 CPM 形式计费,但承诺优化转化成本
- oCPC:广告主设定目标 CPA,系统以 CPC 形式计费,系统负责预测高转化概率的点击
- oCPA:广告主直接设定期望的每次转化成本,系统自动优化出价和定向
oCPX 的核心逻辑是:广告主告诉系统"我愿意为一次转化付多少钱",系统负责把这个目标翻译成每次竞价的具体出价。媒体和广告主通过"智能出价算法"共担风险,同时利益绑定——系统优化得越好,双方收益越高。
计费模型的演进,是广告行业从"卖流量"到"卖效果"的缩影。oCPX 让广告主可以直接描述商业目标,系统自动完成从目标到出价的转换。
二、计费公式与扣费时机
次价扣费(GSP):实际支付低于出价
在公开竞价环境中,广告主的实际扣费通常不等于其出价,而是采用广义第二价格(GSP,Generalized Second Price)机制。
胜出者按照第二名的出价加一个最小价格单位(如 $0.01)扣费:
实际扣费 = 第二名 eCPM / 胜出者质量系数 + $0.01
GSP 机制的理论基础是:它在保证媒体收入的同时,激励广告主真实出价(出价越真实,系统效率越高)。但 GSP 并非真正的"最优机制"——在多次博弈中,广告主有动机压低出价,因此部分平台已转向 VCG(Vickrey-Clarke-Groves)拍卖,在理论上使真实出价成为最优策略。
不同计费模型的扣费时机
| 计费模型 | 扣费触发事件 | 最小计费单位 | 典型延迟 |
|---|---|---|---|
| CPM | 广告展示确认(Win Notice) | 1 次展示 | < 1 秒 |
| CPC | 用户点击(Click Tracking 回调) | 1 次点击 | 秒级 |
| CPA | 转化事件上报(Postback / SDK 回调) | 1 次转化 | 分钟~小时级 |
| oCPX | 展示时按模型预测扣费,转化数据用于后验校准 | 1 次展示 | 实时 + 异步校准 |
CPA 的延迟扣费带来了一个工程挑战:在转化确认之前,预算系统无法精确知道这笔钱最终会不会被扣。系统需要基于历史转化率对"待确认扣费"进行预估,并在预算控制中保留相应的缓冲。
计费精度与争议
在高并发的竞价环境中,每天有数十亿次广告展示,每次都需要精确计费和预算扣减。计费精度问题主要来自两个方面:
时钟精度:分布式系统中,多台机器的时钟可能存在毫秒级偏差。在计费记录中,需要使用逻辑时钟或中心化时间戳来保证计费日志的顺序一致性。
重复计费防护:网络超时、重试机制可能导致同一次展示事件被重复上报。计费服务需要对每个 impression_id 进行幂等性校验,确保同一次展示只被扣费一次。
三、预算管理:控速与防超投
预算管理是广告计费系统中工程复杂度最高的部分。核心挑战在于:如何在保证广告主"花完预算"的同时,避免超投(花超了),并让消耗节奏符合预期。
日预算与总预算
广告主通常在两个维度设置预算上限:
| 预算类型 | 定义 | 用途 |
|---|---|---|
| 日预算 | 单日最大消耗金额 | 控制每天的花费节奏,避免某天异常爆量 |
| 总预算 | 整个投放期的最大消耗 | 控制活动总投入,常见于固定预算的营销活动 |
| 小时预算 | 部分平台支持按小时设置 | 精细化控制分时消耗,适合时段敏感的场景 |
两类预算共同约束每次竞价决策:系统在发起竞价前,需要同时检查日预算余额和总预算余额,任一耗尽即停止竞价。
控速策略:匀速消耗 vs 加速消耗
匀速消耗(Standard / Smooth Pacing) 是大多数广告主的默认选择。系统会在一天内均匀分配预算,确保全天都有广告展示,避免预算在上午就全部耗完、下午完全停止投放。
匀速消耗的工程实现通常基于令牌桶算法(Token Bucket):将日预算折算为按时间均匀补充的"令牌",每次竞价消耗对应金额的令牌,令牌耗尽时暂停竞价,等待下一轮补充。
# 令牌桶控速的核心逻辑(伪代码)
class BudgetTokenBucket:
def __init__(self, daily_budget, refill_interval_seconds=60):
self.capacity = daily_budget
self.tokens = daily_budget
self.refill_rate = daily_budget / (24 * 3600 / refill_interval_seconds)
self.last_refill_time = now()
def try_consume(self, amount) -> bool:
self.refill()
if self.tokens >= amount:
self.tokens -= amount
return True # 允许竞价
return False # 暂停竞价
def refill(self):
elapsed = now() - self.last_refill_time
self.tokens = min(self.capacity, self.tokens + elapsed * self.refill_rate)
self.last_refill_time = now()
加速消耗(Accelerated Pacing) 则允许系统尽可能快地花完预算,通常用于时间紧迫的活动(如双 11 当天的冲量投放)或广告主明确希望优先抢占高流量时段的场景。
| 维度 | 匀速消耗 | 加速消耗 |
|---|---|---|
| 全天覆盖 | 是,均匀分布 | 否,可能上午耗尽 |
| 峰值流量利用 | 部分错过(有速率限制) | 充分利用 |
| 适用场景 | 品牌广告、长期投放 | 大促冲量、抢占黄金时段 |
| 超投风险 | 低 | 高(需更严格的防超投机制) |
分布式环境下的预算控制挑战
单机环境下,预算检查和扣减可以通过本地内存原子操作完成。但在日均数亿次请求的广告系统中,竞价决策分布在数百台服务器上,预算状态必须在多机之间保持一致。
常见架构方案是中心化 Redis + 本地缓存的双层结构:
| 层级 | 实现 | 更新频率 | 精度 |
|---|---|---|---|
| 本地缓存 | 每台机器维护当前周期的可用预算份额 | 每隔 N 秒向 Redis 同步 | 略低(允许小幅超投) |
| 中心 Redis | 存储全局预算余额,支持原子 DECR 操作 | 实时 | 高 |
| 数据库 | 持久化预算消耗记录,用于对账 | 异步批量写入 | 权威 |
本地缓存允许一定程度的"超分配"(例如允许 2% 的超投容忍),换取对 Redis 请求量的大幅降低。对于日预算 10 万元的投放计划,2% 的超投不超过 2000 元,通常在可接受范围内。
防超投的工程保障
超投(Overspend)指实际消耗超过预算上限,是广告平台的严重事故——平台需要向广告主退还超额部分,并可能损害信任关系。防超投的核心措施包括:
乐观锁 + 版本号:对预算扣减操作加版本约束,拒绝并发导致的重复扣减。
熔断机制:当检测到某个广告计划的消耗速率异常(如突然是正常速率的 10 倍),自动暂停并触发人工审核。
超投补偿:即使采取了所有预防措施,分布式系统的最终一致性属性决定了少量超投不可避免。平台通常在日结算时检测超投金额,自动转为下期抵扣或直接退款。
预算控制的核心矛盾是:强一致性要求高中心化通信,高并发要求低延迟决策。令牌桶 + 分层缓存是业界在两者之间取得平衡的标准方案。
四、出价策略:从手动到智能
手动出价:直接控制,适合精细运营
广告主直接指定每次展示/点击/转化愿意支付的价格。这要求广告主对自身业务的转化价值有深入理解,适合经验丰富的投放团队或有精确 ROI 测算的场景。
手动出价的优点是完全可控、透明,缺点是需要持续人工干预——当竞争格局、流量结构发生变化时,出价需要及时调整,否则会出现"出价过高导致亏损"或"出价过低导致量级不足"的问题。
自动出价:系统优化,ROI 导向
自动出价是当前主流效果广告的核心能力,其本质是将广告主的商业目标转化为竞价策略。
| 出价方式 | 广告主设定 | 系统优化目标 | 适用场景 |
|---|---|---|---|
| 目标 CPA 出价 | 期望每次转化成本 | 在不超过目标 CPA 的前提下最大化转化量 | App 下载、注册、购买 |
| 目标 ROAS 出价 | 期望广告投入产出比 | 在满足 ROAS 目标的前提下最大化收入 | 电商、游戏内购 |
| 最大化转化量 | 预算上限 | 在预算范围内获取尽可能多的转化 | 新客拉新、规模优先 |
| 最大化点击量 | 预算上限 | 在预算范围内获取尽可能多的点击 | 品牌导流、内容推广 |
智能出价的算法框架
以目标 CPA 出价为例,系统的决策链路是:
- 转化率预测:给定当前请求的用户特征、广告素材和上下文,预测用户的转化概率
pCVR - 出价计算:
竞价出价 = 目标CPA × pCVR × 调节系数 - 预算感知调节:根据当前预算消耗速率,动态调整调节系数(消耗慢时提高出价抢量,消耗快时降低出价控速)
- 后验校准:将实际转化数据回流,持续优化转化率预测模型
这一闭环将广告系统从"交易撮合平台"升级为"业务效果优化引擎"——平台不再只是提供展示机会,而是对广告主的转化成本负责。
出价策略的"冷启动"问题是智能出价面临的核心挑战:新广告计划缺乏历史转化数据,模型无法准确预测转化率。常见解法是"探索 - 利用"(Explore-Exploit)机制,在冷启动阶段主动为新计划分配一定比例的探索流量,积累足够的转化样本后再切入正式优化。
五、计费系统的工程架构
关键路径:竞价到扣费的完整链路
一次广告展示从请求到扣费的完整流程:
| 步骤 | 动作 | 延迟要求 |
|---|---|---|
| 1. 广告请求 | 媒体/App 发起展示请求 | — |
| 2. 预算检查 | 查询 Redis 余额,判断是否允许竞价 | < 2ms |
| 3. 竞价决策 | 出价计算、eCPM 排序 | < 10ms |
| 4. 胜出通知 | 媒体确认展示,发送 Win Notice | < 50ms |
| 5. 计费触发 | 根据计费模型判断扣费时机 | — |
| 6. 余额扣减 | Redis DECR 原子操作 | < 2ms |
| 7. 计费日志 | 异步写入计费流水 DB | 异步,< 1s |
| 8. 预算同步 | 定期将 Redis 消耗同步到数据库 | 每分钟批量 |
步骤 2 和步骤 6 是计费系统的关键路径,对延迟要求极高。Redis 的原子 DECR 操作保证了并发安全,单次操作延迟通常在 0.5ms 以内。
计费幂等性保障
在分布式环境中,网络超时和重试是常态。计费服务必须保证幂等性:同一次展示事件,无论触发几次回调,只扣费一次。
实现方式:每次展示生成全局唯一的 impression_id,计费服务在处理前检查该 ID 是否已处理(Redis SET NX 或数据库唯一索引),已处理则直接返回成功、不重复扣费。
六、结算体系:从广告主到媒体的完整链路
计费是实时的,结算是周期性的。两者之间存在时间差,这段时间内的资金流转需要一套完整的对账和结算体系来保障。
广告主结算:预付与后付
| 结算模式 | 说明 | 适用场景 | 风险控制 |
|---|---|---|---|
| 预付充值 | 广告主先充值,消耗时实时扣余额 | 中小广告主、新客 | 余额耗尽自动停投,平台零坏账风险 |
| 授信后付 | 先投放,月底或账期末统一结算 | 大客户、框架合同 | 需信用评估,存在坏账风险 |
| 混合模式 | 部分预付保证金 + 超出部分后付 | 头部广告主 | 平衡双方需求 |
国内主流平台(如字节、腾讯)普遍采用预付充值模式,资金风险最低,但对大客户投放灵活性有一定影响。海外 Google/Meta 对大客户提供月结授信,坏账率通过信用评估和自动扣款协议控制在极低水平。
媒体分成与账期
媒体从广告收入中按分成比例获得收入,账期是媒体最关心的问题之一:
| 结算周期 | 说明 | 典型场景 |
|---|---|---|
| T+3 ~ T+7 | 每次结算 3-7 个工作日到账 | 头部联盟(如穿山甲、优量汇)对头部媒体 |
| 月结 | 每月结算上个月收入 | 中小媒体、联盟标准账期 |
| 周结 | 每周结算 | 部分平台对高质量媒体的激励 |
账期越短对媒体现金流越有利,但对平台的资金规划压力越大。聚合平台(如 Topon、MAX)通常在收到联盟分成后再向媒体结算,可能引入额外 1-2 个月的账期延迟。
结算差异处理
广告主账单与媒体结算之间不可避免存在差异,来源主要有:
| 差异来源 | 说明 | 处理方式 |
|---|---|---|
| 无效流量扣除 | 反欺诈审计后剔除的无效展示/点击 | 自动抵扣下期账单或退款 |
| 时区/日切差异 | 跨时区投放时,媒体与平台对"当天"的定义不同 | 双方约定统一基准时区 |
| 汇率波动 | 跨境结算时美元/人民币汇率差 | 按结算日汇率固定,或约定结算币种 |
| 第三方监测差异 | 广告主使用第三方监测数据与平台数据不一致 | 通常以平台数据为准,差异 > 10% 可申诉 |
七、反欺诈扣费:无效流量的识别与处理
广告欺诈是计费系统绕不开的问题。据行业估计,全球数字广告中约 10-25% 的展示和点击来自非人类流量(机器人、刷量工具、虚假应用)。
无效流量的识别
| 欺诈类型 | 识别信号 | 处理方式 |
|---|---|---|
| 机器人刷点击 | 点击间隔极短(< 1s)、IP 集中、UA 异常 | 实时拦截,不触发计费 |
| 点击洪水(Click Flooding) | 点击量远超展示量,点击/展示比异常高 | 事后审计,剔除归因 |
| SDK 欺诈(SDK Spoofing) | 伪造 App 内的安装/转化事件 | 设备指纹、安装验证 |
| 虚假展示 | 广告加载但不可见(iframe 堆叠、隐藏广告位) | 可见度检测(Viewability),不计费展示不满足 MRC 标准的 |
转化归因窗口
转化归因的时间窗口决定了哪些转化行为会被计入广告费用:
| 归因类型 | 典型窗口 | 说明 |
|---|---|---|
| 点击归因(Click-through) | 1-30 天 | 点击广告后 N 天内发生的转化归因给该广告 |
| 展示归因(View-through) | 1-7 天 | 看到广告(未点击)后 N 天内发生的转化 |
| 跨设备归因 | 与上述结合 | 手机上看广告,PC 上完成购买 |
归因窗口的长短直接影响广告费用:窗口越长,被归因到该广告的转化越多,CPA 账单越高。广告主通常倾向于短窗口(减少"自然转化"被错误归因的可能),平台倾向于长窗口(增加计费转化量)。iOS 的 SKAdNetwork 框架强制将归因窗口规范化,一定程度上减少了这种博弈空间。
八、系统全貌:计费在广告链路中的位置
回顾完整的广告技术链路,计费系统横跨多个环节,既是实时决策的约束条件,也是事后结算的依据:
| 链路环节 | 与计费的关系 |
|---|---|
| 竞价引擎(第二篇) | 出价受预算余额约束;次价扣费规则影响出价策略 |
| 用户定向(第三篇) | 精准定向提升转化率,直接影响 oCPX 系统的出价效率 |
| 度量体系(第四篇) | CPA、ROAS 等效果指标是智能出价的优化目标 |
| 聚合平台(第五篇) | 媒体分成结算依赖聚合平台的 eCPM 汇报,存在数据一致性挑战 |
计费系统的设计哲学是精准而非完美:在毫秒级竞价决策中,允许小幅预算超投换取低延迟;在转化归因上,接受不完美的归因模型但保证可审计;在结算对账上,通过差异阈值和补偿机制处理不可避免的数据偏差。这种"够用的精准"贯穿了整个系统的工程取舍。
广告计费系统是整个广告技术栈的财务底座,它连接了广告主的预算目标、媒体的变现诉求和平台的商业利益,是效果广告生态能够持续运转的关键基础设施。