Affaire banque Raiffeisen : comment lutter contre la fraude dans les réseaux CPA

Publié: 2022-05-25

À mesure que le marketing numérique évolue, il en va de même pour la fraude publicitaire par affiliation numérique qui devient un défi fascinant pour les spécialistes du marketing en ligne. Il est effectué en envoyant du trafic indésirable vers des sites Web ou en utilisant des bots pour déclencher des récompenses d'affiliation. Quelle que soit la méthode exacte, il faut toujours 1 $ sur 3 $ gagnés grâce à la publicité en ligne. En d'autres termes, c'est une quantité importante de revenus volés qui est engagée chaque jour.

Dans ce cas, nous décrivons la solution fournie par l'équipe OWOX BI pour la banque Raiffeisen qui sera utile aux deux banques et à tout autre utilisateur du réseau CPA.

Table des matières

  • Défi
  • Solution
    • Étape 1. Recueillir des données brutes
    • Étape 2. Traiter les données
    • Étape 3. Créer des rapports
  • Résultats

Défi

Les spécialistes du marketing de Raiffeisen ont découvert une augmentation spectaculaire des coûts de trafic des affiliés, les revenus restant les mêmes. Un autre problème était que les clients de la banque avaient de courtes interruptions de session lors de la saisie des données pour le formulaire de demande sur le site Web.

C'est pourquoi Raiffeisen a supposé que certains de ses affiliés CPA auraient pu remplacer la valeur de la source de trafic sur la page de paiement de la banque. Cela fonctionne comme ceci : par exemple, un utilisateur installe une extension de navigateur pour obtenir des remises. Lorsque l'utilisateur se rend sur votre site Web et ouvre la caisse, l'extension affiche une fenêtre contextuelle avec une offre de réduction. S'il y a des clics sur le lien depuis la fenêtre contextuelle, l'extension réécrit automatiquement les données de source de trafic dans le cookie avec les données de source de trafic des affiliés.

Solution

L'équipe marketing a décidé de commencer par collecter des données brutes sur le comportement des utilisateurs pour prouver l'hypothèse selon laquelle les affiliés réécrivaient les données de source de trafic à leur avantage. Ensuite, les données sur les clients spécifiques ont été collectées. Ces clients ont eu deux sessions sur la même page en moins de 60 secondes, et la source de trafic de la deuxième session a été basculée vers celle de l'affilié. De telles données sur ces clients aideraient à identifier les partenaires affiliés qui se sont attribués le trafic provenant d'autres canaux. Avec ces données fournies, il pourrait être possible d'arrêter la coopération avec des webmasters agissant de mauvaise foi, et d'optimiser le budget pour le marketing.

L'équipe OWOX BI a aidé à collecter et traiter les données nécessaires. Voici un schéma pour illustrer le flux de données :

Étape 1. Recueillir des données brutes

Google Analytics échantillonne les données lorsque le nombre de sessions dépasse le seuil d'échantillonnage. C'est pourquoi les analystes d'OWOX BI ont suggéré de collecter les données dans Google BigQuery. De plus, cet entrepôt de données cloud répond aux normes de sécurité les plus élevées, ce qui est vraiment important pour la banque.

Pour configurer l'importation des données du site Web vers Google BigQuery, Raiffeisen a utilisé OWOX BI Pipeline. De cette façon, les spécialistes de l'entreprise ont obtenu des données non échantillonnées en temps quasi réel et ont collecté l'horodatage de chaque hit. Une telle solution permettait de suivre toutes les séquences possibles d'actions de l'utilisateur à travers les sessions, dans un seul rapport. Par exemple, vous avez besoin d'un rapport sur les utilisateurs qui ont visité la page/la page promotionnelle de votre entreprise, sont revenus sur le site Web via CPC et, finalement, ont acheté quelque chose. Une dernière chose nécessaire est d'afficher ces visites pour la date sélectionnée dans le rapport. Voici la requête pour obtenir le rapport dont vous avez besoin :

    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

Vous trouverez ci-dessous le tableau avec toutes les données obtenues à la suite de la requête.

Étape 2. Traiter les données

La liste des valeurs nécessaires a été créée pour identifier les valeurs de source de trafic qui ont été modifiées avec celle de l'affilié :

  • Identifiant d'utilisateur.
  • Source et support de la première et des prochaines sessions.
  • Le temps entre les séances.
  • La première et la dernière URL de chaque session.
  • Événements à chaque session.
  • Événement de transaction dans la session finale.

Ensuite, pour s'assurer que les valeurs des sources de trafic étaient définitivement réécrites, les analystes OWOX BI ont choisi de filtrer les données en tenant compte de ces conditions :

  • La période de temps entre les deux sessions devrait être jusqu'à 60 secondes.
  • La page du site Web doit rester la même lorsque la source change.
  • Il devrait y avoir une transaction lors de la session finale.
  • Le support de trafic lors de la session finale doit être un affilié.

Voici la requête SQL qui a été utilisée pour obtenir les données nécessaires :

    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

Étape 3. Créer des rapports

Pour une analyse plus approfondie, le module complémentaire permettant d'importer les données sélectionnées de Google BigQuery vers Google Sheets a été appliqué. En utilisant les données importées, la table a été créée avec les identifiants de chaque client dont la session a été fermée et la nouvelle session a été ouverte sur la même page, en moins d'une minute entre les deux sessions.

Ensuite, les données ont été rassemblées dans un tableau croisé dynamique pour démontrer que les spécialistes du marketing affilié ont agi de mauvaise foi. Les chiffres de la capture d'écran ci-dessous ont été modifiés et sont donnés à titre d'exemple :

Par exemple, le rapport indique le nombre de transactions avec une valeur source réécrite, ainsi que les affiliés qui ont remplacé les sources de trafic par les leurs. Le rapport montre également quels canaux ont été privés de transactions : CPC et organique.

Résultats

L'équipe OWOX BI a permis d'identifier et d'éliminer rapidement les faiblesses des réseaux CPA de la banque. Grâce à la solution fournie, la banque a pu surveiller les statistiques sur les affiliés (attribuer plus précisément les conversions et les ventes aux canaux de trafic) et mettre en lumière les cas de fraude dans les réseaux CPA. L'équipe marketing a réussi à optimiser le budget publicitaire en cessant de coopérer avec deux partenaires malhonnêtes qui ont réécrit les sources de trafic et surfacturé la banque Raiffeisen de manière déraisonnable.