Zum Inhalt springen

Google Tag Manager mit dem Braze SDK

Erfahren Sie, wie Sie den Google Tag Manager (GTM) mit dem Braze SDK verwenden, um das Braze-Event-Tracking und Aktualisierungen von Nutzer:innen-Attributen per Fernzugriff zu steuern, ohne Codeänderungen oder neue App-Releases zu benötigen.

Über Google Tag Manager für das Internet

Mit dem Google Tag Manager (GTM) können Sie per Fernzugriff Tags auf Ihrer Website hinzufügen, entfernen und bearbeiten, ohne dass eine Freigabe des Produktionscodes oder technische Ressourcen erforderlich sind. Braze bietet die folgenden Templates für das Internet-SDK an:

Tag-Typ Anwendungsfall
Initialisierungs-Tag Mit diesem Tag können Sie das Braze Internet-SDK integrieren, ohne den Code Ihrer Website ändern zu müssen.
Aktions-Tag Mit diesem Tag können Sie Content Cards erstellen, Nutzer:innen-Attribute festlegen, E-Commerce-Events protokollieren und die Datenerfassung verwalten.

Tag-Sequenzierung für Braze-Aktions-Tags

Das Braze-Initialisierungs-Tag muss vor allen Tags ausgelöst werden, die Braze-SDK-Methoden aufrufen (wie braze.getUser(), braze.logCustomEvent() oder braze.logPurchase()). Wenn diese Methoden ausgelöst werden, bevor das SDK initialisiert ist, können Fehler wie Uncaught TypeError: Cannot read properties of undefined (reading 'getUser') auftreten.

So konfigurieren Sie die Tag-Sequenzierung im Google Tag Manager:

  1. Öffnen Sie das Tag, das Braze-SDK-Methoden aufruft (z. B. ein Custom-HTML-Tag oder ein Braze-Aktions-Tag).
  2. Gehen Sie zu Advanced Settings > Tag Sequencing.
  3. Wählen Sie A tag that fires before [this tag] is fired.
  4. Wählen Sie Ihr Braze Initialization-Tag aus.

Dadurch wird sichergestellt, dass das SDK vollständig geladen ist, bevor andere Tags versuchen, Braze-Methoden aufzurufen.

Weitere Informationen finden Sie unter Tag-Sequenzierung für angepasste Events überprüfen.

Käufe mit GTM protokollieren

In Braze-Aktions-Tags und Custom-HTML-Tags können Sie braze.logPurchase() aufrufen, um Umsätze zu erfassen. Der veraltete Namespace appboy.logPurchase() wird in aktuellen Internet-SDK-Integrationen nicht unterstützt.

E-Commerce-Events mit GTM protokollieren

Verwenden Sie den Tag-Typ Log eCommerce Event (New) im Braze-Aktions-Tag, um empfohlene E-Commerce-Events von Ihrem GTM-Data-Layer an Braze zu senden. Das Tag ruft braze.logEcommerceEvent() auf und erfordert Internet-SDK 6.8.0 oder höher. Stellen Sie sicher, dass Ihr Braze-Initialisierungs-Tag eine kompatible SDK-Version lädt.

Das Tag unterstützt die folgenden Events:

Tag-Event-Typ Braze-Event
Product Viewed ecommerce.product_viewed
Cart Updated ecommerce.cart_updated
Checkout started ecommerce.checkout_started
Order placed ecommerce.order_placed

Um ecommerce.order_cancelled oder ecommerce.order_refunded zu protokollieren, verwenden Sie ein Custom HTML-Tag, das braze.logCustomEvent() aufruft. Beispiele finden Sie unter E-Commerce-Events protokollieren.

Schritt 1: Event in den Data Layer pushen

Pushen Sie in Ihrem Website-Code das Event und sein ecommerce-Objekt in den Data Layer. Standardmäßig liest das Tag das Standard-GA4-E-Commerce-Data-Layer-Format. Um beispielsweise eine Bestellung zu protokollieren:

dataLayer.push({
  event: "purchase",
  ecommerce: {
    transaction_id: "T_12345",
    value: 29.97,
    currency: "USD",
    items: [
      {
        item_id: "SKU_12345",
        item_name: "Stan and Friends Tee",
        item_variant: "green",
        price: 9.99,
        quantity: 3
      }
    ]
  }
});

Braze erwartet IDs wie item_id und transaction_id als Strings. Pushen Sie sie als Strings, auch wenn Ihre IDs numerisch sind.

Schritt 2: Trigger in GTM erstellen

  1. Gehen Sie in Ihrem GTM-Container zu Triggers und erstellen Sie einen neuen Trigger.
  2. Setzen Sie den Trigger Type auf Custom Event.
  3. Setzen Sie den Event Name auf das Event, das Sie in den Data Layer gepusht haben (z. B. purchase).

Schritt 3: Braze-Aktions-Tag erstellen

  1. Gehen Sie in GTM zu Tags und erstellen Sie ein neues Tag mit dem Tag-Typ Braze Actions Tag.
  2. Setzen Sie den Tag Type auf Log eCommerce Event (New).
  3. Wählen Sie einen eCommerce Event Type aus.
  4. Geben Sie die Felder für diesen Event-Typ ein, wie in der folgenden Tabelle beschrieben.
  5. (Optional) Fügen Sie Metadaten hinzu.
  6. Wählen Sie unter Triggering den Trigger aus, den Sie in Schritt 2 erstellt haben.
  7. Konfigurieren Sie die Tag-Sequenzierung, damit das Braze-Initialisierungs-Tag zuerst ausgelöst wird.
  8. Speichern und veröffentlichen Sie Ihren Container.
