Cómo aumentar las ventas y la lealtad de los clientes corrigiendo errores en la página de pago
Publicado: 2022-05-25En el mundo digital moderno y en rápida evolución, los clientes confían en las oportunidades en línea que ofrecen las empresas y esperan que todo sea perfecto. Habiendo experimentado alguna vez algún error en su recorrido del cliente, estos clientes recordarán el mal servicio y preferirán buscar productos/servicios alternativos. Por eso es tan importante prevenir cualquier dificultad y monitorear el desempeño del negocio constantemente.
En este caso, describimos la solución proporcionada por el equipo de BI de OWOX para un minorista de electrodomésticos y productos electrónicos de consumo que tenía problemas para corregir errores en la página de pago para aumentar las ventas y la lealtad del cliente.
Tabla de contenido
- Desafío
- Meta
- Solución
- Paso 1. Recopilar datos sobre errores
- Paso 2. Procesar datos
- Paso 3. Usa los datos obtenidos
- Resultados
Desafío
Alrededor de 700.000 personas visitan el sitio web del minorista por día para leer reseñas de productos o navegar para encontrar lo que les gustaría comprar. Sin embargo, los usuarios a veces pueden experimentar errores en el sitio web en la página de pago que les impiden completar un pedido en línea, lo que reduce los ingresos de la empresa.
Meta
Los analistas junto con los probadores estudiaron cuidadosamente las quejas de los clientes para definir los escenarios de error típicos. Se corrigieron los errores que los especialistas lograron reproducir. El resto de los errores críticos requerían monitoreo de configuración. Anteriormente, la empresa no solía recopilar dichos datos, por lo que no pudo evaluar la cantidad exacta de errores y cómo afectan las tasas de conversión. La empresa también necesitaba saber cómo se conectaba cada error con un determinado usuario, para ayudar al usuario a realizar un pedido.
Los analistas optaron por configurar el monitoreo de los errores críticos en el sitio web y hacer todo lo posible para ayudar a los clientes a realizar pedidos con éxito en la página de pago. Esto aumentaría las ventas y mejoraría la experiencia del cliente en el sitio web. El factor desafiante fue que se requería monitoreo en tiempo real para no perder a ninguno de los clientes que actualmente intentaban ordenar algo en el sitio web.
Solución
Se elaboró el siguiente plan para alcanzar la meta:
- Coloque el código adicional en el sitio web para recopilar datos sobre errores y enviarlos a Google BigQuery.
- Procesar los datos obtenidos y exportarlos a la tabla con la estructura de acuerdo a las necesidades de la empresa.
- Organice el envío de datos sobre usuarios y errores a los centros de llamadas que contactarían a los clientes para ayudarlos a realizar un pedido.
Así es como se ve el flujo de datos de la empresa:

