• 这里会引用神策数据很多的介绍,然后进行总结

归因方法

  • 自归因

    • 渠道商帮我们做归因,有的是每个用户打开 app 都回传给渠道商,渠道商自己归因
    • 有的如华为是从应用商店安装时,应用商店把归因信息写入到 app, 然后首次安装启动时能从本地存储获取到归因数据
  • 曝光归因
    • 曝光归因由于有数据量极大、不会使用此项
  • 点击归因 (常用)
    • 所谓点击归因,就是点击广告之后首个转化,基本都是用这种方式归因

      归因模型

  • 末次归因模型 (常用,因为比较好实现)
    • 多个归因源事件时,认为最后一个归因源事件的功劳为 100%
  • 首次归因模型
    • 多个归因源事件时,认为第一个归因源事件的功劳为 100%。理由是第一个触点给用户建立了认知,与用户形成了连接。
  • 平均归因模型
    • 多个归因源事件时,认为每个归因源事件平均分配此次功劳。
  • 时间衰减归因模型
    • 加上了时间的影响因素,最后 1 次触达的贡献更高。
  • 位置归因模型
    • 多个归因源事件时,认为第一个归因源事件和最后一个归因源事件各占 40% 功劳,其余平分剩余的 20% 功劳。兼顾最初的线索和最终的决策。
  • 价值加权归因模型
    • 多个归因源事件时,对不同渠道的贡献价值进行加权,将转化功劳根据权重进行划分。

匹配方式

  • 精确匹配

    • OAIDOAID 全称是 Open Anonymous Device Identifier, 中文名是匿名设备标识符。 OAID 是一种非永久性设备标识符,最长 64 位,在系统首次启动的时候生成
    • AndroidIDANDROID_ID 是设备首次启动时由系统随机生成的一串 64 位的十六进制数字
    • IMEI: 国际移动设备识别码(International Mobile Equipment Identity,IMEI),即通常所说的手机序列号、手机 “串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。
    • Mac: 手机的网卡地址
  • 模糊匹配
    • IP: 分配给用户上网使用的网际协议(全称 Internet Protocol, 简称 IP)的设备的数字标签
    • User_Agent: 一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等

      服务架构实现

  • 接下来会参考这个图来整体说明

根据上图,我们先给一个最基础的表结构,大家可以根据具体业务增减字段

# 应用表(apps)
id, appid(客户端使用), name, os, attribute_cycle_days(归因周期), attribute_white_list(JSON 白名单列表)
# 渠道表(channels)
id, name, template_query(此字段预先组装好格式)
# 监测链接表(links)
id, app_id, channel_id, channel_name(自定义渠道名), events(JSON 需要回传的事件, 方便后续动态增加回传事件), exp(有效期)
# 广告点击表:按天分表(click_logs)
id, appid, ad_name, [oaid, imei, android_id, mac, ip, ua](这些匹配方式看各自需要存储), exp, callback, data(JSON冗余字段), attributed_at(归因成功时间',')
# 归因成功日志表(这个表按各自日志需要设计)
# 回调日志表(这个表按各自日志需要设计)

根据时序图,来说明实际场景 (以下为伪代码,所有数据库查询自行做好缓存处理)

    1. 点击广告 (这一步是不需要我们处理的,用户点击广告的请求直达渠道商)
    1. 点击监测,渠道商会请求我们的监测链接
    • 监测链接说明
    • 由于每一家的参数不一样,我的建议是不要针对每一个渠道开发,而是应该适配一个通用的输入
    • 然后根据通用的输入,设计一个模板,这就是为什么要在渠道表加一个 template_query 字段的原因
    • 比如 oppo商店的格式是这样 ad_id=__ADID__&android_id=__ANDROIDID__&imei_md5=__IMEI__&oaid=__OAID__
    • 比如头条的格式是这样 ad_name=__AID_NAME__&android_md5=__ANDROIDID__&callback=__CALLBACK_PARAM__&idfa=__IDFA__&imei_md5=__IMEI__&ip=__IP__&mac_md5=__MAC1__&oaid=__OAID__&site=__CSITE__&ua=__UA__
    • 然后生成监测连接的时候,应该是生成像下面这样的
    • https://api.domain.com/api/v1/links/{id}/click_logs?ad_id=__ADID__&android_id=__ANDROIDID__&imei_md5=__IMEI__&oaid=__OAID__
    • 接口处理
    • 当请求到达 https://api.domain.com/api/v1/links/{id}/click_logs?ad_id=__ADID__&android_id=__ANDROIDID__&imei_md5=__IMEI__&oaid=__OAID__接口时
    • 参数中的宏会替换成实际点击用户的设备值,如:https://api.domain.com/api/v1/links/{id}/click_logs?ad_id=123456789&android_id=123456789&imei_md5=123456789&oaid=123456789
    • 接口伪代码:
// 统一的请求结构
class AdClickRequest { public $oaid;public $imei;public $imei_md5;public $andoird_md5;public $ad_name;public $callback;// xxx 更多字段
}const FIELDS = ['oaid', 'imei', 'imei_md5', 'xxx'];
function clickLogs($id)
{// 1. 根据不同框架, 把数据解析到统一请求上$req = new AdClickRequest(); // 2. 查询监测链接表$link = "select * from links where id = {$id}"; // $idif (is_null($link)) { return 'FAIL'; } // 3. 写入点击日志表, 点击量大走队列插入$logModel = "insert into click_logs(`oaid`, `imei`, `events`, `exp`, 'xxx更多字段') values({$req->oaid}, {$req->imei}, {$link->events}, {$link->exp}, 'xxx更多字段')";// 4. 写入 redis $pipe = \Redis::pipeline();$value = $logModel . '.' . $logModel->id;foreach (FIELDS as $key) { $redisKey = sprintf('attributes:%d_%s', $link->app_id, $req->{$key});$pipe->set($redisKey, $value, $logModel->exp*60*60*24);} $pipe->exec();return 'OK';
}
    1. 用户首次打开 app 上报接口
class AppReportRequest { public $deviceKey;public $oaid;public $imei;public $mac;// xxx 更多字段
}
const FIELDS = ['oaid', 'imei', 'imei_md5', 'xxx'];function appReport($appId)
{// 0. 如果是 deepLink 拉起, 最好加一个延迟 10s 的队列归因, 防止`app`请求先于渠道商监测链接请求// 1. 根据不同框架, 把数据解析到统一请求上$req = new AppReportRequest(); // 2. 查询 app $app = "select * apps where id={$appId}";// 3. 查询 redis $pipe = \Redis::pipeline();$keys = []; foreach (FIELDS as $key) { $redisKey = sprintf('attributes:%d_%s', $app->app_id, $req->{$key});$keys[] = $redisKey; $pipe->get($redisKey);} // result 为一个数组, 如果匹配到了里面就是日志表的表名和主键$result = $pipe->exec();$value = collect($result)->filter()->first();if (is_null($value)) { return '归因失败';}$logModel = "select * from click_logs{$value->table} where id = {$value->id}";// 接下来可以用队列事件解耦之后的流程\Redis::set("attribute_devices:{$appId}_{$req->deviceKey}", $logModel, 60*60*24*7);// 存储归因成功日志表// 修改点击日志状态等等// 删除所有归因的 $keys, 防止重复归因// 根据 $app->attribute_cycle_days 设置归因周期return 'SUCCESS';}
  • 4.5.6. 这三步根据具体业务来实现即可

    1. 客户端事件回传
function appCallback($appId, $deviceKey)
{$logModel = \Redis::get("attribute_devices:{$appId}_{$deviceKey}");if (is_null($logModel)) { return 'FAIL'; } // 通过 $logModel->attributed_at 判断次留是否有效, 判断是否七日内付费    // 处理回传的逻辑return 'SUCCESS';}

客户端架构

  • 客户端应该尽量不要发起没必要的请求,减少服务器的压力
  • 比如播放回传的时候,不要每次都回传,应该用一下伪代码实现
// 假设这个是客户端的方法, 在需要打点的地方每次都调用这个方法
function eventReport(event) {// 从本地存储获取数据, 一定要存成 json 格式, 继续反序列化var data = storage.get('attribute_events');// 如果已经上报过了, 不要上报if (data[event]) {return; }// 上报接口var res = api.post('/api/v1/event_callback', '参数');if (res.code !== 200 || ! res.data.status) {return; }data[event] = true;storage.set('attribute_events', data);
}// 归因上报的接口,
function attributeReport() {// 请求接口var res = api.post('/api/v1/attributes', '参数')if (res.code !== 200 || ! res.data.status) {return; }// 把整个事件缓存删除掉,这样子才能继续上报storage.delete('attribute_events');
}

广告归因-让你彻底弄归因架构实现相关推荐

  1. 多渠道归因分析:互联网的归因江湖(二)

    在公众号[PMCoder之路]看到互联网归因用法上的一些有趣案例,搬运一些案例. 1 互联网归因的江湖混战(一) 2 不懂归因,也许你广告还没入门 3 互联网归因混战江湖(二)-应用归因详细说明 4 ...

  2. 【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型

    文章目录 1. 引言 2. Brinson单期归因模型 2.1 模型框架 2.2 公式推导 3. Brinson多期归因模型 3.1 模型框架 3.2 公式推导 4. Brinson模型的应用场景 4 ...

  3. 你花了多久弄明白架构设计?kafka日志清理

    大数据.算法项目在任何大厂无论是面试还是工作运用都是非常广泛的,我们精选了50个百度.腾讯.阿里等大厂的大数据.算法落地经验甩给大家,千万不要做收藏党哦,空闲时间记得随时看看! 如果你没有大厂项目经验 ...

  4. 你花了多久弄明白架构设计?java多线程编程实战指南pdf

    一面 自我介绍 项目中的监控:那个监控指标常见的有哪些? 微服务涉及到的技术以及需要注意的问题有哪些? 注册中心你了解了哪些? consul 的可靠性你了解吗? consul 的机制你有没有具体深入过 ...

  5. 给广告打“保”字标、弄风险提示 百度搜索为用户旅游操碎了心

    8月13日,暑期正是旅游高峰期,爱好旅游的人士总会在出发前先搜索一些资料对目的地进行一些了解,独处异乡准确有效的信息对用户非常重要. 今天,百度发布旅游保障升级计划,推出四大举措.用户全网搜索旅游相关 ...

  6. 广告平台精准推送系统解决方案架构

    以上就是广告精准推送的一个架构图. 广告联盟是由多家广告提供商提供形成的一个组织,提供了多个平台的收集到的数据进行整合,数据的分析.清理,计算.统计等,提供向需要投放广告的广告主提供了一个投放系统平台 ...

  7. 你花了多久弄明白架构设计?万字Java技术类校招面试题汇总

    摘要 Apache Kafka是一个分布式消息发布订阅系统.它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Ap ...

  8. 三年经验Android开发,2个月面试腾讯、B站,你花了多久弄明白架构设计

    8.Activity启动模式,以及各启动模式生命周期问题 9.静态方法,静态对象为什么不能继承 10.Activity怎么启动Service,Activity与Service交互,Service与Th ...

  9. 你花了多久弄明白架构设计?多个java应用同时访问数据库

    01 分布式限流:Nginx+ZooKeeper 1.1 分布式限流之Nginx 请解释一下什么是 Nginx? 请列举 x Nginx 的一些特性. 请列举 x Nginx 和 和 Apache 之 ...

最新文章

  1. 工业机器人运动规划方法简述
  2. 父类的析构函数定义为虚函数
  3. 电脑画画软件_手机原来可以画出这么美的插画!|手机画画软件app篇
  4. ubuntu修改登陆用户名称_修改ubuntu的用户名(注意用户名和主机名的区别)
  5. 大数据WEB阶段 后台和页面之间传递日期格式数据的400问题
  6. 如何关闭默认浏览器检查
  7. mysql config.path_mysql之 mysql_config_editor/login-path 登录密码保护
  8. 数据清洗代码 寒老师
  9. Lua,Lua API,配置文件
  10. 记录java 疑难杂症
  11. 禁止屏幕保护使用密码
  12. spring纯注解+libreoffice
  13. python 安装talib包
  14. 微信公众平台接口调试工具json格式不对怎么搞_关于测试一个接口的面试题
  15. 解决Not all parameters were used in the SQL statement问题
  16. 用户运营day2用户分层:以用户为中心的精细化运营
  17. 10大最毒路边小吃盘点,你常吃吗?
  18. google工具栏新览
  19. 百度在线笔试计算机视觉,[转载]2014 百度 计算机视觉笔试
  20. mate7安装android o,华为Mate7怎么刷机 华为Mate7刷机教程【步骤详解】

热门文章

  1. 事件委托(代理,委派)
  2. 正在经历史上最大危机的乐视,这两天都被“黑”成了什么样?
  3. 【论文笔记】Shortest Paths and Centrality in Uncertain Networks
  4. python 微信支付 小程序红包 发放红包接口
  5. 水利自控翻板闸门滚轮连杆式翻板闸门液压比例阀控制器
  6. 使用Python+OpenCV将照片变成卡通照片
  7. PMP 常见100个考点和答题策略
  8. 使用Pyecharts进行全国水质TDS地图可视化全过程6:利用Python+Selenium自动化获取页面信息
  9. 京东自媒体平台京东号头条特卖的关系
  10. ankidroid记忆卡片android,AnkiDroid