E-Commerce-Event-Typ Tag-Felder Erforderliche Data-Layer-Werte
Product Viewed Keine. ecommerce.items und ecommerce.currency. Das erste Element ist das angesehene Produkt.
Cart Updated Cart ID ist erforderlich. Cart Update Action ist Replace, Add oder Remove und ist standardmäßig Replace. ecommerce.items und ecommerce.currency. ecommerce.value ist erforderlich, wenn die Aktion Replace ist.
Checkout started Checkout ID ist erforderlich. Cart ID ist optional. ecommerce.items, ecommerce.currency und ecommerce.value.
Order placed Cart ID ist optional. ecommerce.items, ecommerce.currency, ecommerce.value und ecommerce.transaction_id.

Wenn ecommerce.currency nicht gesetzt ist, verwendet das Tag das Feld currency des ersten Elements. Das Tag setzt die Event-source auf google_tag_manager_web.

Data-Layer-Zuordnung

Wenn Automatically parse e-commerce event from the data layer ausgewählt ist (Standard), ordnet das Tag Data-Layer-Werte den Braze-Event-Eigenschaften wie folgt zu:

Braze-Eigenschaft Data-Layer-Wert
currency ecommerce.currency
total_value ecommerce.value
order_id ecommerce.transaction_id
products[].product_id ecommerce.items[].item_id
products[].product_name ecommerce.items[].item_name
products[].variant_id ecommerce.items[].item_variant. Standardmäßig item_id.
products[].price ecommerce.items[].price
products[].quantity ecommerce.items[].quantity. Standardmäßig 1.
products[].image_url ecommerce.items[].image_url
products[].product_url ecommerce.items[].product_url

Event-Werte manuell eingeben

Wenn Ihre Website ein benutzerdefiniertes E-Commerce-Data-Layer-Format verwendet, deaktivieren Sie Automatically parse e-commerce event from the data layer. Geben Sie dann die Event-Werte im Tag ein. Sie können GTM-Variablen in jedem dieser Felder verwenden.

Feld Beschreibung
Currency Erforderlich. Ein ISO-4217-Währungscode, z. B. USD.
Total Value Erforderlich für Cart Updated mit der Aktion Replace, Checkout started und Order placed.
Order ID Erforderlich für Order placed.
Products Erforderlich. Fügen Sie eine Zeile pro Produkt hinzu. Product ID, Product Name und Price sind erforderlich. Variant ID ist standardmäßig die Produkt-ID, und Quantity ist standardmäßig 1. Image URL, Product URL und Product Metadata (JSON) sind optional. Für Product Viewed verwendet das Tag die erste Zeile.

E-Commerce-Event-Metadaten

Fügen Sie Metadaten hinzu, um zusätzliche Schlüssel-Wert-Paare mit dem Event zu senden. Braze sendet Event-Metadaten im metadata-Objekt des Events und Produkt-Metadaten im metadata-Objekt jedes Produkts.

Event-Metadaten

Verwenden Sie die Tabelle eCommerce Event Metadata, um Metadaten auf Event-Ebene hinzuzufügen. Diese Tabelle ist verfügbar, unabhängig davon, ob das automatische Parsing aktiviert ist oder nicht. Geben Sie für jede Zeile einen Metadata property key und einen Metadata property value ein. Sie können eine GTM-Variable als Wert verwenden. Das Tag überspringt Zeilen mit leerem Schlüssel oder leerem Wert.

Einige Event-Typen unterstützen anerkannte Metadaten-Schlüssel. Verwenden Sie beispielsweise checkout_url für Checkout started und order_status_url für Order placed. Die vollständige Liste finden Sie unter Event-Schemas.

Produkt-Metadaten

Verwenden Sie die Spalte Product Metadata (JSON) der Tabelle Products, um Metadaten zu einem einzelnen Produkt hinzuzufügen. Geben Sie ein JSON-Objekt ein, z. B. {"color": "green", "size": "M"}. Produkt-Metadaten unterliegen den folgenden Einschränkungen:

  • Produkt-Metadaten sind nur verfügbar, wenn Sie Automatically parse e-commerce event from the data layer deaktivieren.
  • Das Tag sendet Produkt-Metadaten für Events vom Typ Cart Updated, Checkout started und Order placed. Für Product Viewed werden keine Produkt-Metadaten gesendet, da dieses Event kein Produkt-Array hat. Verwenden Sie stattdessen die Tabelle eCommerce Event Metadata für Product Viewed.
  • Wenn das JSON kein gültiges Objekt ist, wird es vom Tag ignoriert.

E-Commerce-Events überprüfen

Das Braze Internet-SDK validiert jedes E-Commerce-Event. Wenn ein Wert ungültig ist, protokolliert das SDK das Event nicht und schreibt einen Fehler in die Browser-Konsole. GTM zeigt das Tag trotzdem als ausgelöst an. So beheben Sie ein fehlendes Event:

  1. Wählen Sie im Tag Enable GTM Tag Debugging aus. Das Tag protokolliert dann eine Nachricht in der Browser-Konsole, wenn es einen Data-Layer-Wert nicht lesen kann, keine Produkte findet oder ungültige Produkt-Metadaten ignoriert.
  2. Öffnen Sie die Entwicklerkonsole Ihres Browsers und suchen Sie nach Fehlern des Braze Internet-SDK.
  3. Prüfen Sie die erforderlichen Felder für Ihren Event-Typ. Stellen Sie sicher, dass IDs Strings sind, dass price und total_value gültige Zahlen sind und dass quantity eine ganze Zahl ist.

Informationen zu Event-Schemas und Ingestion-Validierung finden Sie unter E-Commerce-Events protokollieren und Event-Validierung und Fehlerbehebung.

Angepasste Events mit GTM protokollieren

Sie können angepasste Events mit einem Custom HTML-Tag in GTM protokollieren. Dieser Ansatz verwendet den GTM-Data Layer, um Event-Daten von Ihrer Website an ein GTM-Tag zu übergeben, das das Braze Internet-SDK aufruft.

Schritt 1: Event in den Data Layer pushen

Pushen Sie in Ihrem Website-Code überall dort, wo Sie das angepasste Event triggern möchten, ein Event in den Data Layer. Um beispielsweise ein angepasstes Event beim Klicken eines Buttons zu protokollieren:

<button onclick="dataLayer.push({'event': 'my_custom_event'});">Track Event</button>

Schritt 2: Trigger in GTM erstellen

  1. Gehen Sie in Ihrem GTM-Container zu Triggers und erstellen Sie einen neuen Trigger.
  2. Setzen Sie den Trigger Type auf Custom Event.
  3. Setzen Sie den Event Name auf denselben Wert, den Sie in den Data Layer gepusht haben (z. B. my_custom_event).
  4. Wählen Sie aus, wann der Trigger ausgelöst werden soll (z. B. All Custom Events).

Schritt 3: Custom-HTML-Tag erstellen

  1. Gehen Sie in GTM zu Tags und erstellen Sie ein neues Tag.
  2. Setzen Sie den Tag Type auf Custom HTML.
  3. Fügen Sie im HTML-Feld Folgendes hinzu:

     <script>
     window.braze.logCustomEvent("my_custom_event");
     </script>
    
  4. Wählen Sie unter Triggering den Trigger aus, den Sie in Schritt 2 erstellt haben.
  5. Speichern und veröffentlichen Sie Ihren Container.

Um Event-Eigenschaften einzuschließen, übergeben Sie sie als zweites Argument:

<script>
window.braze.logCustomEvent("my_custom_event", {"property_key": "property_value"});
</script>

Strikte CSP (nonce-basierte) Umgebungen

Das Braze-Initialisierungs-Tag unterstützt derzeit nicht die Übergabe von contentSecurityNonce an braze.initialize(). Wenn Ihre Website eine strikte nonce-basierte CSP erzwingt, verwenden Sie anstelle des Braze-Initialisierungs-Tags ein Custom HTML-Tag.

  1. Pausieren oder entfernen Sie das Braze-Initialisierungs-Tag aus Ihrem GTM-Container, wenn Sie es bereits eingerichtet haben.
  2. Pushen Sie Ihre serverseitig generierte Nonce vor dem GTM-Snippet in Ihrem Website-HTML in den dataLayer:

     <script nonce="SERVER_GENERATED_NONCE">
       dataLayer = window.dataLayer || [];
       dataLayer.push({ cspNonce: 'SERVER_GENERATED_NONCE' });
     </script>
    
  3. Erstellen Sie im GTM eine Data Layer Variable, die auf cspNonce gemappt ist (z. B. DLV - cspNonce).
  4. Erstellen Sie ein Custom HTML-Tag mit dem Trigger Initialization - All Pages:

    Passen Sie das folgende Template an Ihre Umgebung an.

     <script nonce="{{DLV - cspNonce}}">
       var s = document.createElement('script');
       s.src = 'https://js.appboycdn.com/web-sdk/YOUR_SDK_VERSION/braze.min.js';
       s.setAttribute('nonce', '{{DLV - cspNonce}}');
       s.onload = function() {
         braze.initialize('YOUR_API_KEY', {
           baseUrl: 'YOUR_SDK_ENDPOINT',
           contentSecurityNonce: '{{DLV - cspNonce}}'
         });
         braze.openSession();
       };
       document.head.appendChild(s);
     </script>
    
  5. Konfigurieren Sie für das Braze-Aktions-Tag oder alle Custom HTML-Tags, die Braze-Methoden aufrufen, die Tag-Sequenzierung, damit sie nach diesem Custom HTML-Tag ausgelöst werden.

Im Rahmen der EU-Richtlinie zur Nutzer:innen-Einwilligung von Google müssen die folgenden booleschen angepassten Attribute in den Nutzerprofilen protokolliert werden:

  • $google_ad_user_data
  • $google_ad_personalization

Wenn Sie diese über die GTM-Integration festlegen, erfordern angepasste Attribute die Erstellung eines Custom-HTML-Tags. Das folgende Beispiel zeigt, wie Sie diese Werte als boolesche Datentypen (nicht als Strings) protokollieren:

<script>
window.braze.getUser().setCustomUserAttribute("$google_ad_personalization", true);
</script>

Weitere Informationen finden Sie unter Zielgruppensynchronisierung mit Google.

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Android Braze SDK integrieren.

Google Tag Manager für Android verwenden

Im folgenden Beispiel möchte eine App für das Streamen von Musik verschiedene Ereignisse protokollieren, wenn Nutzer:innen Lieder anhören. Mit dem Google Tag Manager für Android können sie kontrollieren, welche der Braze-Drittanbieter dieses Ereignis erhalten, und Tags speziell für Braze erstellen.

Schritt 1: Erstellen Sie einen Trigger für angepasste Events

Benutzerdefinierte Ereignisse werden protokolliert, wenn actionType auf logEvent eingestellt ist. Der Anbieter der angepassten Tags von Braze erwartet in diesem Beispiel, dass der Name des angepassten Events mit eventName festgelegt wird.

Um zu beginnen, erstellen Sie einen Trigger, der nach dem “event name” namens played song sucht.

Ein angepasster Trigger im Google Tag Manager, der für einige Events triggert, wenn "Ereignisname" gleich "abgespielter Song" ist.

Als Nächstes erstellen Sie ein neues Tag (auch als “Funktionsaufruf” bezeichnet) und geben den Klassenpfad Ihres angepassten Tag-Anbieters ein, der weiter unten in diesem Artikel beschrieben wird. Dieser Tag wird ausgelöst, wenn Sie das Ereignis played song protokollieren.

In den angepassten Parametern des Tags (auch bekannt als Schlüssel-Wert-Paare) setzen Sie eventName auf played song. Dies ist der Name des angepassten Events, der in Braze protokolliert wird.

Ein Tag in Google Tag Manager mit Klassenpfad und Schlüssel-Wert-Paar-Feldern. Dieser Tag ist so eingestellt, dass er mit dem zuvor erstellten Trigger "Gespielter Song" triggert.