Paso 1. Recopilar datos sobre errores
La empresa utiliza Google Tag Manager para rastrear lo que hacen los usuarios en línea. Sin embargo, no todos los errores lógicos en el sitio web se pueden rastrear mediante las formas estándar de Google Tag Manager. Es por eso que los scripts personalizados se escribieron específicamente y se implementaron a través de Google Tag Manager en las páginas del sitio web necesarias. Los scripts agregan los datos de error detallados al DataLayer .
Luego, con la ayuda de las etiquetas de Google Tag Manager, los datos de error van a Google BigQuery a través de OWOX BI Pipeline. Esto permite obtener datos sin procesar sin muestrear del sitio web en Google BigQuery, casi en tiempo real.
Mediante la API, los analistas envían los datos de los usuarios desde CRM a Google BigQuery, obteniendo todos los datos que necesitan en el almacén de datos en la nube:
- Tiempo de errores.
- Tipo de error.
- ID de usuario.
- Dirección de correo electrónico del usuario.
- Ciudad del usuario.
- Estado actual del producto en el carrito.
Paso 2. Procesar datos
Usando OWOX BI Pipeline, se obtuvieron las tablas de datos con una amplia gama de parámetros. Los analistas de BI de OWOX crearon una consulta SQL para extraer datos de la tabla y devolverlos con una estructura definida: un conjunto de líneas donde cada línea equivale a un solo error.
A continuación se muestra el ejemplo de consulta SQL:
Select date, hour,minute, email, description, City, productIds, productnames, productprice, cartquantity, cartamount, From ( SELECT usererrors.date as date, usererrors.hour as hour, usererrors.minute as minute, usererrors.userEmail as email, usererrors.action as action, usererrors.error as error, case when action = 'disabled' and error = 'buttonCreateOrder' then 'Unable to checkout in cart' when action = 'notAdded' and error = 'productToCart' then 'Unable to add product to cart' when action = 'open' and error = 'emptyCart' then 'Product can not be viewed in cart' when action = 'open' and error = 'HoldingPageCheckout' then 'Maintenance work in progress (after checkout)' when action = 'absent' and error = ƋdiscountCart' then Ƌ% discount unavailable online (in cart)' when action = 'absent' and error = ƋdiscountCheckout' then Ƌ% discount unavailable online (at the checkout page)' when action = 'disabled' and error = 'buttonSubmit' then 'Button "Place Order" not working at the checkout page' else 'Other' end as description, Dimensions.city as City, Dimensions.productids as productIds, Dimensions.productnames as productnames, customMetrics.productprice as productprice, customMetrics.cartquantity as cartquantity, customMetrics.cartamount as cartamount, FROM (SELECT date, hour,minute, hitId, userEmail, eventInfo.eventAction as action, eventInfo.eventLabel as error, hour(CURRENT_TIMESTAMP())+2-hour as currenthour from TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') ) where eventInfo.eventCategory = 'Errors' and userEmail is not null group by 1,2,3,4,5,6,7,8) as usererrors left join (SELECT hitId, MAX(IF(customDimensions.index=4, customDimensions.value, NULL)) WITHIN hitId AS city, MAX(IF(customDimensions.index=21, customDimensions.value, NULL)) WITHIN hitId AS productids, Max(IF(customDimensions.index=22, customDimensions.value, NULL)) WITHIN hitId AS productnames from TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') )) as Dimensions ON Dimensions.hitId=usererrors.hitId left join (SELECT hitId, MAX(IF(customMetrics.index=1, customMetrics.value, NULL)) WITHIN hitId AS productprice, MAX(IF(customMetrics.index=4, customMetrics.value, NULL)) WITHIN hitId AS cartamount, Max(IF(customMetrics.index=5, customMetrics.value, NULL)) WITHIN hitId AS cartquantity FROM TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') )) as customMetrics ON customMetrics.hitId=usererrors.hitId where usererrors.currenthour=0 ) ORDER BY date asc, hour asc, minute asc, email asc
Select date, hour,minute, email, description, City, productIds, productnames, productprice, cartquantity, cartamount, From ( SELECT usererrors.date as date, usererrors.hour as hour, usererrors.minute as minute, usererrors.userEmail as email, usererrors.action as action, usererrors.error as error, case when action = 'disabled' and error = 'buttonCreateOrder' then 'Unable to checkout in cart' when action = 'notAdded' and error = 'productToCart' then 'Unable to add product to cart' when action = 'open' and error = 'emptyCart' then 'Product can not be viewed in cart' when action = 'open' and error = 'HoldingPageCheckout' then 'Maintenance work in progress (after checkout)' when action = 'absent' and error = ƋdiscountCart' then Ƌ% discount unavailable online (in cart)' when action = 'absent' and error = ƋdiscountCheckout' then Ƌ% discount unavailable online (at the checkout page)' when action = 'disabled' and error = 'buttonSubmit' then 'Button "Place Order" not working at the checkout page' else 'Other' end as description, Dimensions.city as City, Dimensions.productids as productIds, Dimensions.productnames as productnames, customMetrics.productprice as productprice, customMetrics.cartquantity as cartquantity, customMetrics.cartamount as cartamount, FROM (SELECT date, hour,minute, hitId, userEmail, eventInfo.eventAction as action, eventInfo.eventLabel as error, hour(CURRENT_TIMESTAMP())+2-hour as currenthour from TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') ) where eventInfo.eventCategory = 'Errors' and userEmail is not null group by 1,2,3,4,5,6,7,8) as usererrors left join (SELECT hitId, MAX(IF(customDimensions.index=4, customDimensions.value, NULL)) WITHIN hitId AS city, MAX(IF(customDimensions.index=21, customDimensions.value, NULL)) WITHIN hitId AS productids, Max(IF(customDimensions.index=22, customDimensions.value, NULL)) WITHIN hitId AS productnames from TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') )) as Dimensions ON Dimensions.hitId=usererrors.hitId left join (SELECT hitId, MAX(IF(customMetrics.index=1, customMetrics.value, NULL)) WITHIN hitId AS productprice, MAX(IF(customMetrics.index=4, customMetrics.value, NULL)) WITHIN hitId AS cartamount, Max(IF(customMetrics.index=5, customMetrics.value, NULL)) WITHIN hitId AS cartquantity FROM TABLE_DATE_RANGE([mvideo-ru:Streaming.streaming_], DATE_ADD(CURRENT_TIMESTAMP(), 0 ,'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), 0 , 'DAY') )) as customMetrics ON customMetrics.hitId=usererrors.hitId where usererrors.currenthour=0 ) ORDER BY date asc, hour asc, minute asc, email asc
Como resultado de la consulta, los analistas obtuvieron una tabla que contiene la siguiente información:

- Fecha;
- Hora;
- Minuto;
- dirección de correo electrónico del usuario;
- Error de descripción;
- Ciudad del usuario;
- ID del producto en el carrito;
- Nombres de productos en el carrito;
- Precio de los productos en el carrito;
- Número total de productos en el carrito;
- Precio total de los productos en el carrito.
Luego, se configuró la importación de datos a Hojas de cálculo de Google, utilizando el complemento OWOX BI BigQuery Reports que actualiza la información en las tablas de forma automática y cada hora. Esto significa que el informe siempre contiene datos actualizados sobre los errores de la hora anterior.
Puede encontrar un ejemplo de dicho informe a continuación:

Paso 3. Usa los datos obtenidos
Los usuarios a cargo reciben automáticamente el reporte de errores cada hora (9 am a 6 pm, según horario laboral). Luego, lo envían a los desarrolladores de la empresa en caso de que haya problemas críticos que solucionar, y a los gerentes de éxito del cliente que llaman a los usuarios y los ayudan a completar un pedido por teléfono.
Resultados
- El informe estructurado se creó para monitorear los errores del sitio web que impiden que los usuarios realicen una compra.
- Los desarrolladores de la compañía agregaron un formulario de comentarios al sitio web. Aparece automáticamente cada vez que los usuarios que no iniciaron sesión ven un error, lo que les permite informar el problema y dejar sus datos de contacto. Esto ayuda a la empresa a reaccionar rápidamente ante cualquier error o error, así como a ampliar la base de clientes, incluidos los contactos de los usuarios que no iniciaron sesión.
- Los centros de llamadas de la empresa pueden obtener rápidamente datos sobre los usuarios que enfrentan problemas al agregar el producto al carrito y pagar. Los operadores del centro de llamadas conocen lo que hay dentro del carrito y ayudan a finalizar la compra.
- Alrededor del 3% de los usuarios que recibieron una llamada debido al error del sitio web, completaron con éxito el pedido por teléfono. Esto le da a la compañía $1,600 adicionales que se habrían perdido si se hubieran ignorado los errores.