Prawdziwy czas na stronie w Google Analytics

Inspiracją do napisania poniższego artykułu był post Magicznego SEO i SEM dotyczący prawdziwego bounce rate i time on site. Zaciekawieni jego treścią postanowiliśmy sami zagłębić się w temacie. Przyszedł czas na przedstawienie efektów poszukiwań i implementacji:)

Czas na stronie w Google Analytics

Powrót do podstaw

W poprzednim tygodniu w artykule o bounce rate pisaliśmy o pewnej modyfikacji kodu śledzącego (GATC), która „poprawia” jego definicję, tak aby współczynnik odrzuceń był jeszcze lepszą miarą oceny jakości naszego serwisu. Słowem przypomnienia chodzi o to, aby odrzucenie liczone było nie jako jednoosłonowa wizyta (jak jest to standardowo), lecz jako wizyta użytkownika, który po wejściu na witrynę spędza na niej bardzo krótki czas (np. mniej niż 10 sekund) i w czasie wizyty nie podejmuje żadnych akcji (przechodzi na inną stronę w ramach serwisu, ściąga plik itp.).

Jeżeli pamiętasz na jakiej zasadzie działa Google Analytics pewnie zapytasz teraz, co z użytkownikami, którzy wyłączają przeglądarkę, po opuszczeniu Twojej strony? W końcu Google Analytics mierzy czas spędzony na stronie odczytując ciasteczka, a dokładniej mówiąc czasy załadowania kolejnych stron. Jeżeli użytkownik całkiem zamyka przeglądarkę lub przechodzi na inną witrynę, to nie jest obliczany czas pomiędzy kolejnym żądaniem i obliczenie czasu spędzonego na ostatniej (przed zamknięciem przeglądarki czy przejściem na inną witrynę) stronie staje się niemożliwe.

W związku z tym również statystyki średniego czasu spędzonego w witrynie zostają zaniżone, ponieważ system nie rejestruje czasu spędzonego na ostatniej przed zamknięciem przeglądarki stronie. Podobnie dzieje się z użytkownikami, którzy zostali odrzuceni (lub raczej odrzucili nasz serwis). Dla nich system automatycznie przypisuje wartość 0 czasu spędzonego na stronie. Z czym również wiąże się zaniżony średni czas spędzony w ramach danej witryny.

Bardzo dobrze powyższy problem opisany został przez Avinasha Kaushika w artykule zatytułowanym Standard metrics revisited: Time on page and time on site.

Na to również jest sposób, który polega na odpowiedniej modyfikacji kodu śledzącego. Pomysł pochodzi z Magiczne SEO i SEM.

Wykorzystanie funkcji onbeforeunload

W związku z tym, że Google Analytics zbiera dane na podstawie tagów JavaScript, odpowiednia modyfikacja kodu śledzącego z wykorzystaniem funkcji tego języka pozwala na zaawansowaną modyfikację śledzenia. Jedną z takich możliwości daje zdarzenie object.onbeforeunload. Na Conversion blog zastosowaliśmy ją w sposób następujący:

1. <script type=”text/javascript”>
2. var prawdziwybouncerate_timer=0;
3. setTimeout(‚prawdziwybouncerate_timer=1’, 10000)
4. function prawdziwybouncerate_zamykane() {
5. if (prawdziwybouncerate_timer==1)
6. {
7. _gaq.push([‚_trackEvent’, ‚Zamykanie’, ‚Strona’, location.pathname])
8. }
9. }
10. window.onbeforeunload = prawdziwybouncerate_zamykane;
11. </script>

Powyższa sekcja kodu, podobnie jak samo setTimeout, które omawiałem w artykule o bounce rate powinna znaleźć się przed samym zamknięciem sekcji <body>. Podyktowane jest to faktem, że 10 sekund dla odrzucenia powinno zacząć odliczać się jak najpóźniej – po załadowaniu całej strony. Jeżeli kod zostałbym umieszczony na początku, to może dojść do sytuacji, że strona nie zdąży załadować się w całości, a użytkownik już będzie liczony jako nie-odrzucenie (bo w końcu minęło 10 sekund).