Sie können dem Tag auch zusätzliche Schlüssel-Wert-Paar-Argumente hinzufügen, die als Eigenschaften des angepassten Events an Braze gesendet werden. eventName und actionType werden für angepasste Event-Eigenschaften nicht ignoriert. Im folgenden Beispiel-Tag wird genre übergeben und über eine Tag-Variable im Google Tag Manager definiert, die aus dem angepassten Event stammt, das in der App protokolliert wird.

Da Google Tag Manager für Android Firebase als Datenschicht verwendet, wird die Eigenschaft genre als “Firebase - Event Parameter” an Google Tag Manager gesendet.

Eine Variable im Google Tag Manager, bei der "genre" als Ereignisparameter für den Tag "Braze - Played Song Event" hinzugefügt wird.

Wenn ein Nutzer:in der App einen Song abspielt, wird ein Ereignis über Firebase und Google Tag Manager protokolliert. Dabei wird der Name des Analytics-Ereignisses verwendet, der mit dem Triggernamen des Tags übereinstimmt: played song:

Bundle params = new Bundle();
params.putString("genre", "pop");
params.putInt("number of times listened", 42);
mFirebaseAnalytics.logEvent("played song", params);
val params = Bundle()
params.putString("genre", "pop")
params.putInt("number of times listened", 42);
mFirebaseAnalytics.logEvent("played song", params)

Schritt 2: Angepasste Attribute protokollieren

Benutzerdefinierte Attribute werden über actionType gesetzt, das auf customAttribute eingestellt ist. Der Braze Custom Tag Provider erwartet, dass der Schlüsselwert “angepasstes Attribut” über customAttributeKey und customAttributeValue gesetzt wird:

Bundle params = new Bundle();
params.putString("customAttributeKey", "favorite song");
params.putString("customAttributeValue", "Private Eyes");
mFirebaseAnalytics.logEvent("customAttribute", params);
val params = Bundle()
params.putString("customAttributeKey", "favorite song")
params.putString("customAttributeValue", "Private Eyes")
mFirebaseAnalytics.logEvent("customAttribute", params)

Schritt 3: Rufen Sie changeUser() auf

Anrufe an changeUser() erfolgen über ein actionType, das auf changeUser eingestellt ist. Der Braze Custom Tag Provider erwartet, dass die Braze-Benutzer-ID über das Schlüssel-Wert-Paar externalUserId in Ihrem Tag festgelegt wird:

Bundle params = new Bundle();
params.putString("externalUserId", userId);
mFirebaseAnalytics.logEvent("changeUser", params);
val params = Bundle()
params.putString("externalUserId", userId)
mFirebaseAnalytics.logEvent("changeUser", params)

Schritt 4: Einen angepassten Tag-Anbieter hinzufügen

Wenn Sie die Tags und Auslöser eingerichtet haben, müssen Sie auch den Google Tag Manager in Ihrer Android-App implementieren, den Sie in der Dokumentation von Google finden.

Nachdem der Google Tag Manager in Ihrer App installiert ist, fügen Sie einen angepassten Tag-Anbieter hinzu, um die SDK-Methoden von Braze auf der Grundlage der Tags aufzurufen, die Sie im Google Tag Manager konfiguriert haben.

Achten Sie darauf, den “Klassenpfad” der Datei zu notieren. Diesen geben Sie ein, wenn Sie ein Tag in der Google Tag Manager-Konsole einrichten.

Dieses Beispiel zeigt eine der vielen Möglichkeiten, wie Sie Ihren angepassten Tag-Anbieter strukturieren können. Insbesondere wird gezeigt, wie Sie anhand des vom GTM Tag gesendeten Schlüssel-Wert-Paares actionType ermitteln, welche Methode des Braze SDK aufgerufen werden soll.

Die in diesem Beispiel gezeigten actionType sind logEvent, customAttribute und changeUser, aber Sie können es vorziehen, zu ändern, wie Ihr Tag-Anbieter Daten von Google Tag Manager behandelt.

public class BrazeGtmTagProvider implements CustomTagProvider {
  private static final String TAG = BrazeLogger.getBrazeLogTag(BrazeGtmTagProvider.class);
  private static final String ACTION_TYPE_KEY = "actionType";

  // Custom Events
  private static final String LOG_EVENT_ACTION_TYPE = "logEvent";
  private static final String EVENT_NAME_VARIABLE = "eventName";

  // Custom Attributes
  private static final String CUSTOM_ATTRIBUTE_ACTION_TYPE = "customAttribute";
  private static final String CUSTOM_ATTRIBUTE_KEY = "customAttributeKey";
  private static final String CUSTOM_ATTRIBUTE_VALUE_KEY = "customAttributeValue";

  // Change User
  private static final String CHANGE_USER_ACTION_TYPE = "changeUser";
  private static final String CHANGE_USER_ID_VARIABLE = "externalUserId";

  private static Context sApplicationContext;

  /**
   * Must be set before calling any of the following methods
   * so that the proper application context is available when needed.
   *
   * Recommended to be called in your {@link Application#onCreate()}.
   */
  public static void setApplicationContext(Context applicationContext) {
    if (applicationContext != null) {
      sApplicationContext = applicationContext.getApplicationContext();
    }
  }

  @Override
  public void execute(Map<String, Object> map) {
    BrazeLogger.i(TAG, "Got google tag manager parameters map: " + map);

    if (sApplicationContext == null) {
      BrazeLogger.w(TAG, "No application context provided to this tag provider.");
      return;
    }

    if (!map.containsKey(ACTION_TYPE_KEY)) {
      BrazeLogger.w(TAG, "Map does not contain the Braze action type key: " + ACTION_TYPE_KEY);
      return;
    }
    String actionType = String.valueOf(map.remove(ACTION_TYPE_KEY));

    switch (actionType) {
      case LOG_EVENT_ACTION_TYPE:
        logEvent(map);
        break;
      case CUSTOM_ATTRIBUTE_ACTION_TYPE:
        setCustomAttribute(map);
        break;
      case CHANGE_USER_ACTION_TYPE:
        changeUser(map);
        break;
      default:
        BrazeLogger.w(TAG, "Got unknown action type: " + actionType);
        break;
    }
  }

