Raiffeisen 银行案例:如何应对 CPA 网络中的欺诈行为
已发表: 2022-05-25随着数字营销的发展,数字联盟广告欺诈也在不断发展,这正成为在线营销人员面临的严峻挑战。 它是通过向网站发送垃圾流量或使用机器人来触发会员奖励来执行的。 无论采用哪种确切方法,通过在线广告赚取的每 3 美元仍然需要 1 美元。 换句话说,每天都有大量被盗收入。
在这种情况下,我们描述了 OWOX BI 团队为 Raiffeisen 银行提供的解决方案,该解决方案将对银行和任何其他 CPA 网络用户都派上用场。
目录
- 挑战
- 解决方案
- 步骤 1. 收集原始数据
- 步骤 2. 处理数据
- 步骤 3. 构建报告
- 结果
挑战
Raiffeisen 的营销专家发现联属网络营销成本显着增加,而收入保持不变。 另一个问题是银行的客户在网站上输入申请表数据时会出现短暂的会话中断。
这就是为什么 Raiffeisen 假设他们的一些 CPA 附属机构可以替换银行结帐页面上的流量来源值。 它的工作原理是这样的:例如,用户安装浏览器扩展程序以获得折扣。 当用户访问您的网站并打开结帐时,扩展程序会显示一个带有折扣优惠的弹出窗口。 如果在弹出窗口中有任何点击链接,扩展程序会自动将 cookie 中的流量源数据重写为关联公司的流量源数据。
解决方案
营销团队决定从收集原始用户行为数据开始,以证明关联公司重写流量源数据以使其受益的假设。 接下来,收集有关特定客户的数据。 这些客户在不到 60 秒的时间内在同一页面上进行了两次会话,并且第二次会话的流量来源切换到了联属网络。 有关这些客户的此类数据将有助于识别将来自其他渠道的流量归因于自己的联盟合作伙伴。 有了这些数据,就有可能停止与恶意网站管理员的合作,并优化营销预算。
OWOX BI 团队帮助收集和处理了必要的数据。 这是一个演示数据流的模式:

步骤 1. 收集原始数据
当会话数超过采样阈值时,Google Analytics 会采样数据。 这就是为什么 OWOX BI 分析师建议在 Google BigQuery 中收集数据的原因。 而且,这个云数据仓库符合最高的安全标准,这对银行来说非常重要。
为了设置从网站到 Google BigQuery 的数据导入,Raiffeisen 使用了 OWOX BI Pipeline。 通过这种方式,公司的专家近乎实时地获得了非抽样数据,并收集了每次点击的时间戳。 这样的解决方案允许在单个报告中跟踪跨会话的所有可能的用户操作序列。 例如,您需要一份关于访问您公司/促销页面、通过 CPC 回到网站并最终购买商品的用户的报告。 另一件事是在报告中显示所选日期的这些访问。 这是获取所需报告的查询:
SELECT cp.promo.date AS Date, cp.promo.clientId AS ClientId, cp.promo.time AS Promo_time, cp.cpc.time AS CPC_time, send.time AS SEND_time FROM ( SELECT promo.date, promo.clientId, promo.time, cpc.time FROM ( SELECT date, clientId, MIN(time) AS time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE page.pagePath CONTAINS '/promo/' AND type = 'pageview' AND traffic.medium != 'cpc' GROUP BY date, clientId, ORDER BY clientId ASC) AS promo LEFT JOIN ( SELECT date, clientId, traffic.medium, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'cpc' AND type = 'pageview' GROUP BY date, clientId, traffic.medium, time ORDER BY clientId ASC) AS cpc ON promo.clientId=cpc.clientId WHERE promo.time < cpc.time) AS cp LEFT JOIN ( SELECT date, clientId, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' AND type = 'event' GROUP BY date, clientId, time ORDER BY clientId ASC) AS send ON cp.promo.clientId = send.clientId WHERE cp.cpc.time < send.time
SELECT cp.promo.date AS Date, cp.promo.clientId AS ClientId, cp.promo.time AS Promo_time, cp.cpc.time AS CPC_time, send.time AS SEND_time FROM ( SELECT promo.date, promo.clientId, promo.time, cpc.time FROM ( SELECT date, clientId, MIN(time) AS time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE page.pagePath CONTAINS '/promo/' AND type = 'pageview' AND traffic.medium != 'cpc' GROUP BY date, clientId, ORDER BY clientId ASC) AS promo LEFT JOIN ( SELECT date, clientId, traffic.medium, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'cpc' AND type = 'pageview' GROUP BY date, clientId, traffic.medium, time ORDER BY clientId ASC) AS cpc ON promo.clientId=cpc.clientId WHERE promo.time < cpc.time) AS cp LEFT JOIN ( SELECT date, clientId, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' AND type = 'event' GROUP BY date, clientId, time ORDER BY clientId ASC) AS send ON cp.promo.clientId = send.clientId WHERE cp.cpc.time < send.time
下表列出了作为查询结果获得的所有数据。

步骤 2. 处理数据
创建了必要值的列表以识别与附属公司一起更改的流量源值:
- 用户身份。
- 第一届和下届会议的来源和媒介。
- 会话之间的时间。
- 每个会话的第一个和最终 URL。
- 每个会话中的事件。
- 最终会话中的交易事件。

接下来,为了确保流量源值被明确改写,OWOX BI 分析师选择根据以下条件过滤数据:
- 两个会话之间的时间段应最多为 60 秒。
- 源更改时,网站页面应保持不变。
- 在最后一个会话中应该有一个事务。
- 最终会话中的流量媒介应该是附属公司。
这是用于获取必要数据的 SQL 查询:
SELECT * FROM ( SELECT traff.clientId clientId, traff.page.pagePath pagePath, traff.traffic.source startSource, traff.traffic.medium startMedium, traff.time startTime, aff.evCategory eventCategory, aff.evlabel eventLabel, aff.evSource finishSource, aff.evMedium fifnishMedium, aff.time finishTime, aff.isTransaction isTransaction, aff.pagePath link, traff.time - aff.time AS diff FROM ( SELECT clientId, page.pagePath, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium != 'affiliate')AS traff JOIN ( SELECT total.date date, total.time time, total.clientId clientId, total.eventInfo.eventCategory evCategory, total.eventInfo.eventLabel evlabel, total.traffic.source evSource, total.traffic.medium evMedium, tr.eventInfo.eventCategory isTransaction, total.page.pagePath pagePath FROM ( SELECT clientId, page.pagePath, eventInfo.eventCategory, eventInfo.eventLabel, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'affiliate') AS total LEFT JOIN ( SELECT clientId, date, eventInfo.eventCategory, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' GROUP BY 1, 2, 3, 4) AS tr ON total.clientId = tr.clientId AND total.date = tr.date WHERE tr.eventInfo.eventCategory = 'send_ok' AND tr.time>total.time)AS aff ON traff.clientId = aff.clientId) WHERE diff >-60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
SELECT * FROM ( SELECT traff.clientId clientId, traff.page.pagePath pagePath, traff.traffic.source startSource, traff.traffic.medium startMedium, traff.time startTime, aff.evCategory eventCategory, aff.evlabel eventLabel, aff.evSource finishSource, aff.evMedium fifnishMedium, aff.time finishTime, aff.isTransaction isTransaction, aff.pagePath link, traff.time - aff.time AS diff FROM ( SELECT clientId, page.pagePath, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium != 'affiliate')AS traff JOIN ( SELECT total.date date, total.time time, total.clientId clientId, total.eventInfo.eventCategory evCategory, total.eventInfo.eventLabel evlabel, total.traffic.source evSource, total.traffic.medium evMedium, tr.eventInfo.eventCategory isTransaction, total.page.pagePath pagePath FROM ( SELECT clientId, page.pagePath, eventInfo.eventCategory, eventInfo.eventLabel, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'affiliate') AS total LEFT JOIN ( SELECT clientId, date, eventInfo.eventCategory, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' GROUP BY 1, 2, 3, 4) AS tr ON total.clientId = tr.clientId AND total.date = tr.date WHERE tr.eventInfo.eventCategory = 'send_ok' AND tr.time>total.time)AS aff ON traff.clientId = aff.clientId) WHERE diff >-60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
步骤 3. 构建报告
为了进一步分析,应用了将所选数据从 Google BigQuery 导入 Google 表格的插件。 通过使用导入的数据,该表是使用每个客户的 ID 创建的,这些客户的会话已关闭,新会话在同一页面上打开,两个会话之间的时间不到一分钟。

接下来,将数据汇总在一个数据透视表中,以证明联盟营销人员的行为是恶意的。 以下屏幕截图中的数字已更改,并作为示例给出:

例如,该报告展示了具有重写源值的交易数量,以及哪些关联公司已将流量源替换为自己的流量源。 该报告还显示了哪些渠道被剥夺了交易:CPC 和有机。
结果
OWOX BI 团队帮助快速识别并消除了银行 CPA 网络中的弱点。 借助所提供的解决方案,银行可以监控关联公司的统计数据(更准确地将转化和销售归因于流量渠道)并揭露 CPA 网络中的欺诈案例。 营销团队通过停止与重写流量来源和无理多收 Raiffeisen 银行的两个不诚实合作伙伴的合作,设法优化广告预算。