결제 페이지의 오류를 수정하여 판매 및 고객 충성도를 높이는 방법

게시 됨: 2022-05-25

빠르게 진화하는 현대의 디지털 세계에서 고객은 기업이 제공하는 온라인 기회에 의존하고 모든 것이 완벽하기를 기대합니다. 고객 여정에서 한 번 오류를 경험한 고객은 나쁜 서비스를 기억하고 대체 제품/서비스를 찾는 것을 선호합니다. 그렇기 때문에 어떠한 난관도 예방하고 사업 성과를 지속적으로 모니터링하는 것이 중요합니다.

이 경우, 우리는 판매 및 고객 충성도를 높이기 위해 결제 페이지의 오류를 수정하는 데 어려움을 겪었던 가전 및 가전 소매업체를 위해 OWOX BI 팀에서 제공한 솔루션에 대해 설명합니다.

목차

  • 도전
  • 목표
  • 해결책
    • 1단계. 오류에 대한 데이터 수집
    • 2단계. 데이터 처리
    • 3단계. 획득한 데이터 사용
  • 결과

도전

약 700,000명의 사람들이 하루에 소매업체의 웹사이트를 방문하여 제품 리뷰를 읽거나 사고 싶은 제품을 찾습니다. 그러나 사용자는 때때로 결제 페이지에서 웹사이트 오류를 ​​경험하여 온라인으로 주문을 완료할 수 없어 회사 수익을 감소시킬 수 있습니다.

목표

분석가는 테스터와 함께 고객 불만 사항을 주의 깊게 연구하여 일반적인 오류 시나리오를 정의했습니다. 전문가들이 재현할 수 있었던 오류가 수정되었습니다. 나머지 중요한 버그는 설정 모니터링이 필요했습니다. 이전에는 이러한 데이터를 수집하는 데 사용하지 않았기 때문에 정확한 버그 수와 전환율에 미치는 영향을 평가할 수 없었습니다. 또한 회사는 사용자가 주문할 수 있도록 각 버그가 특정 사용자와 어떻게 연결되었는지 알아야 했습니다.

분석가는 웹사이트에서 중요한 버그에 대한 모니터링을 설정하고 고객이 결제 페이지에서 성공적으로 주문할 수 있도록 최선을 다했습니다. 이렇게 하면 매출이 증가하고 고객 웹사이트 경험이 향상됩니다. 도전적인 요소는 현재 웹 사이트에서 무언가를 주문하려는 고객을 잃지 않기 위해 실시간 모니터링이 필요했다는 것입니다.

해결책

목표를 달성하기 위해 다음과 같은 계획을 준비했습니다.

  1. 웹사이트에 추가 코드를 배치하여 오류에 대한 데이터를 수집하고 Google BigQuery로 보냅니다.
  2. 획득한 데이터를 가공하여 회사의 필요에 맞는 구조로 테이블로 내보냅니다.
  3. 사용자 및 오류에 대한 데이터를 고객에게 연락하여 주문하는 데 도움이 되는 콜 센터로 보내는 것을 구성합니다.

회사의 데이터 흐름은 다음과 같습니다.

1단계. 오류에 대한 데이터 수집

회사는 Google 태그 관리자를 사용하여 사용자가 온라인에서 수행하는 작업을 추적합니다. 그러나 웹사이트의 모든 논리 오류를 표준 Google 태그 관리자 방식으로 추적할 수 있는 것은 아닙니다. 이것이 사용자 정의 스크립트가 Google 태그 관리자를 통해 필요한 웹 사이트 페이지에 구체적으로 작성되고 구현된 이유입니다. 스크립트는 자세한 오류 데이터를 DataLayer 에 추가합니다.

다음으로, Google 태그 관리자 태그의 도움으로 오류 데이터는 OWOX BI 파이프라인을 통해 Google BigQuery로 이동합니다. 이를 통해 거의 실시간으로 Google BigQuery의 웹사이트에서 샘플링되지 않은 원시 데이터를 얻을 수 있습니다.

API를 사용하여 분석가는 CRM에서 Google BigQuery로 사용자에 대한 데이터를 전송하여 클라우드 데이터 웨어하우스에서 필요한 모든 데이터를 얻습니다.

  • 오류 시간.
  • 오류 유형.
  • 사용자 ID.
  • 사용자 이메일 주소.
  • 사용자 도시.
  • 장바구니의 현재 제품 상태입니다.

2단계. 데이터 처리

OWOX BI Pipeline을 사용하여 광범위한 매개변수가 있는 데이터 테이블을 얻었습니다. OWOX BI 분석가는 테이블에서 데이터를 가져오는 SQL 쿼리를 생성하여 명확한 구조로 데이터를 반환했습니다. 각 라인은 단일 실수와 동일한 라인 세트입니다.

다음은 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

쿼리 결과 분석가는 다음 정보가 포함된 테이블을 얻었습니다.

  • 날짜;
  • 시간;
  • 분;
  • 사용자 이메일 주소
  • 오류 설명;
  • 사용자 도시;
  • 장바구니에 담긴 제품의 ID
  • 장바구니에 담긴 제품 이름
  • 장바구니에 담긴 제품의 가격
  • 장바구니에 담긴 총 제품 수
  • 장바구니에 담긴 제품의 총 가격.

그런 다음 테이블의 정보를 매시간 자동으로 업데이트하는 OWOX BI BigQuery 보고서 추가 기능을 사용하여 Google 스프레드시트로 데이터 가져오기가 설정되었습니다. 즉, 보고서에는 항상 이전 시간의 오류에 대한 최신 데이터가 포함됩니다.

아래에서 그러한 보고서의 예를 찾을 수 있습니다.

3단계. 획득한 데이터 사용

담당 사용자는 매시간(오전 9시~오후 6시, 근무 시간 기준) 오류에 대한 보고서를 자동으로 수신합니다. 그런 다음 수정해야 할 중요한 문제가 있는 경우 회사의 개발자에게 보내고 사용자에게 전화를 걸어 전화로 주문을 완료하는 데 도움을 주는 고객 성공 관리자에게 보냅니다.

결과

  • 구조화된 보고서는 사용자가 구매하지 못하도록 하는 웹사이트 오류를 ​​모니터링하기 위해 만들어졌습니다.
  • 회사의 개발자는 웹사이트에 피드백 양식을 추가했습니다. 로그인하지 않은 사용자에게 오류가 표시될 때마다 자동으로 나타나므로 문제를 보고하고 연락처를 남길 수 있습니다. 이를 통해 회사는 오류나 버그에 신속하게 대응할 수 있을 뿐만 아니라 로그인하지 않은 사용자의 연락처를 포함하여 고객 기반을 확장할 수 있습니다.
  • 회사의 콜센터에서는 장바구니에 제품을 담고 결제하는 과정에서 문제가 발생한 사용자에 대한 데이터를 빠르게 얻을 수 있습니다. 콜센터 교환원은 장바구니에 담긴 내용을 파악하고 구매를 완료하는 데 도움을 줍니다.
  • 웹사이트 오류로 인해 전화를 받은 사용자의 약 3%가 전화로 주문을 완료합니다. 이를 통해 회사는 오류를 무시했다면 손실되었을 추가 1,600달러를 얻을 수 있습니다.