  private void logEvent(Map<String, Object> tagParameterMap) {
    String eventName = String.valueOf(tagParameterMap.remove(EVENT_NAME_VARIABLE));
    Braze.getInstance(sApplicationContext).logCustomEvent(eventName, parseMapIntoProperties(tagParameterMap));
  }

  private BrazeProperties parseMapIntoProperties(Map<String, Object> map) {
    BrazeProperties brazeProperties = new BrazeProperties();
    for (Map.Entry<String, Object> entry : map.entrySet()) {
      final Object value = entry.getValue();
      final String key = entry.getKey();
      if (value instanceof Boolean) {
        brazeProperties.addProperty(key, (Boolean) value);
      } else if (value instanceof Integer) {
        brazeProperties.addProperty(key, (Integer) value);
      } else if (value instanceof Date) {
        brazeProperties.addProperty(key, (Date) value);
      } else if (value instanceof Long) {
        brazeProperties.addProperty(key, (Long) value);
      } else if (value instanceof String) {
        brazeProperties.addProperty(key, (String) value);
      } else if (value instanceof Double) {
        brazeProperties.addProperty(key, (Double) value);
      } else {
        BrazeLogger.w(TAG, "Failed to parse value into an BrazeProperties "
            + "accepted type. Key: '" + key + "' Value: '" + value + "'");
      }
    }

    return brazeProperties;
  }

  private void setCustomAttribute(Map<String, Object> tagParameterMap) {
    String key = String.valueOf(tagParameterMap.get(CUSTOM_ATTRIBUTE_KEY));
    Object value = tagParameterMap.get(CUSTOM_ATTRIBUTE_VALUE_KEY);

    Braze.getInstance(sApplicationContext).getCurrentUser(new IValueCallback<BrazeUser>() {
      @Override
      public void onSuccess(BrazeUser brazeUser) {
        if (value instanceof Boolean) {
          brazeUser.setCustomUserAttribute(key, (Boolean) value);
        } else if (value instanceof Integer) {
          brazeUser.setCustomUserAttribute(key, (Integer) value);
        } else if (value instanceof Long) {
          brazeUser.setCustomUserAttribute(key, (Long) value);
        } else if (value instanceof String) {
          brazeUser.setCustomUserAttribute(key, (String) value);
        } else if (value instanceof Double) {
          brazeUser.setCustomUserAttribute(key, (Double) value);
        } else if (value instanceof Float) {
          brazeUser.setCustomUserAttribute(key, (Float) value);
        } else {
          BrazeLogger.w(TAG, "Failed to parse value into a custom "
              + "attribute accepted type. Key: '" + key + "' Value: '" + value + "'");
        }
      }
    });
  }

  private void changeUser(Map<String, Object> tagParameterMap) {
    String userId = String.valueOf(tagParameterMap.get(CHANGE_USER_ID_VARIABLE));
    Braze.getInstance(sApplicationContext).changeUser(userId);
  }
}
class BrazeGtmTagProvider : CustomTagProvider {

  override fun execute(map: MutableMap<String, Any>) {
    BrazeLogger.i(TAG, "Got google tag manager parameters map: $map")

    if (sApplicationContext == null) {
      BrazeLogger.w(TAG, "No application context provided to this tag provider.")
      return
    }

    if (!map.containsKey(ACTION_TYPE_KEY)) {
      BrazeLogger.w(TAG, "Map does not contain the Braze action type key: $ACTION_TYPE_KEY")
      return
    }
    val actionType = map.remove(ACTION_TYPE_KEY).toString()

    when (actionType) {
      LOG_EVENT_ACTION_TYPE -> logEvent(map)
      CUSTOM_ATTRIBUTE_ACTION_TYPE -> setCustomAttribute(map)
      CHANGE_USER_ACTION_TYPE -> changeUser(map)
      else -> BrazeLogger.w(TAG, "Got unknown action type: $actionType")
    }
  }

  private fun logEvent(tagParameterMap: MutableMap<String, Any>) {
    val eventName = tagParameterMap.remove(EVENT_NAME_VARIABLE).toString()
    Braze.getInstance(sApplicationContext).logCustomEvent(eventName, parseMapIntoProperties(tagParameterMap))
  }

  private fun parseMapIntoProperties(map: Map<String, Any>): BrazeProperties {
    val brazeProperties = BrazeProperties()
    map.forEach { param ->
      val key = param.key
      val value = param.value
      when (value) {
        is Boolean -> brazeProperties.addProperty(key, value)
        is Int -> brazeProperties.addProperty(key, value)
        is Date -> brazeProperties.addProperty(key, value)
        is Long -> brazeProperties.addProperty(key, value)
        is String -> brazeProperties.addProperty(key, value)
        is Double -> brazeProperties.addProperty(key, value)
        else -> BrazeLogger.w(TAG, "Failed to parse value into an BrazeProperties "
            + "accepted type. Key: '" + key + "' Value: '" + value + "'")
      }
    }

    return brazeProperties
  }

  private fun setCustomAttribute(tagParameterMap: Map<String, Any>) {
    val key = tagParameterMap[CUSTOM_ATTRIBUTE_KEY].toString()
    val value = tagParameterMap[CUSTOM_ATTRIBUTE_VALUE_KEY]

    Braze.getInstance(sApplicationContext).getCurrentUser { brazeUser ->
      when (value) {
        is Boolean -> brazeUser.setCustomUserAttribute(key, value)
        is Int -> brazeUser.setCustomUserAttribute(key, value)
        is Long -> brazeUser.setCustomUserAttribute(key, value)
        is String -> brazeUser.setCustomUserAttribute(key, value)
        is Double -> brazeUser.setCustomUserAttribute(key, value)
        is Float -> brazeUser.setCustomUserAttribute(key, value)
        else -> BrazeLogger.w(
          TAG, "Failed to parse value into a custom "
            + "attribute accepted type. Key: '" + key + "' Value: '" + value + "'"
        )
      }
    }
  }

