去年有个做工具类应用的朋友跑来问我:手上攒了几百万日活,一直靠接第三方联盟的分成过日子,每个月看着后台那条被抽走的分成曲线,心里痒——能不能自己搞一个广告联盟 APP,把中间那一层抽成变成自己的利润?这个问题我在不同场合被问过不下十次,问的人背景五花八门,有做内容社区的、有做小游戏的、也有做系统工具出海回来的。但真正动手的没几个,原因很简单:广告联盟 APP 搭建不是写个 SDK 那么简单,它本质上是把一条完整的广告交易链路塞进一个应用里,涉及流量、广告主、竞价、结算、风控、合规六个面。这篇东西我按自己踩过的路径拆一遍,讲清楚自建广告联盟到底在做什么、钱从哪来、系统怎么搭、哪些地方最容易亏钱。适合手里已经有稳定流量、想从"卖水"转向"开渠"的团队负责人看,也适合刚入行想搞明白变现链路的技术同学当全景图。
1. 广告联盟这门生意的钱是怎么转起来的
动手写第一行代码之前,必须把资金流向图在纸上画清楚。画不清楚,后面所有技术选型都是瞎猜。
1.1 四个角色和一次曝光背后的三次结算
广告联盟的产业链上固定站着四个角色:广告主(掏钱买曝光的人)、联盟平台(撮合交易并抽成的一方)、媒体/流量方(提供展示位的一方,也就是你自己)、终端用户(真正看到广告的人)。很多初次接触的人会以为"联盟"只是个技术中转站,其实它是资金池和信息差的持有者。
一次广告曝光的完整链路是这样的:广告主在投放后台设定预算、出价、定向条件,联盟把这些素材和出价打包成"广告请求响应"下发给媒体,媒体把广告渲染给用户,用户产生曝光、点击甚至下载注册,联盟按约定的计费口径记账,月底统一结算——广告主付钱给联盟,联盟扣掉自己的技术服务费,剩下的打给媒体。
关键点在于结算周期是错配的。广告主通常是月结甚至更长的账期,媒体这边如果你自建联盟,往往需要给下游更快的结算承诺才能留住流量。中间这段时间的垫资,是压垮小团队的第一块石头。我见过一个三人小队,技术做得挺漂亮,结果第一个月账期错配直接把现金流撑爆了,这不是技术问题,是模式问题,必须先想清楚。
自建联盟和"只做媒体"最大的区别在于:你既要对上游广告主负责交付质量,又要对下游流量方(如果你还引入了外部媒体)负责结算速度,中间还得自己扛反作弊和坏账。这层责任不是白拿的抽成,是实打实的运营成本。
1.2 CPM、CPC、CPA、oCPX:计费口径直接决定你的数据结构
计费口径不是商务术语,它直接写进了你的数据库表设计里。列个表对照一下:
| 计费方式 | 结算依据 | 媒体侧收入稳定性 | 系统侧必须记录的数据 |
|---|---|---|---|
| CPM | 每千次曝光 | 高,只要展示就有钱 | 曝光事件、去重设备、展示位 |
| CPC | 每次有效点击 | 中,取决于点击率 | 曝光、点击、点击去重指纹 |
| CPA | 每次转化(注册/下单) | 低,取决于下游归因 | 全链路点击ID、转化回传 |
| oCPX | 按目标转化出价,平台兜底 | 较高,联盟承担风险 | 预估模型特征、转化回传、赔付 |
CPM 看着最省事,但对广告主最不友好,所以成熟联盟大多走 oCPX 方向——平台用模型预估每次曝光的转化概率,然后出价。这意味着你的系统里必须有一套预估服务,哪怕最初只是个简单的历史 CTR 统计。
这里有个新手最容易忽略的细节:曝光去重口径必须提前定死并在协议里写清楚。是按设备去重、按天去重、还是按展示位去重?三种口径算出来的数字能差出 20% 以上,结算时扯皮的根源基本都在这里。我建议从第一天起就在数据库里同时记录"原始曝光数"和"去重后曝光数",对账的时候两边都能对上。
1.3 分成比例不是拍脑袋,是从毛利率倒推
很多人上来就定"我给媒体 70%",其实这个数字应该倒推。假设你的联盟从广告主那边拿到的是 10 元每千次曝光的结算价,你要覆盖的成本包括:服务器与带宽、反作弊团队、结算垫资的资金成本、坏账准备金、客服与运营。粗算下来,如果你的综合成本占收入的 25%,那你给媒体的分成上限就是 75%,超过这个数你就是亏本赚吆喝。
更现实的做法是分层分成:头部媒体给高比例锁量,中小媒体走标准比例,同时设置"质量奖励"——填充率高、作弊率低的媒体额外返点。这套机制在系统里体现为一张媒体等级表和一套结算规则引擎,别等到有几百个媒体了再回头改,改起来非常痛苦。
2. 三条技术路线的取舍:只做流量方、做聚合层、还是做完整联盟
这是决定项目规模的分叉路口,走错了要么白干半年,要么被成本拖死。
2.1 路线一:接入现成联盟 SDK,做纯流量方
最轻的路子,一周能上线。你只需要在自己的 APP 里集成两到三家外部联盟的 SDK,做广告位的展示和回调,收入按分成拿。技术上要做的事情很少:初始化 SDK、创建广告位、处理加载失败的重试、控制展示频率。
这条路的收益天花板由外部联盟的填充率和 eCPM 决定,你几乎没有议价权。但它有一个巨大的隐性价值:你能拿到真实的行业基准数据。填充率多少算正常、什么时段的 eCPM 高、哪类广告位点击率高,这些数据在自建联盟时是无价之宝。我强烈建议任何想自建联盟的团队,先老老实实做三个月纯流量方,把基准数据攒够。
坑也有。多家 SDK 共存时包体积会膨胀,初始化时序互相抢占主线程,冷启动时间肉眼可见地变长。我的做法是把非首屏广告位的 SDK 初始化延后到首页渲染完成之后,用空闲任务调度,冷启动能省下 300 到 500 毫秒。
2.2 路线二:自研聚合 SDK,赚的是效率差
聚合层的本质是在多个广告源之间做最优选择。你自己写一层 SDK,向上暴露统一的广告位接口,向下对接多家外部联盟,同时内置排序、超时、缓存、频控逻辑。
这条路赚的钱来自两个地方:一是填充率的提升(一家没广告就立刻切下一家),二是 eCPM 的提升(把高价值的请求优先给高价源)。实测下来,一个做得好的聚合层相对单一 SDK,整体收益能提升 15% 到 40%,取决于你对接的广告源数量和排序策略的精细度。
技术上最难的不是对接,是超时控制。广告请求是典型的"多家并行、先到先得",但如果某一家迟迟不返回,你不能让用户干等。我的经验值是首屏广告位总超时不超过 800 毫秒,非首屏可以放宽到 1500 毫秒;每家源的单独超时设为总超时的 60%,剩余时间留给兜底源。这个参数需要根据你自己的网络分布调,不要照抄。
2.3 路线三:自建完整联盟,重资产但天花板高
完整联盟意味着你要自己做投放后台、竞价引擎、结算系统、反作弊体系,同时向上游拓广告主、向下游拓媒体。团队规模至少 8 到 15 人,周期 6 个月起步才能跑通最小闭环。
什么时候值得走这条路?我总结了三个判断条件:自有流量日均曝光量稳定在千万级且持续增长、已经有一批愿意跟着你走的合作媒体、团队里有懂广告投放业务的人而不只是工程师。三条里缺一条,我都建议你先停在路线二。
因为完整联盟最贵的不是技术,是双边冷启动。没有广告主,填充率上不去,媒体不愿意来;没有媒体,广告主觉得量不够,不愿意投。这个鸡生蛋的问题,下面第 7 节会专门讲破局顺序。
2.4 一张表看清三条路的成本与回报
| 维度 | 路线一:纯流量方 | 路线二:自研聚合 | 路线三:完整联盟 |
|---|---|---|---|
| 首版上线周期 | 1 到 2 周 | 1 到 2 个月 | 5 到 8 个月 |
| 最低人力配置 | 1 人 | 3 到 4 人 | 8 到 15 人 |
| 首年技术投入量级 | 极低 | 中等 | 高 |
| 收益提升空间 | 基准线 | +15% 到 +40% | 理论上无上限 |
| 主要风险 | 无议价权、政策变动 | 排序策略调优成本 | 双边冷启动、资金垫付 |
| 适合的团队 | 流量刚起步 | 有稳定流量想提效 | 有流量+有媒体资源+有业务人 |
我的建议路径基本是"一 → 二 → 三"逐级走,每一级跑满 3 个月再考虑升级,别跳级。
3. 系统骨架拆解:一个能跑起来的联盟 APP 由哪些模块组成
抛开商务层面,纯从工程角度看,这套系统由服务端、客户端 SDK、管理后台三块组成,中间靠一套统一的事件协议串联。
3.1 服务端六大模块与它们的依赖关系
拆开来看,服务端至少要包含六个模块:媒体管理(谁在给我流量)、广告位管理(流量在哪个位置展示)、广告素材与投放管理(广告主投什么)、竞价与决策引擎(这次展示给谁)、计费与结算(钱怎么算)、数据与风控(有没有人在骗我)。
依赖关系上,决策引擎是整个系统的心脏,它要被所有请求路径调用,所以必须做成低延迟、可降级的服务。我的做法是把决策引擎单独部署,前面加一层本地缓存,缓存的是"广告位到候选广告列表"的映射,TTL 设成 30 到 60 秒。这样即使决策服务抖动,大部分请求还能靠缓存兜住,填充率不会瞬间掉到零。
数据库层面,核心表大概长这样:
-- 广告位定义表 CREATE TABLE ad_slot ( id BIGINT PRIMARY KEY, media_id BIGINT NOT NULL, -- 归属媒体 slot_code VARCHAR(64) NOT NULL, -- 客户端使用的广告位标识 style TINYINT NOT NULL, -- 1开屏 2插屏 3信息流 4激励 floor_price INT DEFAULT 0, -- 底价,单位:分/千次曝光 daily_cap INT DEFAULT 0, -- 日展示上限,0 不限 status TINYINT DEFAULT 1 ); -- 广告事件流水表(按月分表) CREATE TABLE ad_event_202501 ( event_id BIGINT PRIMARY KEY, slot_code VARCHAR(64), ad_id BIGINT, device_hash CHAR(32), -- 设备指纹哈希,不存明文 event_type TINYINT, -- 1曝光 2点击 3转化 ts BIGINT, req_id VARCHAR(40), -- 请求链路 ID,用于对账 INDEX idx_slot_ts (slot_code, ts) );注意req_id这个字段,它是整条链路的骨架。从客户端发起请求那一刻生成,一路带到曝光、点击、转化回传,任何一次对账争议都靠它定位。没有这个字段,你的对账能力等于零。
3.2 广告位模型设计:把库存、样式、渲染模板拆开
新手最常见的建模错误是把"广告位"当成一个整体对象,结果加一个样式就要改一堆表。正确的拆法是三层:库存层(这个位置一次能展示几条)、样式层(横图、竖图、视频、大图文)、渲染模板层(客户端用什么组件画出来)。
三层拆开后,同一个广告位可以在不同场景下切换模板,比如信息流位置在首页用大图文,在评论区用小图文,库存和竞价逻辑完全复用。这个设计在后面做 A/B 实验的时候价值巨大——你只改模板层就能测出样式对点击率的影响,不用动竞价逻辑。
模板层的配置建议用 JSON 下发,客户端解析后动态渲染。但要注意必须有本地兜底模板,网络失败时不能白屏。我踩过一次坑,服务端下发的模板 JSON 少了一个必填字段,导致整个信息流区域空白,用户以为是加载失败一直在下拉刷新,直接拉高了请求量。
3.3 客户端 SDK 的生命周期与时序陷阱
客户端 SDK 的核心就四个动作:初始化、请求、渲染、上报。听起来简单,但时序问题能让你怀疑人生。
初始化的时机很关键。太早会和主业务抢资源,太晚会导致首个广告位请求失败。我的实践是在 Application 启动时只做轻量初始化(读配置、起线程池),真正的网络模块和渲染模块延迟到第一个广告位被创建时再初始化。这样冷启动时间基本无感。
请求环节最常见的坑是并发请求没有合并。一个页面同时有 3 个广告位,如果每个位各自发请求,服务端压力翻三倍,而且用户网络差的时候会互相挤占带宽。正确做法是客户端做一个请求队列,把同一时刻的多个广告位请求合并成一个批量请求,服务端一次返回多个广告的候选列表。
上报环节是最容易丢数据的。我见过最离谱的一次,曝光上报丢失率接近 30%,排查了半天发现是页面快速滑动时,曝光回调被触发了但上报线程池满了直接丢弃。后来改成本地落盘队列 + 批量上报 + 失败重试,丢失率降到 1% 以内。这个改动不大,但对收入的影响是实打实的——曝光没上报就等于没展示,等于没钱。
3.4 后台管理系统最少要有哪几块
后台不是给工程师看的,是给运营和商务用的。最小可用版本至少要有四块:媒体与广告位管理、投放配置(素材上传、定向、出价)、数据看板(分媒体、分广告位的填充率、eCPM、点击率)、结算单生成。
数据看板我要特别说一句:不要只做汇总数字,一定要做趋势和分维度下钻。运营最常问的问题是"昨天填充率为什么掉了 5 个点",如果你只有汇总数字,他只能来问你;如果他能自己下钻到某个媒体某个广告位某个小时,问题当场就定位了。这一块的投入产出比极高。
4. 填充率与 eCPM:决定你能不能赚钱的两个数字
这两个指标是联盟的命根子,所有技术优化最后都收敛到它们身上。
4.1 瀑布流排序、超时与缓存:老方案依然能打
瀑布流(Waterfall)的逻辑很朴素:把多个广告源按历史 eCPM 从高到低排成一列,依次请求,第一个返回有效广告的就展示。它的优点是实现简单、可控性强,缺点是串行请求导致延迟叠加。
优化手段有三个。第一是并行化:不要真的一条条串,而是按价格分档,同一档内并行请求,档与档之间串行。这样延迟从 N 倍降到档数倍。第二是动态排序:历史 eCPM 要按广告位、按时段、按地区分别统计,全局平均值参考价值很低。第三是缓存预热:对高频广告位提前请求并缓存,用户真正需要时直接命中。
缓存这里有个必须注意的点:缓存有效期不能超过广告素材的有效期。我见过一次事故,某条广告素材在后台被下架了,但客户端缓存里还留着,继续展示了两个小时。虽然不涉及内容问题,但广告主那边统计到的曝光和他们的实际投放计划对不上,扯了很久。
4.2 实时竞价(Bidding)的工程实现要点
实时竞价的逻辑是:把这次曝光的上下文信息打包发给多个广告源,各家在极短时间内(通常 100 到 300 毫秒)返回出价,价高者得。相比瀑布流,它能让每次曝光都卖到更接近真实价值的价格。
工程上的难点有三个。一是超时控制,竞价是"等最慢的那家",所以必须设硬超时,超时的源直接淘汰,不能等。二是并发量,每次曝光都要向 N 家发起请求,QPS 是瀑布流的好几倍,服务端必须能扛住峰值。三是价格单位统一,各家出价的币种、计费口径、是否含税都不一样,必须在入口处统一换算成分/千次曝光再比较,否则排序结果完全是错的。
我建议初期先做"瀑布流 + 一家竞价源"的混合模式,验证链路通了再逐步扩大竞价源比例。纯竞价对系统稳定性要求太高,小团队硬上容易在高峰期雪崩。
4.3 eCPM 的计算口径与 A/B 实验设计
eCPM 的通用算法是:
def calc_ecpm(revenue_fen, impressions): """revenue_fen: 收入,单位分;impressions: 去重后曝光数""" if impressions <= 0: return 0 return revenue_fen / impressions * 1000看起来简单,但口径必须统一,否则数据毫无意义。要明确三个问题:收入是否含税、曝光是按原始还是去重、统计周期是自然日还是滚动 24 小时。我的习惯是全部按"不含税收入 / 去重后曝光 × 1000",并在看板上标注清楚。
A/B 实验的设计上,最常见的错误是只切流量不切广告位。如果你把整个 APP 的用户随机分成两组,但两组的广告位配置不同,那结果没法归因。正确做法是固定广告位、固定媒体,只在策略维度上分组,比如 A 组用瀑布流、B 组用混合竞价,其他条件完全一致,跑满一周再看。
4.4 展示频控与用户疲劳度
这一块经常被忽略,但它直接影响长期收益。同一个用户一天看 50 次开屏广告,短期收入是上去了,长期留存掉下来,算总账是亏的。
频控要分层设计:单广告位频控(同一位置一天最多展示几次)、全局频控(同一用户一天总展示上限)、同素材频控(同一广告素材对同一用户一天最多几次)。第三层最容易被漏掉,但对体验影响最大——用户连着看到三次同一个游戏广告,反感度是断崖式上升的。
频控数据存在哪?我的建议是服务端存,不要只靠客户端。客户端存容易被清缓存绕过,而且多设备场景下失效。服务端用设备指纹做 key,存一个带过期的计数器,成本很低。
5. 结算与反作弊:这门生意最容易亏钱的地方
技术做得再漂亮,结算算错了、作弊没挡住,一样白干。
5.1 归因链路:曝光、点击、转化的三段式对账
对账的核心是让三个数字能对上:服务端记录的曝光数、客户端上报的曝光数、广告主那边统计到的曝光数。三个数字有偏差是正常的(网络丢失、去重口径不同),但偏差率必须可控,超过 5% 就要查。
我的做法是建一张对账明细表,每天定时把三方数据按req_id、按广告位、按小时维度聚合,算出偏差率,超过阈值自动告警。这张表不需要给所有人看,但一定要有,出问题的时候是唯一能救命的证据链。
转化回传是另一条链路。CPA 和 oCPX 模式下,广告主需要把转化结果回传给你,你才能计费。这里的关键是点击 ID 的透传——广告主那边必须能拿到你下发的点击 ID,并且在转化发生时原样回传。这个字段一旦丢了,整条链路就断了,而且很难追溯。所以我在对接文档里会把这一条加粗三次。
5.2 点击作弊的常见特征与识别手段
作弊的手法一直在进化,但底层特征有共性。列几个我实际遇到过的:
| 作弊特征 | 表现 | 识别思路 |
|---|---|---|
| 点击间隔异常 | 同一设备连续点击间隔恒定在几十毫秒 | 统计间隔方差,低于阈值标记 |
| 设备指纹聚集 | 大量请求来自极少数设备型号+分辨率组合 | 设备指纹维度做频次分布 |
| 点击无后续行为 | 点击后无任何页面停留、无滑动、无返回 | 采集点击后 3 秒内行为埋点 |
| IP 与归属地矛盾 | 声称在某地但 IP 归属明显不符 | IP 库比对 + 时区校验 |
| 深夜集中爆发 | 凌晨时段点击量突增数倍 | 分时段基线告警 |
识别手段上,规则引擎先行,模型后补。规则引擎的好处是可解释、可快速迭代,运营能直接看懂为什么拦了。模型适合做兜底,但初期数据量不够的时候训练出来的模型基本是噪音。
这里有个经验:不要追求 100% 拦截,要追求"拦截的准确性"。误杀正常用户的代价比放过少量作弊高得多,因为正常用户被误判后是直接流失。我的阈值设置原则是"只拦置信度极高的",模糊地带先放行,用数据观察。
5.3 结算周期与资金池:现金流比毛利更致命
前面提过一次,这里再展开说。假设你的上游账期是 60 天,下游你要给媒体 30 天结算,那你就得垫 30 天的钱。如果月流水是 100 万、你抽成 20 万,垫资就是 70 万——这个数字对很多小团队是致命的。
缓解办法有三条:一是尽量缩短上游账期,用预付款折扣换账期;二是设置结算门槛,下游媒体收入低于一定金额时合并到下个周期结算,减少小额高频打款的操作成本;三是预留坏账准备金,按流水的 3% 到 5% 计提,别等出事再补。
还有一点,结算单必须支持人工复核和调整。自动化程度再高,也一定会遇到需要手工改一笔的情况,如果没有这个口子,财务会疯。
6. 合规审核与上架:绕不过去的前置门槛
这一块不是技术问题,但它能直接让你的项目上线即下架。
6.1 广告内容审核的分级策略
广告素材的审核不能只靠人工,量大了根本审不过来。我的做法是三层:机审初筛(敏感词、图片识别、落地页可达性)、人工复审(机审存疑的和高风险的行业类目)、投放中巡检(随机抽样 + 用户举报触发)。
高风险类目必须要有人工兜底,比如金融、医疗、教育相关的广告,机审通过也不能直接放行。同时要有素材版本管理,广告主修改素材后必须重新走审核,不能复用旧素材的审核结果——这是很多人会忽略的漏洞。
另外,落地页的审核比素材本身更重要。素材可以很干净,落地页跳转后变成完全不同的内容。所以必须做落地页的定时复检,尤其是长周期投放的计划。
6.2 隐私合规与权限申明
客户端 SDK 采集什么数据、用于什么目的,必须在隐私政策里写清楚,并且在用户同意之前不得采集。这条听起来是常识,但实际执行中很容易出问题——很多 SDK 会在初始化时就读取设备标识,而初始化往往在用户点击同意之前。
正确时序是:APP 启动 → 展示隐私弹窗 → 用户同意 → 初始化广告 SDK → 开始采集和请求。SDK 必须提供"延迟初始化"能力,并且要有明确的"未同意状态下不采集"的开关。上架审核时这一块查得很细,代码里有没有提前调用一眼就能看出来。
还有就是权限申明要和实际使用一致。申请了定位权限但只是用来做广告地域定向,那隐私政策里必须写明用途,不能含糊。
6.3 未成年人保护与广告标识
如果 APP 的用户群体可能包含未成年人,广告内容上要有更严格的限制,并且要有年龄相关的识别或声明机制。这块不是技术难点,是意识问题,很多团队压根没考虑过。
广告标识同样重要。所有广告展示位必须有明确的"广告"标识,不能和原生内容混淆到用户分不清。这不只是合规要求,也是长期信任的基础——用户能分清哪条是广告,对平台的信任度反而更高。
7. 冷启动与实测踩坑记录
前面都是设计层面的东西,这一节讲真正动手之后会撞上的墙。
7.1 没有广告主也没有流量的破局顺序
双边冷启动的唯一解法是先单边。具体顺序我建议这样:
第一步,先做媒体侧。用自研聚合 SDK 接入多家外部广告源,把自己的 APP 流量跑起来,同时积累真实的填充率、eCPM、点击率基线数据。这个阶段的目标不是赚钱,是拿到数据。
第二步,引入第一批广告主。这时候你有流量、有数据,可以去谈一些中小广告主,用"低于市场价 + 精准人群"作为切入点。初期不要挑行业,先跑通投放-计费-结算的完整链路。
第三步,开放外部媒体接入。等你自己跑通了几十个广告计划、结算流程稳定了,再对外招募媒体。这时候你手上有案例、有数据、有稳定的结算记录,说服力完全不一样。
我见过有人反着来,先招媒体再找广告主,结果媒体接进来填充率只有 20%,两周就流失光了,还坏了口碑。
7.2 曝光上报丢失的三个真实原因
前面提过一次丢失率 30% 的事故,这里把排查过程完整说一下,因为这类问题会反复出现。
现象:服务端统计的曝光数比客户端埋点统计的少将近三成。
排查第一步,先确认是不是统计口径问题。对比同一批req_id,发现客户端有上报记录的,服务端确实没收到,排除口径问题,确认是真实丢失。
排查第二步,看客户端日志。发现快速滑动页面时,曝光回调被触发了,但上报任务的线程池队列满了,任务被直接丢弃。这是原因一:线程池满了丢弃任务。修复方案是改成有界队列 + 拒绝策略改为落本地队列。
排查第三步,修复后再测,丢失率降到 12%,还有。继续查,发现是 APP 被杀进程时,本地队列里还没上报的数据全丢了。这是原因二:进程被杀导致内存队列丢失。修复方案是曝光发生时就同步写本地文件,上报成功后删除。
排查第四步,再测,降到 4%。最后一查,是弱网环境下批量上报的超时时间设得太短,请求发出了但没等到响应就重试,重试时又生成了新的请求 ID,导致服务端去重把两次都算了但客户端只记了一次。这是原因三:重试没有复用原请求 ID。修复方案是请求 ID 在上报任务创建时就固定,重试沿用同一个。
三个原因叠加,才凑出 30% 的丢失率。这类问题的特点是单看每一个都不致命,叠加起来非常致命,而且只在特定场景(快速滑动、弱网、杀进程)下才暴露。
7.3 填充率虚高与缓存过期
还有一个坑值得一提。有段时间看板上填充率一直在 95% 以上,看着很健康,但收入没涨。查下来发现是缓存命中被算成了有效填充——客户端命中了本地缓存的广告,上报了一次"填充成功",但实际展示时因为广告位已经销毁,压根没展示出去。
修复方案是把"填充"和"展示"两个事件彻底分开统计,填充率用请求到填充的比例,展示率用填充到曝光的比例,两个指标分开看。填充率虚高的问题立刻暴露出来。
这件事给我的教训是:指标定义比指标数值重要。一个定义模糊的指标,数值再好看也没有决策价值。
另外缓存过期策略也要注意。广告素材的缓存时间不能一刀切设成 24 小时,要根据素材类型分:图片类可以长一些,视频类要考虑存储占用,动态创意类必须短。我现在的做法是服务端下发缓存策略,客户端按广告位单独配置,默认值保守一点。
最后分享一个我觉得挺有用的小习惯:每次上线新策略之前,先在后台开一个 5% 的小流量实验组,跑满 48 小时看数据再全量。广告变现这个领域的变量太多,凭直觉判断的准确率其实很低,小流量验证的成本几乎为零,但能避免的损失是实打实的。