Co się dzieje w kolejnych linijkach kodu?

Powyższy skrypt wykonuje następującą akcję – dla wizyt trwających więcej niż 10 sekund wywołuje zdarzenie: _gaq.push([‚_trackEvent’, ‚Zamykanie’, ‚Strona’, location.pathname]) . Dzięki temu tworzy on kolejny stempel czasu, dla którego może być mierzona długość odwiedzin pojedynczej strony jak również całej wizyty na stronie.

Implementacja na naszym blogu

Podpatrując pomysł Magicznego SEO i SEM, sami postanowiliśmy zaimplementować to rozwiązanie u siebie – było to pod koniec lipca. Porównując następnie miesiące lipiec i sierpień można zauważyć znaczny wzrost średniego czasu spędzonego na stronie.

Średni czas na stronie przed i po wprowadzeniu zdarzenia onbeforeunload

Jak widzisz, na naszym blogu średni czas na stronie zwiększył się ponad 3 krotnie po wprowadzeniu omawianego śledzenia zdarzeń. Taki wzrost z pewnością podyktowany jest tym, że blogi są specyficznymi serwisami tzn. charakteryzują się bardzo wysokim współczynnikiem odrzuceń, w jego standardowej definicji, stąd wprowadzenie omówionej modyfikacji kodu śledzącego spowodowało tak duży wzrost.

Podsumowanie

Mam nadzieję, że Wy również zaczerpniecie z tego pomysłu i zaimplementujecie powyższe rozwiązanie w swoim serwisie. Oczywiście nie jest one doskonałe – głównie z tego względu, o którym pisał Michał Małaj w komentarzu do naszego artykułu o bounce rate. Wygaśniecie sesji spowoduje, że ten sam użytkownik będzie oznaczony w dwóch sesjach, co więcej w każdej z czasem 0.

Dlaczego?

Google Analytics (standardowo) po 30 minutach nieaktywności kończy sesję (przeczytaj o tym, jak Google Analytics wylicza czas trwania sesji). Co więc, jeżeli użytkownik otworzy naszą stronę (powiedzmy A), nie wykona żadnej aktywności przez 2h (po pójdzie spać) i wróci po 2h do naszego artykułu, następnie spędzi tam 10 minut i zamknie stronę? Wtedy będziemy mieli 2 wizyty do strony A z których obie będą trwały 0 (bo nie ma pomiędzy czym zmierzyć czasu – omawiany kod nie został ponownie załadowany). Normalnie (bez tego kodu), mielibyśmy jedną wizytę trwającą 0.

Najważniejsze jest, abyś to Ty czuł się z zaimplementowana metodą dobrze i potrafił z jej pomocą podejmować trafne decyzje dotyczące swojej obecności w internecie. Z pewnością jest jeszcze kilka rozwiązań dotyczących omawianego problemu pomiaru czasu na stronie wyjścia i każda ma swoje plusy i minusy. Jeżeli masz swoje ulubione lub takie, które Twoim zdaniem jest najlepsze, to proszę podziel się z nami:)

Jeśli potrzebujesz audytu konfiguracji narzędzi analitycznych (Google Analytics, AT Internet, Adobe Analytics czy Webtrends) lub chcesz rozwijać analitykę internetową wewnątrz organizacji skontaktuj się z Conversion by poznać nasze podejście. Więcej o analityce internetowej dowiesz się pobierając przygotowane przez nas bezpłatne poradniki, raporty oraz case studies.

Autor: Mariusz