  private fun changeUser(tagParameterMap: Map<String, Any>) {
    val userId = tagParameterMap[CHANGE_USER_ID_VARIABLE].toString()
    Braze.getInstance(sApplicationContext).changeUser(userId)
  }

  companion object {
    private val TAG = BrazeLogger.getBrazeLogTag(BrazeGtmTagProvider::class.java)
    private val ACTION_TYPE_KEY = "actionType"

    // Custom Events
    private val LOG_EVENT_ACTION_TYPE = "logEvent"
    private val EVENT_NAME_VARIABLE = "eventName"

    // Custom Attributes
    private val CUSTOM_ATTRIBUTE_ACTION_TYPE = "customAttribute"
    private val CUSTOM_ATTRIBUTE_KEY = "customAttributeKey"
    private val CUSTOM_ATTRIBUTE_VALUE_KEY = "customAttributeValue"

    // Change User
    private val CHANGE_USER_ACTION_TYPE = "changeUser"
    private val CHANGE_USER_ID_VARIABLE = "externalUserId"

    private var sApplicationContext: Context? = null

    /**
     * Must be set before calling any of the following methods so
     * that the proper application context is available when needed.
     *
     * Recommended to be called in your [Application.onCreate].
     */
    fun setApplicationContext(applicationContext: Context?) {
      if (applicationContext != null) {
        sApplicationContext = applicationContext.applicationContext
      }
    }
  }
}

Fügen Sie Application.onCreate() unbedingt die folgende Initialisierung für das vorherige Snippet hinzu:

BrazeGtmTagProvider.setApplicationContext(this.getApplicationContext());
BrazeGtmTagProvider.setApplicationContext(this.applicationContext)

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Braze Swift SDK integrieren.

Google Tag Manager für Swift verwenden

Im folgenden Beispiel möchte eine App für das Streamen von Musik verschiedene Ereignisse protokollieren, wenn Nutzer:innen Lieder anhören. Mit dem Google Tag Manager für iOS können sie steuern, welche der Braze-Drittanbieter dieses Ereignis erhalten und Tags speziell für Braze erstellen.

Schritt 1: Erstellen Sie einen Trigger für angepasste Events

Benutzerdefinierte Ereignisse werden protokolliert, wenn actionType auf logEvent eingestellt ist. In diesem Beispiel erwartet der Anbieter der angepassten Tags von Braze, dass der Name des angepassten Events mit eventName festgelegt wird.

Erstellen Sie zunächst einen Trigger, der nach einer eventName sucht, die gleich played song ist.

Ein angepasster Trigger im Google Tag Manager, der für einige Events triggert, wenn "eventName" gleich "played song" ist.

Als nächstes erstellen Sie ein neues Tag (auch “Funktionsaufruf” genannt) und geben den Klassenpfad Ihres angepassten Tag-Anbieters ein, der später in diesem Artikel beschrieben wird. Dieser Tag wird ausgelöst, wenn Sie das Ereignis played song protokollieren. Da eventName auf played song eingestellt ist, wird es als angepasster Event-Name verwendet, der in Braze protokolliert wird.

Ein Tag in Google Tag Manager mit Klassenpfad und Schlüssel-Wert-Paar-Feldern. Dieser Tag ist so eingestellt, dass er mit dem zuvor erstellten Trigger "Gespielter Song" triggert.

Sie können dem Tag auch zusätzliche Schlüssel-Wert-Paar-Argumente hinzufügen, die als Eigenschaften des angepassten Events an Braze gesendet werden. eventName und actionType werden für angepasste Event-Eigenschaften nicht ignoriert. Im folgenden Beispiel-Tag übergeben Sie genre, das über eine Tag-Variable im Google Tag Manager definiert wurde und aus dem angepassten Event stammt, das in der App protokolliert wurde.

Die Event-Eigenschaft genre wird als Variable “Firebase - Event Parameter” an Google Tag Manager gesendet, da Google Tag Manager für iOS Firebase als Datenebene verwendet.

Eine Variable im Google Tag Manager, bei der "genre" als Ereignisparameter für den Tag "Braze - Played Song Event" hinzugefügt wird.

Wenn ein Nutzer:in der App ein Lied abspielt, protokollieren Sie ein Ereignis über Firebase und Google Tag Manager unter Verwendung des Firebase Analytics-Ereignisnamens, der mit dem Triggernamen des Tags übereinstimmt, played song:

let parameters: [String: Any] = ["genre": "pop",
                                 "number of times listened": 42]
Analytics.logEvent("played song", parameters: parameters)
NSDictionary *parameters = @{@"genre" : @"pop",
                             @"number of times listened" : @42};
[FIRAnalytics logEventWithName:@"played song" parameters:parameters];

Schritt 2: Angepasste Attribute protokollieren

Benutzerdefinierte Attribute werden über actionType gesetzt, das auf customAttribute eingestellt ist. Der Braze Custom Tag Provider erwartet, dass der Schlüsselwert “angepasstes Attribut” über customAttributeKey und customAttributeValue gesetzt wird:

let parameters: [String: Any] = ["customAttributeKey": "favoriteSong",
                                 "customAttributeValue": "Private Eyes"]
FIRAnalytics.logEvent(withName:"customAttribute", parameters: parameters)
NSDictionary *parameters = @{@"customAttributeKey" : @"favoriteSong",
                             @"customAttributeValue" : @"Private Eyes"};
[FIRAnalytics logEventWithName:@"customAttribute" parameters:parameters];

Schritt 3: Rufen Sie changeUser() auf

Anrufe an changeUser() erfolgen über ein actionType, das auf changeUser eingestellt ist. Der Braze Custom Tag Provider erwartet, dass die Braze-Benutzer-ID über das Schlüssel-Wert-Paar externalUserId in Ihrem Tag festgelegt wird:

let parameters: [String: Any] = ["externalUserId": "favorite userId"]
Analytics.logEvent(withName:"changeUser", parameters: parameters)
NSDictionary *parameters = @{@"externalUserId" : userId};
[FIRAnalytics logEventWithName:@"changeUser" parameters:parameters];

Schritt 4: Einen angepassten Tag-Anbieter hinzufügen

Wenn Sie die Tags und Trigger eingerichtet haben, müssen Sie auch den Google Tag Manager in Ihrer iOS App implementieren, den Sie in der Dokumentation von Google finden.

Nachdem Google Tag Manager in Ihrer App installiert ist, fügen Sie einen angepassten Tag-Anbieter hinzu, um Braze SDK-Methoden auf der Grundlage der Tags aufzurufen, die Sie im Google Tag Manager konfiguriert haben.

Achten Sie darauf, den “Class Path” der Datei zu notieren - diesen geben Sie ein, wenn Sie einen Tag in der Google Tag Manager Konsole einrichten.

Dieses Beispiel zeigt eine der vielen Möglichkeiten, wie Sie Ihren angepassten Tag-Anbieter strukturieren können. Insbesondere wird gezeigt, wie Sie anhand des vom GTM Tag gesendeten Schlüssel-Wert-Paares actionType ermitteln, welche Methode des Braze SDK aufgerufen werden soll. Dieses Beispiel setzt voraus, dass Sie die Braze-Instanz als Variable im AppDelegate zugewiesen haben.

Die in diesem Beispiel unterstützten actionType sind logEvent, customAttribute und changeUser, aber Sie können es vorziehen, zu ändern, wie Ihr Tag-Anbieter Daten von Google Tag Manager behandelt.

Fügen Sie den folgenden Code in Ihre Datei BrazeGTMTagManager.swift ein.

import FirebaseAnalytics
import GoogleTagManager
import BrazeKit

let ActionTypeKey: String = "actionType"

// Custom Events
let LogEventAction: String = "logEvent"
let LogEventName: String = "eventName"

// Custom Attributes
let CustomAttributeAction: String = "customAttribute"
let CustomAttributeKey: String = "customAttributeKey"
let CustomAttributeValueKey: String = "customAttributeValue"

// Change User
let ChangeUserAction: String = "changeUser"
let ChangeUserExternalUserId: String = "externalUserId"

@objc(BrazeGTMTagManager)
final class BrazeGTMTagManager : NSObject, TAGCustomFunction {
  @objc func execute(withParameters parameters: [AnyHashable : Any]!) -> NSObject! {
    var parameters: [String : Any] = parameters as! [String : Any]
    guard let actionType: String = parameters[ActionTypeKey] as? String else {
      print("There is no Braze action type key in this call. Doing nothing.")
      return nil
    }
    parameters.removeValue(forKey: ActionTypeKey)
    if actionType == LogEventAction {
      logEvent(parameters: parameters)
    } else if actionType == CustomAttributeAction {
      logCustomAttribute(parameters: parameters)
    } else if actionType == ChangeUserAction {
      changeUser(parameters: parameters)
    }
    return nil
  }
  
  func logEvent(parameters: [String : Any]) {
    var parameters: [String : Any] = parameters
    guard let eventName: String = parameters[LogEventName] as? String else { return }
    parameters.removeValue(forKey: LogEventName)
    AppDelegate.braze?.logCustomEvent(name: eventName, properties: parameters)
  }
  
  func logCustomAttribute(parameters: [String: Any]) {
    guard let customAttributeKey = parameters[CustomAttributeKey] as? String else { return }
    let customAttributeValue = parameters[CustomAttributeValueKey]
    
    if let customAttributeValue = customAttributeValue as? String {
      AppDelegate.braze?.user.setCustomAttribute(key: customAttributeKey, value: customAttributeValue)
    } else if let customAttributeValue = customAttributeValue as? Date {
      AppDelegate.braze?.user.setCustomAttribute(key: customAttributeKey, value: customAttributeValue)
    } else if let customAttributeValue = customAttributeValue as? Double {
      AppDelegate.braze?.user.setCustomAttribute(key: customAttributeKey, value: customAttributeValue)
    } else if let customAttributeValue = customAttributeValue as? Bool {
      AppDelegate.braze?.user.setCustomAttribute(key: customAttributeKey, value: customAttributeValue)
    } else if let customAttributeValue = customAttributeValue as? Int {
      AppDelegate.braze?.user.setCustomAttribute(key: customAttributeKey, value: customAttributeValue)
    } else if let customAttibuteValue = customAttributeValue as? [String] {
      AppDelegate.braze?.user.setCustomAttributeArray(key: customAttributeKey, array: customAttibuteValue)
    }
  }
  
  func changeUser(parameters: [String: Any]) {
    guard let userId = parameters[ChangeUserExternalUserId] as? String else { return }
    AppDelegate.braze?.changeUser(userId: userId)
  }
}

Fügen Sie den folgenden Code in Ihre Datei BrazeGTMTagManager.h ein:

@import Firebase;
@import GoogleTagManager;

@interface BrazeGTMTagManager : NSObject <TAGCustomFunction>

@end

Und fügen Sie den folgenden Code in Ihre BrazeGTMTagManager.m Datei ein:

#import <Foundation/Foundation.h>
#import "BrazeGTMTagManager.h"
#import "BrazeKit"
#import "AppDelegate.h"

static NSString *const ActionTypeKey = @"actionType";

// Custom Events
static NSString *const LogEventAction = @"logEvent";
static NSString *const LogEventEventName = @"eventName";

// Custom Attributes
static NSString *const CustomAttributeAction = @"customAttribute";
static NSString *const CustomAttributeKey = @"customAttributeKey";
static NSString *const CustomAttributeValueKey = @"customAttributeValue";

// Change User
static NSString *const ChangeUserAction = @"changeUser";
static NSString *const ChangeUserExternalUserId = @"externalUserId";

