Fall Raiffeisenbank: Betrugsbekämpfung in CPA-Netzwerken
Veröffentlicht: 2022-05-25Mit der Entwicklung des digitalen Marketings entwickelt sich auch der digitale Affiliate-Werbebetrug, der für Online-Vermarkter zu einer fesselnden Herausforderung wird. Es wird durchgeführt, indem Junk-Traffic an Websites gesendet oder Bots verwendet werden, um Affiliate-Belohnungen auszulösen. Unabhängig von der genauen Methode kostet es immer noch 1 $ von 3 $, die durch Online-Werbung verdient werden. Mit anderen Worten, es wird jeden Tag eine beträchtliche Menge an gestohlenen Einnahmen begangen.
In diesem Fall beschreiben wir die vom OWOX BI-Team für die Raiffeisenbank bereitgestellte Lösung, die sowohl für Banken als auch für alle anderen Benutzer des CPA-Netzwerks nützlich sein wird.
Inhaltsverzeichnis
- Herausforderung
- Lösung
- Schritt 1. Sammeln Sie Rohdaten
- Schritt 2. Verarbeiten Sie die Daten
- Schritt 3. Erstellen Sie Berichte
- Ergebnisse
Herausforderung
Die Marketingspezialisten von Raiffeisen stellten einen dramatischen Anstieg der Affiliate-Traffic-Kosten bei gleichbleibenden Einnahmen fest. Ein weiteres Problem war, dass Kunden der Bank bei der Eingabe von Daten für das Antragsformular auf der Website kurze Sitzungsunterbrechungen hatten.
Aus diesem Grund ging Raiffeisen davon aus, dass einige ihrer CPA-Partner den Traffic-Quellenwert auf der Checkout-Seite der Bank ersetzt haben könnten. Es funktioniert so: Ein Benutzer installiert beispielsweise eine Browsererweiterung, um Rabatte zu erhalten. Wenn der Benutzer auf Ihre Website geht und die Kasse öffnet, zeigt die Erweiterung ein Popup-Fenster mit einem Rabattangebot an. Wenn auf den Link aus dem Pop-up-Fenster geklickt wird, schreibt die Erweiterung die Traffic-Quellendaten im Cookie automatisch mit den Traffic-Quellendaten der Partner um.
Lösung
Das Marketingteam beschloss, mit dem Sammeln von Rohdaten zum Benutzerverhalten zu beginnen, um die Hypothese zu beweisen, dass die Affiliates die Traffic-Quellendaten zu ihrem Vorteil umschreiben. Als nächstes wurden die Daten über die spezifischen Kunden gesammelt. Diese Kunden hatten innerhalb von weniger als 60 Sekunden zwei Sitzungen auf derselben Seite, und die Verkehrsquelle der zweiten Sitzung wurde auf die des Partners umgeschaltet. Solche Daten über diese Kunden würden dabei helfen, die Affiliate-Partner zu identifizieren, die den Traffic von anderen Kanälen sich selbst zugeschrieben haben. Mit diesen bereitgestellten Daten könnte es möglich sein, die Zusammenarbeit mit bösgläubig handelnden Webmastern zu stoppen und das Marketingbudget zu optimieren.
Das OWOX BI-Team half dabei, die notwendigen Daten zu sammeln und zu verarbeiten. Hier ist ein Schema zur Veranschaulichung des Datenflusses:

Schritt 1. Sammeln Sie Rohdaten
Google Analytics sticht die Daten zusammen, wenn die Anzahl der Sitzungen den Stichprobenschwellenwert überschreitet. Aus diesem Grund schlugen die OWOX BI-Analysten vor, die Daten in Google BigQuery zu sammeln. Darüber hinaus erfüllt dieses Cloud Data Warehouse die höchsten Sicherheitsstandards, was für die Bank sehr wichtig ist.
Um den Datenimport von der Website zu Google BigQuery einzurichten, nutzte Raiffeisen die OWOX BI Pipeline. Auf diese Weise erhielten die Spezialisten des Unternehmens ungesampelte Daten nahezu in Echtzeit und sammelten den Zeitstempel jedes Treffers. Eine solche Lösung ermöglichte es, alle möglichen Sequenzen von Benutzeraktionen über Sitzungen hinweg in einem einzigen Bericht zu verfolgen. Sie benötigen zum Beispiel einen Bericht über die Benutzer, die die Seite Ihres Unternehmens/Werbeaktion besucht haben, per CPC auf die Website zurückgekehrt sind und schließlich etwas gekauft haben. Außerdem müssen diese Besuche für das ausgewählte Datum im Bericht angezeigt werden. Hier ist die Abfrage, um den gewünschten Bericht zu erhalten:
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
Unten ist die Tabelle mit allen Daten, die als Ergebnis der Abfrage erhalten wurden.

Schritt 2. Verarbeiten Sie die Daten
Die Liste der erforderlichen Werte wurde erstellt, um die Verkehrsquellenwerte zu identifizieren, die mit dem Affiliate-Wert geändert wurden:

- Benutzeridentifikation.
- Quelle und Medium der ersten und der nächsten Sitzungen.
- Die Zeit zwischen den Sitzungen.
- Die erste und die letzte URL jeder Sitzung.
- Ereignisse in jeder Sitzung.
- Transaktionsereignis in der letzten Sitzung.
Als Nächstes entschieden sich die OWOX BI-Analysten, die Daten unter Berücksichtigung dieser Bedingungen zu filtern, um sicherzustellen, dass die Werte der Verkehrsquelle definitiv neu geschrieben wurden:
- Der Zeitraum zwischen den beiden Sitzungen sollte bis zu 60 Sekunden betragen.
- Die Website-Seite sollte gleich bleiben, wenn sich die Quelle ändert.
- In der letzten Sitzung sollte eine Transaktion stattfinden.
- Das Verkehrsmedium in der letzten Sitzung sollte ein Affiliate sein.
Hier ist die SQL-Abfrage, die zum Abrufen der erforderlichen Daten verwendet wurde:
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
Schritt 3. Erstellen Sie Berichte
Zur weiteren Analyse wurde das Add-on zum Importieren der ausgewählten Daten aus Google BigQuery in Google Sheets angewendet. Unter Verwendung der importierten Daten wurde die Tabelle mit den IDs aller Kunden erstellt, deren Sitzung geschlossen und die neue Sitzung innerhalb von weniger als einer Minute zwischen den beiden Sitzungen auf derselben Seite geöffnet wurde.

Als nächstes wurden die Daten in einer Pivot-Tabelle zusammengeführt, um zu zeigen, dass Affiliate-Vermarkter in böser Absicht gehandelt haben. Die Zahlen im Screenshot unten wurden geändert und dienen als Beispiel:

Der Bericht zeigt beispielsweise die Anzahl der Transaktionen mit einem umgeschriebenen Quellwert sowie welche Affiliates die Traffic-Quellen durch ihre eigenen ersetzt haben. Der Bericht zeigt auch, welche Kanäle von Transaktionen beraubt wurden: CPC und organisch.
Ergebnisse
Das OWOX BI-Team half dabei, Schwachstellen in den CPA-Netzwerken der Bank schnell zu identifizieren und zu beseitigen. Dank der bereitgestellten Lösung konnte die Bank Statistiken zu Affiliates überwachen (Umwandlungen und Verkäufe genauer den Verkehrskanälen zuordnen) und Betrugsfälle in CPA-Netzwerken ans Licht bringen. Dem Marketingteam gelang es, das Werbebudget zu optimieren, indem es die Zusammenarbeit mit zwei unehrlichen Partnern beendete, die die Traffic-Quellen umschrieben und der Raiffeisenbank unangemessen hohe Rechnungen gestellt hatten.