Pomiary w wielu domenach

Z tego przewodnika dowiesz się, jak za pomocą tagu analytics.js mierzyć zdarzenia w wielu domenach.

Przegląd

Biblioteka analytics.js używa unikalnego identyfikatora klienta do określenia, czy użytkownik jest nowy czy powracający. Użytkownik jest uważany za powracającego, jeśli działanie o pasującym identyfikatorze klienta zostało już wysłane do tej samej usługi.

Domyślnie identyfikator klienta jest przechowywany w plikach cookie przeglądarki, co oznacza, że dostęp do niego mają tylko strony w tej samej domenie. Aby śledzić ten sam identyfikator klienta dla danego użytkownika w różnych domenach, skorzystaj ze śledzenia w wielu domenach.

Aby udostępniać identyfikator klienta między domenami, możesz dołączyć go jako parametr zapytania do adresów URL prowadzących z bieżącej domeny (domeny źródłowej) do domeny docelowej, w której chcesz przeprowadzać pomiary. Gdy użytkownik kliknie link lub prześle formularz w domenie źródłowej i przejdzie do domeny docelowej, kod na stronie docelowej może uzyskać dostęp do identyfikatora klienta, odczytując go z adresu URL.

Uzyskiwanie identyfikatora klienta w domenie źródłowej

Aby pobrać identyfikator klienta z domeny źródłowej, skorzystaj z metody get:

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

Gdy już uzyskasz identyfikator klienta w domenie źródłowej, możesz go dodać do linków prowadzących do domeny docelowej.

<a href="https://destination.com/?clientId=XXXXXX">destination.com</a>

Ustawianie identyfikatora klienta w domenie docelowej

Możesz wskazać obiektowi śledzenia w domenie docelowej, którego identyfikatora klienta ma używać, podając pole identyfikatora klienta w poleceniu create:

ga('create', 'UA-XXXXX-Y', 'auto', {
  'clientId': getClientIdFromUrl()
});

Jeśli identyfikator klienta już istnieje w domenie docelowej, ta metoda go zastąpi.

Wykrywam udostępnianie URL-i

Potencjalny problem z przekazywaniem identyfikatora klienta w adresie URL polega na tym, że użytkownicy udostępniają adresy URL, a użytkownik może dzielić się adresem URL zawierającym identyfikator klienta należący do innej osoby.

Jednym ze sposobów uniknięcia tego problemu jest dodanie sygnatury czasowej do identyfikatora klienta. Dzięki temu możesz wykryć, kiedy adres URL został pierwotnie utworzony. Jeśli upłynęło zbyt dużo czasu, identyfikator klienta może być nieprawidłowy. Oprócz sygnatury czasowej możesz dołączyć ciąg klienta użytkownika albo inne metadane związane z przeglądarką lub urządzeniem. Jeśli w domenie docelowej metadane się nie zgadzają, rozpoznasz identyfikator klienta pochodzący od innej osoby.

Ignorowanie samodzielnych odesłań

Nowa kampania odsyłająca zostanie utworzona za każdym razem, gdy strona odsyłająca do dokumentu pochodzi z nazwy hosta, która nie pasuje do żadnej z pozycji na liście wykluczeń stron odsyłających dla Twojej usługi.

Domyślnie lista wykluczeń witryn odsyłających zawiera tylko domenę podaną przez Ciebie podczas tworzenia usługi. Aby zapobiec generowaniu nowych kampanii dotyczących witryn odsyłających, gdy użytkownicy przechodzą między domenami, musisz dodać na liście wykluczeń witryn odsyłających pozycję dla każdej domeny, którą chcesz objąć pomiarem.

Elementy iframe

Opisana powyżej metoda wymaga kodu JavaScript, który uruchamia się po wczytaniu pliku analytics.js. Elementy <iframe> zazwyczaj znajdują się na stronie przed wczytaniem tagu analytics.js, więc dołączenie identyfikatora klienta do adresu URL w parametrze źródłowym elementu iframe nie jest dobrym rozwiązaniem.

Aby rozwiązać ten problem, możesz skonfigurować stronę wewnątrz elementu iframe tak, aby opóźniała utworzenie skryptu śledzenia do momentu otrzymania danych identyfikatora klienta ze strony nadrzędnej. Na stronie nadrzędnej skonfigurujesz wysyłanie identyfikatora klienta do strony iframe za pomocą polecenia postMessage.

Oto przykład kodu strony nadrzędnej w witrynie source.com:

<iframe id="destination-frame" src="https://destination.com"></iframe>

<script>
ga('create', 'UA-XXXXX-Y', 'auto');
ga(function(tracker) {
  // Gets the client ID of the default tracker.
  var clientId = tracker.get('clientId');

  // Gets a reference to the window object of the destionation iframe.
  var frameWindow = document.getElementById('destination-frame').contentWindow;

  // Sends the client ID to the window inside the destination frame.
  frameWindow.postMessage(clientId, 'https://destination.com');
});
</script>

Oto kod, który otrzymałby wiadomość w elemencie iframe hostowanym na destination.com:

window.addEventListener('message', function(event) {
  // Ignores messages from untrusted domains.
  if (event.origin != 'https://destination.com') return;

  ga('create', 'UA-XXXXX-Y', 'auto', {
    clientId: event.data
  });
});

Może się zdarzyć, że kod analytics.js nie załaduje się na stronie nadrzędnej, a strona w elemencie iframe nie otrzyma identyfikatora klienta. Sposób postępowania w takim przypadku zależy od tego, jak ważne jest to, aby identyfikatory klientów były zgodne.

Jeśli chcesz zbierać dane tylko wtedy, gdy identyfikatory klientów są takie same, wystarczy podać kod powyżej. Jeśli chcesz przechwytywać dane znajdujące się na stronie w ramce niezależnie od tego, czy otrzyma ona identyfikator klienta ze strony nadrzędnej, musisz dodać kreację zastępczą.

Ten kod używa limitu czasu na stronie w elemencie iframe, by uwzględnić przypadki, gdy strona nadrzędna działa wolno lub nie wysyła identyfikatora klienta:

// Stores whether or not the tracker has been created.
var trackerCreated = false;

function createTracker(opt_clientId) {
  if (!trackerCreated) {
    var fields = {};
    if (opt_clientId) {
      fields.clientId = opt_clientId;
    }

    ga('create', 'UA-XXXXX-Y', 'auto', fields);
    trackerCreated = true;
  }
}


window.addEventListener('message', function(event) {
  // Ignores messages from untrusted domains.
  if (event.origin != 'https://destination.com') return;

  // Creates the tracker with the data from the parent page.
  createTracker(event.data);
});


// Waits for three seconds to receive the client ID from the parent page.
// If that doesn't happen, it creates the tracker as normal.
setTimeout(createTracker, 3000);