@implementation BrazeGTMTagManager

- (NSObject *)executeWithParameters:(NSDictionary *)parameters {
  NSMutableDictionary *mutableParameters = [parameters mutableCopy];
  
  NSString *actionType = mutableParameters[ActionTypeKey];
  if (!actionType) {
    NSLog(@"There is no Braze action type key in this call. Doing nothing.", nil);
    return nil;
  }
  
  [mutableParameters removeObjectForKey:ActionTypeKey];
  
  if ([actionType isEqualToString:LogEventAction]) {
    [self logEvent:mutableParameters];
  } else if ([actionType isEqualToString:CustomAttributeAction]) {
    [self logCustomAttribute:mutableParameters];
  } else if ([actionType isEqualToString:ChangeUserAction]) {
    [self changeUser:mutableParameters];
  } else {
    NSLog(@"Invalid action type. Doing nothing.");
  }
  return nil;
}

- (void)logEvent:(NSMutableDictionary *)parameters {
  NSString *eventName = parameters[LogEventEventName];
  [parameters removeObjectForKey:LogEventEventName];
  [AppDelegate.braze logCustomEvent:eventName
                         properties:parameters];
}

- (void)logCustomAttribute:(NSMutableDictionary *)parameters {
  NSString *customAttributeKey = parameters[CustomAttributeKey];
  id customAttributeValue = parameters[CustomAttributeValueKey];
  
  if ([customAttributeValue isKindOfClass:[NSString class]]) {
    [AppDelegate.braze logCustomEvent:customAttributeKey
                           properties:parameters];
  } else if ([customAttributeValue isKindOfClass:[NSDate class]]) {
    [AppDelegate.braze.user setCustomAttributeWithKey:customAttributeKey
                                            dateValue:customAttributeValue];
  } else if ([customAttributeValue isKindOfClass:[NSNumber class]]) {
    if (strcmp([customAttributeValue objCType], [@(YES) objCType]) == 0) {
      [AppDelegate.braze.user setCustomAttributeWithKey:customAttributeKey
                                              boolValue:[(NSNumber *)customAttributeValue boolValue]];
    } else if (strcmp([customAttributeValue objCType], @encode(short)) == 0 ||
               strcmp([customAttributeValue objCType], @encode(int)) == 0 ||
               strcmp([customAttributeValue objCType], @encode(long)) == 0) {
      [AppDelegate.braze.user setCustomAttributeWithKey:customAttributeKey
                                               intValue:[(NSNumber *)customAttributeValue integerValue]];
    } else if (strcmp([customAttributeValue objCType], @encode(float)) == 0 ||
               strcmp([customAttributeValue objCType], @encode(double)) == 0) {
      [AppDelegate.braze.user setCustomAttributeWithKey:customAttributeKey
                                            doubleValue:[(NSNumber *)customAttributeValue doubleValue]];
    } else {
      NSLog(@"Could not map NSNumber value to Braze custom attribute:%@", customAttributeValue);
    }
  } else if ([customAttributeValue isKindOfClass:[NSArray class]]) {
    [AppDelegate.braze.user setCustomAttributeArrayWithKey:customAttributeKey
                                                     array:customAttributeValue];
  }
}

- (void)changeUser:(NSMutableDictionary *)parameters {
  NSString *userId = parameters[ChangeUserExternalUserId];
  [AppDelegate.braze changeUser:userId];
}

@end

Fehlerbehebung

Web-SDK-Sitzungen werden der falschen Nutzer:in zugeordnet

Wenn GTM die Braze-Initialisierung oder Event-Tags auslöst, bevor Ihre App die angemeldete Nutzer:in identifiziert, können Sitzungen und Events dem falschen Profil zugeordnet werden. Initialisieren Sie das Web-SDK, rufen Sie changeUser() mit der external_id der angemeldeten Nutzer:in auf und rufen Sie dann openSession() auf, bevor Tags Events protokollieren oder Attribute festlegen. Verwenden Sie die Tag-Reihenfolge von GTM oder Consent-Trigger, damit Braze-Tags erst nach Abschluss Ihres Authentifizierungsablaufs ausgeführt werden.

Web-SDK-Konsolenprotokollierung mit Shopify oder Script-Tag-Installationen

Das Shopify-App-Embed lädt das Web-SDK mit deaktivierter Konsolenprotokollierung. Legen Sie die Protokollierung in Ihrem GTM-Initialisierungs-Tag oder in den initialize()-Optionen fest. Das Braze-Dashboard enthält keine Protokollierungssteuerung für diese Loader.

Wenn Braze-Protokolle in der Browser-Konsole erscheinen, entfernen Sie enableLogging: true aus dem GTM-Initialisierungs-Tag oder dem angepassten HTML, bevor Sie in die Produktionsumgebung veröffentlichen. Verwenden Sie nach der Initialisierung toggleLogging() oder den URL-Parameter ?brazeLogging=true. Die vollständigen Web-SDK-Optionen finden Sie unter Ausführliche Protokollierung.

Wenn Braze nicht initialisiert wird oder Events nicht wie erwartet angezeigt werden, stellen Sie sicher, dass Ihr GTM-Container veröffentlicht ist, Trigger und Tag-Ausführungsreihenfolge mit Ihrer SDK-Lebenszyklus- und Initialisierungsstrategie übereinstimmen und dass Testgeräte keine Braze-Endpunkte blockieren.

Bei Initialisierungsfehlern überprüfen Sie, ob das Braze-Tag oder der angepasste Tag-Anbieter den erwarteten actionType und die erwarteten Parameter erhält (siehe die Android-, Swift- und Web-Tabs auf dieser Seite). Um die ausführliche Protokollierung bei der Validierung von GTM-ausgelösten Events zu aktivieren, aktivieren Sie die SDK-Debug-Protokollierung Ihrer Plattform, wie in den Plattform-Integrationsleitfäden beschrieben, die über diese Tabs verlinkt sind.

New Stuff!