Caso del banco Raiffeisen: cómo abordar el fraude en las redes de CPA

Publicado: 2022-05-25

A medida que evoluciona el marketing digital, también lo hace el fraude publicitario de afiliados digitales, que se está convirtiendo en un desafío fascinante para los especialistas en marketing en línea. Se realiza enviando tráfico basura a sitios web o usando bots para generar recompensas de afiliados. No importa el método exacto, aún se necesita $ 1 de cada $ 3 que se obtienen a través de la publicidad en línea. En otras palabras, es una cantidad significativa de ingresos robados que se comprometen todos los días.

En este caso, describimos la solución proporcionada por el equipo de BI de OWOX para el banco Raiffeisen que será útil tanto para los bancos como para cualquier otro usuario de la red de CPA.

Tabla de contenido

  • Desafío
  • Solución
    • Paso 1. Recopilar datos sin procesar
    • Paso 2. Procesar los datos
    • Paso 3. Crear informes
  • Resultados

Desafío

Los especialistas en marketing de Raiffeisen descubrieron un aumento dramático en los costos de tráfico de afiliados, con los mismos ingresos. Otro problema era que los clientes del banco tenían breves interrupciones de sesión al ingresar datos para el formulario de solicitud en el sitio web.

Es por eso que Raiffeisen asumió que algunos de sus afiliados de CPA podrían haber sustituido el valor de la fuente de tráfico en la página de pago del banco. Funciona así: por ejemplo, un usuario instala una extensión del navegador para obtener descuentos. Cuando el usuario va a su sitio web y abre el pago, la extensión muestra una ventana emergente con una oferta de descuento. Si hay algún clic en el enlace desde la ventana emergente, la extensión reescribe automáticamente los datos de la fuente de tráfico en la cookie con los datos de la fuente de tráfico de los afiliados.

Solución

El equipo de marketing decidió comenzar con la recopilación de datos de comportamiento de los usuarios sin procesar para probar la hipótesis de que los afiliados reescribían los datos de la fuente de tráfico para su beneficio. A continuación, se recopilaron los datos sobre los clientes específicos. Estos clientes tuvieron dos sesiones en la misma página en menos de 60 segundos, y la fuente de tráfico de la segunda sesión se cambió a la del afiliado. Dichos datos sobre estos clientes ayudarían a identificar a los socios afiliados que se atribuyeron el tráfico de otros canales. Con estos datos proporcionados, podría ser posible detener la cooperación con los webmasters que actúan de mala fe y optimizar el presupuesto para marketing.

El equipo de BI de OWOX ayudó a recopilar y procesar los datos necesarios. Aquí hay un esquema para demostrar el flujo de datos:

Paso 1. Recopilar datos sin procesar

Google Analytics toma muestras de los datos cuando el número de sesiones supera el umbral de muestreo. Es por eso que los analistas de BI de OWOX sugirieron recopilar los datos en Google BigQuery. Además, este almacén de datos en la nube cumple con los más altos estándares de seguridad, lo cual es realmente importante para el banco.

Para configurar la importación de datos del sitio web a Google BigQuery, Raiffeisen usó OWOX BI Pipeline. De esta forma, los especialistas de la empresa obtuvieron datos sin muestrear casi en tiempo real y recopilaron la marca de tiempo de cada golpe. Esta solución permitió rastrear todas las secuencias posibles de acciones de los usuarios en las sesiones, dentro de un solo informe. Por ejemplo, necesita un informe sobre los usuarios que visitaron la página promocional/de su empresa, regresaron al sitio web a través de CPC y, finalmente, compraron algo. Una cosa más necesaria es mostrar estas visitas para la fecha seleccionada en el informe. Aquí tienes la consulta para obtener el informe que necesitas:

    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

A continuación se muestra la tabla con todos los datos obtenidos como resultado de la consulta.

Paso 2. Procesar los datos

Se creó la lista de los valores necesarios para identificar los valores de la fuente de tráfico que se cambiaron con la del afiliado:

  • ID de usuario.
  • Fuente y medio de la primera y de las próximas sesiones.
  • El tiempo entre sesiones.
  • La primera y la última URL de cada sesión.
  • Eventos en cada sesión.
  • Evento de transacción en la sesión final.

A continuación, para asegurarse de que los valores de la fuente de tráfico se reescribieran definitivamente, los analistas de BI de OWOX optaron por filtrar los datos teniendo en cuenta estas condiciones:

  • El período de tiempo entre las dos sesiones debe ser de hasta 60 segundos.
  • La página del sitio web debe permanecer igual cuando cambia la fuente.
  • Debe haber una transacción en la sesión final.
  • El medio de tráfico en la sesión final debe ser un afiliado.

Aquí está la consulta SQL que se utilizó para obtener los datos necesarios:

    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

Paso 3. Crear informes

Para un análisis más detallado, se aplicó el complemento para importar los datos seleccionados de Google BigQuery a Google Sheets. Al usar los datos importados, la tabla se creó con las identificaciones de cada cliente cuya sesión se cerró y la nueva sesión se abrió en la misma página, en menos de un minuto entre las dos sesiones.

A continuación, los datos se reunieron en una tabla dinámica para demostrar que los comerciantes afiliados actuaron de mala fe. Los números en la captura de pantalla a continuación se cambiaron y se dan como ejemplo:

Por ejemplo, el informe demuestra la cantidad de transacciones con un valor de fuente reescrito, así como qué afiliados han reemplazado las fuentes de tráfico con las propias. El informe también muestra qué canales fueron despojados de transacciones: CPC y orgánico.

Resultados

El equipo de BI de OWOX ayudó a identificar y eliminar rápidamente las debilidades en las redes de CPA del banco. Gracias a la solución proporcionada, el banco pudo monitorear las estadísticas de los afiliados (atribuir con mayor precisión las conversiones y las ventas a los canales de tráfico) y sacar a la luz los casos de fraude en las redes de CPA. El equipo de marketing logró optimizar el presupuesto publicitario al dejar de cooperar con dos socios deshonestos que reescribieron las fuentes de tráfico y sobrefacturaron injustificadamente al banco Raiffeisen.