Raiffeisen 은행 사례: CPA 네트워크에서 사기를 처리하는 방법
게시 됨: 2022-05-25디지털 마케팅이 발전함에 따라 온라인 마케터에게 큰 도전이 되고 있는 디지털 제휴 광고 사기도 진화하고 있습니다. 웹사이트에 정크 트래픽을 보내거나 봇을 사용하여 제휴사 보상을 트리거함으로써 수행됩니다. 정확한 방법과 상관없이 온라인 광고를 통해 벌어들인 3달러 중 1달러가 여전히 필요합니다. 즉, 매일 엄청난 양의 훔친 수익이 발생합니다.
이 경우 Raiffeisen 은행을 위해 OWOX BI 팀이 제공한 솔루션에 대해 설명합니다. 이 솔루션은 은행과 다른 CPA 네트워크 사용자 모두에게 유용합니다.
목차
- 도전
- 해결책
- 1단계. 원시 데이터 수집
- 2단계. 데이터 처리
- 3단계. 보고서 작성
- 결과
도전
Raiffeisen의 마케팅 전문가는 수익이 그대로 유지되면서 제휴 트래픽 비용이 극적으로 증가한다는 사실을 발견했습니다. 또 다른 문제는 은행 고객이 웹 사이트에서 신청서 데이터를 입력할 때 짧은 세션 휴식 시간을 가졌다는 것입니다.
이것이 Raiffeisen이 CPA 계열사 중 일부가 은행 체크아웃 페이지의 트래픽 소스 값을 대체할 수 있다고 가정한 이유입니다. 다음과 같이 작동합니다. 예를 들어 사용자가 할인을 받기 위해 브라우저 확장 프로그램을 설치합니다. 사용자가 웹사이트로 이동하여 결제를 열면 확장 프로그램은 할인 제안이 포함된 팝업 창을 표시합니다. 팝업 창에서 링크를 클릭하면 확장 프로그램은 자동으로 쿠키의 트래픽 소스 데이터를 제휴사의 트래픽 소스 데이터로 다시 작성합니다.
해결책
마케팅 팀은 제휴사가 트래픽 소스 데이터를 자신에게 유리하게 다시 작성한다는 가설을 증명하기 위해 원시 사용자 행동 데이터 수집부터 시작하기로 결정했습니다. 다음으로 특정 고객에 대한 데이터를 수집했습니다. 이 고객은 60초 이내에 동일한 페이지에 두 개의 세션이 있었고 두 번째 세션의 트래픽 소스는 제휴사로 전환되었습니다. 이러한 고객에 대한 이러한 데이터는 다른 채널의 트래픽을 자신에게 귀속시킨 제휴 파트너를 식별하는 데 도움이 됩니다. 이 데이터가 제공되면 악의적인 웹마스터와의 협력을 중단하고 마케팅 예산을 최적화할 수 있습니다.
OWOX BI 팀은 필요한 데이터를 수집하고 처리하는 데 도움을 주었습니다. 다음은 데이터 흐름을 보여주는 스키마입니다.

1단계. 원시 데이터 수집
세션 수가 샘플링 임계값을 초과하면 Google 애널리틱스에서 데이터를 샘플링합니다. 그렇기 때문에 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단계. 데이터 처리
제휴사와 함께 변경된 트래픽 소스 값을 식별하기 위해 필요한 값 목록이 생성되었습니다.

- 사용자 ID.
- 첫 번째 및 다음 세션의 소스 및 매체.
- 세션 사이의 시간입니다.
- 각 세션의 첫 번째 및 최종 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 Sheets로 선택한 데이터를 가져오는 애드온이 적용되었습니다. 가져온 데이터를 사용하여 두 세션 사이의 1분 이내에 동일한 페이지에서 세션이 닫히고 새 세션이 열린 각 고객의 ID로 테이블이 생성되었습니다.

다음으로 데이터를 피벗 테이블에 모아서 제휴 마케팅 담당자가 악의적으로 행동했음을 보여줍니다. 아래 스크린샷의 숫자가 변경되었으며 예시로 제공됩니다.

예를 들어, 보고서는 재작성된 소스 값이 있는 트랜잭션 수와 트래픽 소스를 자체 트래픽 소스로 대체한 계열사를 보여줍니다. 이 보고서는 또한 CPC와 자연(organic) 중 어느 채널에서 거래가 도난당했는지 보여줍니다.
결과
OWOX BI 팀은 은행 CPA 네트워크의 약점을 신속하게 식별하고 제거하는 데 도움을 주었습니다. 제공된 솔루션 덕분에 은행은 제휴사에 대한 통계를 모니터링하고(보다 정확하게는 전환 및 판매를 트래픽 채널로 돌림) CPA 네트워크의 사기 사례를 밝힐 수 있었습니다. 마케팅 팀은 트래픽 소스를 다시 작성하고 Raiffeisen 은행에 부당하게 과도한 비용을 청구하는 두 명의 부정직한 파트너와의 협력을 중단하여 광고 예산을 최적화할 수 있었습니다.