To właśnie on odpowiada za wdrażanie analityki internetowej u naszych klientów. Skończył Szkołę Główną Handlową na kierunku Metody Ilościowe w Ekonomii i Systemy Informacyjne. Walczy obecnie o tytuł doktora :) Często możecie poczytać jego artykuły na naszym blogu oraz w prasie branżowej. Aaa.. coś jeszcze – Mariusz pilnuje by praca projektowa szła zgodnie z harmonogramem, i właśnie dlatego wszyscy tak bardzo go lubimy.





  • Michał Małaj

    To są rozwiązania dla małych stronek. Przy dużych serwisach _gaq.push(['_trackEvent', …]) prowadzi do anomali ( tj może zajść nie uwzględniania danych i Google zastosuje normalizację to oznacza że nie będzie przechowywał wszystkich danych zebranych w ten sposób) Tak jak pisze "For each visit (user session), a maximum of approximately 500 combined GATC requests (both events and page views) can be tracked." http://code.google.com/apis/analytics/docs/tracki…. Oznacza to że tego należałoby unikać w rozwiązaniach e-commerce ładowania dodatkowych pomiarów gdy to nie jest takie konieczne. A pomiar czasu przebywania użytkownika nie musi być monitorowany na każdej podstronie serwisu WWW, tylko na przykład na landing pages, na stronach testów a/b
    Do takich rzeczy opisanych w artykule już lepiej użyć TimeTrackera – http://code.google.com/apis/analytics/docs/tracki

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Dzięki Michał za komentarz. Rzeczywiście – stosujemy to rozwiązanie jedynie na swoim blogu, nie implementowaliśmy go na innych stronach, więc nie mogę się wypowiedzieć jak jest w dużych serwisach. Apropos TimeTracker… czy stosowałeś go i możesz powiedzieć jak wygląda jego skuteczność (również w dużych serwisach)? Czy możesz podać przykład kodu jak go instalowałeś?

  • http://ucd.com.pl Mariusz

    Hmmm dziwne, że nie można komentować artykułu pod nim, tylko trzeba kliknąć na komenty przy tytule arta. Świetny artykuł, opisuje stary problem i fajne rozwiązanie tego problemu. Ja ostatnio miałem do czynienia z dużą ilością odrzuceń w serwisie klienta, nie byłem w stanie sprawdzić czasu BR, ale nagrywanie sesji użytkowników – zebraliśmy około 300 dało nam bardzo dobrą wiedzę na temat tego dlaczego użytkownicy wychodzą ze strony. I tutaj też pojawił się też ciekawy problem tego w jaki sposób online (obejrzę zdjęcie produktu i pójdę do sklepu offline) oddziaływuje na sferę offline, bo rzeczony klienta ma też sklepy offline'owe…..

  • http://www.conversion.pl/blog Mariusz Michalczuk

    @Mariusz: Można, można, ale tylko z poziomu artykułu… Jeżeli czytasz post na stronie głównej, wówczas nie możesz komentować, ponieważ formularz komentarzy jest tam niewidoczny:]
    Jeżeli chodzi o omawiany przez Ciebie problem – nie wiem, jak to wyglądało w Twoim przypadku, ale zazwyczaj na stronach są zdjęcia miniaturki, co powoduje, że użytkownicy klikają w nie, aby je powiększyć i lepiej obejrzeć produkt. Jeżeli zaimplementowane zostało śledzenie zdarzeń kliknięcia w obrazek, wówczas GA nie powinien policzyć takiej wizyty jako BR:)
    Jeżeli chodzi o przenikanie się on-line i off-line to wydaje mi się, że nigdy tego nie unikniemy:) Tym bardziej analiza ruchu na stronie jest jeszcze bardziej ciekawa – również o tym pisaliśmy: http://www.conversion.pl/blog/2010/06/sledzenie-k

  • http://www.conversion.pl/blog/ Paweł Ogonowski

    @Mariusz: a dla ułatwienia, dodaliśmy link w stopce każdego postu kierujący do komentarzy, który pojawia się również na stronie głównej – dzięki za hint ;)

  • http://www.silesiasem.pl Artur

    Zaaplikowałem podaną funkcję, ale jeszcze nie udało mi się jej zmusić do działania. Liczba zdarzeń od 2 dni wynosi zero. Możecie podpowiedzieć co jest nie tak. Pacjent w linku.

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Cześć! Błąd leży najprawdopodobniej w kodzie, w poniższej linijce:

    setTimeout(‘prawdziwybouncerate_timer=1', 10000)

    przed prawdziwybouncerate_timer=1 jest zły apostrof (tzw. ucho:P). Wygląda mi to na takie wstawione z programu do edycji tekstu, kiedy powinno być takie jak z prawej strony.

    Zmień to i powiedz czy zadziałało:)

  • http://www.silesiasem.pl Artur

    Pacjent wyleczony, choć jeszcze 4 ucha znalazłem :) a przeklejałem kod z waszego przykładu. Dzięki za pomoc.

    • http://www.conversion.pl/blog/ Paweł Ogonowski

      Fakt – nasz błąd. Czasami jak sprawdzamy niektóre elementy w Wordzie, to robi nam on kawały i zamienia " i ' :)

      Już poprawione i powinno być ok.

  • Pingback: Google Analytics – powrót do podstaw. Rzut oka na „podstawowe” miary | Silesia SEM()

  • http://smartyou.pl Piotr

    Hmm, a czy istnieje możliwość że ten kod popada w konflikt z jakimś innym i przez to nie działa? ;) Męczę się z tym już nie wiadomo ile i za każdym razem gdy robię test (keyword w google, przejście na strone, posiedzenie z 2 min) następnego dnia i tak dla tej frazy wyrzuca mi czas 0:00 i bounce rate na 100%. Będę wdzięczny za każdy trop który mogę sprawdzić ;)

  • http://www.conversion.pl/blog Mariusz

    Tak, to jest możliwe, że skrypt gryzie się z innym kodem. Spróbuj w pierwszej kolejności zastosować rozwiązanie podane w tym artykule: http://www.conversion.pl/blog/2010/12/wszystko-o-… – jest dużo prostsze i jest większe prawdopodobieństwo, że zadziała. Jeżeli tak będzie, to zastanowimy się, co w tym przypadku może nie chodzić:)

  • http://smartyou.pl Piotr

    Niestety, również ten kod nie działa – zauważyłem jednak, że po jego wklejeniu usuwa mi wszystkie znaki "" U mnie wygląda tak:

    setTimeout(‘_gaq.push(['_trackEvent', 'NoBounce', 'Over 10 seconds'])’,10000);

    A powinien chyba:

    setTimeout(‘_gaq.push(['_trackEvent', 'NoBounce', 'Over 10 seconds'])’,10000);

    • http://www.conversion.pl/blog Mariusz

      Tak jak spojrzałem u Ciebie na stronie, to wydaje mi się, że problem tkwi w apostrofach – najlepiej wklej kod do notepada i zamień wszystkie ' (apostrofy). Daj znać czy pomogło:)

  • http://smartyou.pl Piotr

    aj – apostrofy poprawione i niestety na kw z wyszukiwarki nadal bounce rate na poziomie 100%. Pomysły? ;>

  • http://www.conversion.pl/blog Mariusz

    Ahh no tak! Nie zwróciłem wcześniej na to uwagi, ale masz zainstalowany stary kod śledzący GA JS, a kod jest dla najnowszego kodu asynchronicznego (swoją droga bardzo polecam migrację:)).

    Dla kodu drugiej generacji należy wkleić:

    setTimeout('pageTracker._trackEvent('Time', NoBounce', Over10sec')',10000);

  • http://smartyou.pl Piotr

    O kurcze, na bazowy kod ga nawet nie patrzyłem :) Super – kod podmieniłem i zakładam, że tutaj był pies pogrzebany więc od razu wrzuciłem kod z prawdziwym czasem na stronie – dzięki Serdeczne. Za pomoc i cierpliwość :)

  • http://www.conversion.pl/blog Mariusz

    Teraz wygląda ok:) Proponuję jedynie zgodnie z rekomendacjami Google GATC zamieścić przed zamknięciem </head>. Pamięta również, jeżeli masz jakieś bardziej zaawansowane funkcje typu śledzenie zdarzeń lub wirtualne odsłony, to również lekko zmieni się składnia:) Daj znać, jak wyszło.

  • http://smartyou.pl Piotr

    Wyszło, tzn wszystko działa tak jak w końcu powinno :) Co do umieszczenia kodu to na razie chyba nie dam rady tego przerzucić (szablon wkleja tak a nie inaczej) ale popracuje nad tym :) Jeszcze raz dzięki serdeczne za pomoc!

    • Mariusz Michalczuk

      Cieszę się:) W takim wypadku życzę dużo wniosków z analiz!:)

  • Monika

    A czy wszystkie przeglądarki wspierają onbeforeunload? Czy Chrome i Firefox na pewno wspiera?

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Monika, czy wszystkie to nie wiem. Ja korzystam z Chrome 27 i FF 21 i w obu przypadkach ta funkcja działa. Czy masz inne doświadczenie?

  • Monika

    Mariusz – dzięki za odpowiedź. Dowiedziałam się od programisty, że jest ryzyko, że nie we wszystkich wersjach Chrome i FF to zadziała – do potwierdzenia. Ale nawet jeśli w jakiejś wersji nie zadziała, to po prostu w tym przypadku średni czas na stronie nie uwzględni czasu spędzonego na ostatniej stronie przed wyjściem, tak?

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Dokładnie tak. Będzie to widoczne również w raportach Odbiorcy > Technologia.

  • http://www.marcinwsol.pl Marcin

    Cześć,
    A jak wygląda ten kod dla Universal Analytics? Nie mogę nigdzie w sieci znaleźć info o tym :(

  • Monika

    Ale ani window.onbeforeunload, ani setTimeout nie są jeszcze dostępne z poziomu Google Tag Managera? Szkoda!

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Marcin, podejrzewam (nie sprawdzałem), że różni się tylko linijką dotyczącą zdarzenia (nr 7), które w Universal Analytics ma trochę inną składnię niż w Google Analytics. Pozostałe rzeczy w tym kodzie to są standardową składnią JS.

  • Miłosz

    Ma ktoś może pomysł co tu zmienić bo niestety na Universal Analytics nie działa w takiej postaci?

    <script type=”text/javascript”>
    var prawdziwybouncerate_timer=0;
    setTimeout('pageTracker._trackEvent('Time', NoBounce', Over10sec')',10000);
    function prawdziwybouncerate_zamykane() {
    if (prawdziwybouncerate_timer==1)
    {
    _gaq.push(['_trackEvent', 'Zamykanie', 'Strona', location.pathname])
    }
    }
    window.onbeforeunload = prawdziwybouncerate_zamykane;
    </script>

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Miłosz, spróbuj zastąpić linijkę nr 7 zdarzeniem Universal Analytics. Daj znać, co wyszło.

  • http://www.marcinwsol.pl Marcin

    Mariusz, dzięki za odpowiedź. Sprawdzę w wolnej chwili i dam znać. czy działa.

    Miłosz, u Ciebie działa?

  • Piotr

    Panie Mariuszu,
    Chciałbym zweryfikować prawdziwy czas użytkowników również na mojej stronie, ale także chciałbym sprawdzać prawdziwy współczynnik odrzuceń. Czyli połączyć wnioski z Pańskich 2 artykułów (Prawdziwy czas na stronie w Google Analytics i Wszystko o bounce rate, czyli współczynniku odrzuceń). Moim problemem jest to, że nie wiem jak mam wkleić kody tak aby działały obydwa na raz. Poniżej wkleiłem kody, czy mogę je zamieścić w dokładnie takiej formie jak wkleiłem i spodziewać się poprawnych danych?

    <script type=”text/javascript”>
    var prawdziwybouncerate_timer=0;
    setTimeout(‚prawdziwybouncerate_timer=1′, 10000)
    function prawdziwybouncerate_zamykane() {
    if (prawdziwybouncerate_timer==1)
    {
    _gaq.push(['_trackEvent', 'Zamykanie', 'Strona', location.pathname])
    }
    }
    window.onbeforeunload = prawdziwybouncerate_zamykane;
    </script>
    <script type=”text/javascript”>

    setTimeout(‚_gaq.push(['_trackEvent', 'NoBounce', 'Over 10 seconds'])’,10000);

    </script>

    </body>

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Witam, w rzeczywistości, kod z tego artykułu załatwia dwie kwestie tj. śr. czas wizyty oraz współczynnik odrzuceń, ponieważ są one de facto ze sobą połączone. Także wystarczy, że użyje Pan kodu z tego artykułu i zarówno będzie Pan liczył "prawdziwy" współczynnik odrzuceń jak i śr. czas trwania wizyty. Proszę tylko pamiętać, aby skrypt umieścić na dole strony (przed zamknięciem </body>).

  • Piotr

    Panie Mariuszu,
    Poprawiłem kod w witrynie zgodnie z Pańskimi uwagami. Wygląda on teraz tak:

    var prawdziwybouncerate_timer=0;
    setTimeout(setprawdziwy, 10000);
    function setprawdziwy(){
    prawdziwybouncerate_timer=1;
    }
    function prawdziwybouncerate_zamykane() {
    if (prawdziwybouncerate_timer==1)
    {
    _gaq.push(['_trackEvent', 'Zamykanie', 'Strona', location.pathname])
    }
    }
    window.onbeforeunload = prawdziwybouncerate_zamykane;

    Zauważyłem, że średni czas na stronie wzrósł o koło 90-100%, a współczynnik odrzuceń zmalał o koło 50% i jestem z tego faktu bardzo zadowolony:)
    Pojawiła się inna kwestia. Widzę, że w zakładce (zachowanie -zawartość witryny-wszystkie strony) czasy odwiedzin na podstronach strasznie poszybowały w górę. W ostatnich dniach dochodzi to nawet do 20 minut. Natomiast średni czas odwiedzin dla całej strony wynosi ~2 minuty. Jak mam więc utworzyć taki raport niestandardowy pokazujący nieco prawdziwszy czas całej strony oraz poszczególnych podstron?

  • http://www.conversion.pl/blog Mariusz Michalczuk

    Zachowanie Pana metryk jest normalne. W definicji średni czas na stronie to iloraz sumy czasów spędzonych na stronie przez różnicę odsłon tej strony oraz liczby wyjść z serwisu z poziomu tej strony. Taka metryka jest dosyć logiczna, ponieważ standardowo na stronie wyjścia czas na niej spędzony nie jest liczony, stąd nie jest ona uwzględniona w mianowniku. W momencie, kiedy zmienił Pan fakt, że przy wyjściu z serwisu czas na stronie wyjścia jest liczony (dzięki zastosowanemu kodowi), to ciągle nie zmienił się mianownik średniego czasu na stronie mimo że, w liczniku jest ten czas wlicza się do sumy.

    W związku z tym musimy sobie samodzielnie policzyć "właściwy" śr. czas spędzony na stronie. Najlepiej jest to zrobić, jak Pan wspomniał z pomocą raportu niestandardowego. W takim raporcie w wymiarze powinien mieć Pan Stronę, natomiast w metrykach Odsłony oraz Czas spędzony na stronie (uwaga: nie może to być Śr. czas spędzony na stronie). Wówczas po utworzeniu takiego raportu i eksporcie go do arkusza kalkulacyjnego należy policzyć nowy śr. czas na stronie dzielą Czas spędzony na stronie poprzez liczbę odsłon danej strony.

x

Pobierz najnowsze case study

Przeczytaj jak Limango Polska wykorzystuje potencjał analityki internetowej w swojej organizacji.

Pobierz case study
Przeczytaj poprzedni wpis:
Jak wykorzystać alerty w Google Analytics?

Dzisiejsze tempo życia oraz ogrom obowiązków (nie tylko) zawodowych sprawiają, że mamy bardzo dużo na głowie. Różnego rodzaju organizery czy...

Zamknij