Cazul băncii Raiffeisen: Cum să combateți frauda în rețelele CPA

Publicat: 2022-05-25

Pe măsură ce marketingul digital evoluează, la fel evoluează și frauda publicitară a afiliaților digitali, care devine o provocare captivantă pentru agenții de marketing online. Se realizează prin trimiterea de trafic nedorit către site-uri web sau prin folosirea de roboți pentru a declanșa recompense pentru afiliați. Indiferent de metoda exactă, totuși este nevoie de 1 USD din fiecare 3 USD care se obțin prin publicitate online. Cu alte cuvinte, este o sumă semnificativă de venituri furate comise în fiecare zi.

În acest caz, descriem soluția oferită de echipa OWOX BI pentru banca Raiffeisen, care va fi utilă atât pentru bănci, cât și pentru orice alt utilizator al rețelei CPA.

Cuprins

  • Provocare
  • Soluţie
    • Pasul 1. Colectați date brute
    • Pasul 2. Procesați datele
    • Pasul 3. Creați rapoarte
  • Rezultate

Provocare

Specialiștii în marketing de la Raiffeisen au descoperit o creștere dramatică a costurilor de trafic afiliat, veniturile rămânând aceleași. O altă problemă a fost că clienții băncii au avut scurte pauze de sesiune la introducerea datelor pentru formularul de cerere de pe site.

De aceea, Raiffeisen a presupus că unii dintre afiliații lor CPA ar fi putut înlocui valoarea sursei de trafic pe pagina de plată a băncii. Funcționează astfel: de exemplu, un utilizator instalează o extensie de browser pentru a obține reduceri. Când utilizatorul merge pe site-ul dvs. și deschide checkout, extensia afișează o fereastră pop-up cu o ofertă de reducere. Dacă există clicuri pe linkul din fereastra pop-up, extensia rescrie automat datele sursei de trafic din cookie cu datele sursei de trafic ale afiliaților.

Soluţie

Echipa de marketing a decis să înceapă cu colectarea datelor brute despre comportamentul utilizatorilor pentru a demonstra ipoteza că afiliații au rescris datele surselor de trafic în beneficiul lor. În continuare, au fost colectate datele despre clienții specifici. Acești clienți au avut două sesiuni pe aceeași pagină în mai puțin de 60 de secunde, iar sursa de trafic a celei de-a doua sesiuni a fost comutată pe cea afiliată. Astfel de date despre acești clienți ar ajuta la identificarea partenerilor afiliați care și-au atribuit traficul de pe alte canale. Cu aceste date furnizate, ar putea fi posibilă oprirea cooperării cu webmasteri care acționează cu rea-credință și optimizarea bugetului pentru marketing.

Echipa OWOX BI a ajutat la colectarea și prelucrarea datelor necesare. Iată o schemă pentru a demonstra fluxul de date:

Pasul 1. Colectați date brute

Google Analytics eșantionează datele atunci când numărul de sesiuni depășește pragul de eșantionare. De aceea, analiștii OWOX BI au sugerat colectarea datelor în Google BigQuery. În plus, acest depozit de date în cloud îndeplinește cele mai înalte standarde de securitate, ceea ce este cu adevărat important pentru bancă.

Pentru a configura importul de date de pe site la Google BigQuery, Raiffeisen a folosit OWOX BI Pipeline. În acest fel, specialiștii companiei au obținut date neeșantionate în timp aproape real și au colectat marcajul de timp al fiecărui hit. O astfel de soluție a permis să urmăriți toate secvențele posibile de acțiuni ale utilizatorului de-a lungul sesiunilor, într-un singur raport. De exemplu, aveți nevoie de un raport despre utilizatorii care au vizitat pagina companiei/promoționale, au revenit pe site prin CPC și, în cele din urmă, au cumpărat ceva. Încă un lucru necesar este să afișați aceste vizite pentru data selectată în raport. Iată interogarea pentru a obține raportul de care aveți nevoie:

    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

Mai jos este tabelul cu toate datele obținute în urma interogării.

Pasul 2. Procesați datele

A fost creată lista valorilor necesare pentru a identifica valorile sursei de trafic care au fost modificate cu cea afiliată:

  • ID-ul de utilizator.
  • Sursa și mediul primei și următoarei sesiuni.
  • Timpul dintre sesiuni.
  • Prima și ultimele adrese URL ale fiecărei sesiuni.
  • Evenimente în fiecare sesiune.
  • Eveniment de tranzacție în sesiunea finală.

În continuare, pentru a se asigura că valorile sursei de trafic au fost cu siguranță rescrise, analiștii OWOX BI au ales să filtreze datele luând în considerare aceste condiții:

  • Perioada de timp dintre cele două sesiuni ar trebui să fie de până la 60 de secunde.
  • Pagina site-ului ar trebui să rămână aceeași atunci când sursa se schimbă.
  • Ar trebui să existe o tranzacție în sesiunea finală.
  • Mediul de trafic din sesiunea finală ar trebui să fie un afiliat.

Iată interogarea SQL care a fost folosită pentru a obține datele necesare:

    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

Pasul 3. Creați rapoarte

Pentru analize suplimentare, a fost aplicat suplimentul pentru a importa datele selectate din Google BigQuery în Foi de calcul Google. Prin utilizarea datelor importate, tabelul a fost creat cu ID-urile fiecărui client a cărui sesiune a fost închisă și noua sesiune a fost deschisă chiar pe aceeași pagină, în mai puțin de un minut între cele două sesiuni.

Apoi, datele au fost reunite într-un tabel pivot pentru a demonstra că agenții de marketing afiliați au acționat cu rea-credință. Numerele din captura de ecran de mai jos au fost modificate și sunt date ca exemplu:

De exemplu, raportul demonstrează numărul de tranzacții cu o valoare sursă rescrisă, precum și care afiliați au înlocuit sursele de trafic cu propriile lor. Raportul arată și ce canale au fost jefuite de tranzacții: CPC și organic.

Rezultate

Echipa OWOX BI a ajutat la identificarea și eliminarea rapidă a punctelor slabe din rețelele CPA ale băncii. Datorită soluției oferite banca a putut monitoriza statisticile privind afiliații (atribui mai precis conversiile și vânzările canalelor de trafic) și să scoată la lumină cazurile de fraudă în rețelele CPA. Echipa de marketing a reușit să optimizeze bugetul publicitar prin încetarea cooperării cu doi parteneri necinstiți care au rescris sursele de trafic și au suprafacturat în mod nerezonabil banca Raiffeisen.