コンテンツにスキップ

Web SDK リポジトリガイド

Braze Web SDKについて

Braze Web SDKを使用すると、BrazeのカスタマーエンゲージメントプラットフォームをWebアプリケーションに直接統合できます。このSDKはTypeScriptで構築され、モダンなWeb開発向けに設計されており、ユーザー管理、メッセージング、分析、フィーチャーフラグのための包括的なツールを提供します。

できること

  • ユーザー管理:Webアプリケーション全体でユーザーのID、属性、行動を追跡・管理します
  • アプリ内メッセージ:ユーザーがサイトを利用している間に、ターゲットを絞ったメッセージや通知を表示します
  • Content Cards:リアルタイムで更新されるパーソナライズされたコンテンツフィードやプロモーションカードを表示します
  • バナー:サイト内の特定のプレースメントにバナーメッセージを表示します
  • プッシュ通知:ユーザーがサイトにいないときでもエンゲージメントを図れるよう、Webプッシュ通知を送信します
  • フィーチャーフラグ:サーバー側のフィーチャーフラグ管理で、機能のロールアウトやAB テストを制御します
  • 分析:カスタムイベント、ユーザーインタラクション、コンバージョン指標を追跡します
  • セッション管理:ユーザーセッションとエンゲージメントのパターンをモニタリングします

シングルページアプリケーション、eコマースサイト、コンテンツプラットフォームのいずれを構築している場合でも、Braze Web SDKは、成長とリテンションを促進するパーソナライズされた魅力的なユーザー体験を作成するために必要なツールを提供します。

前提条件

Braze Web SDKを統合する前に、以下が必要です。

  • Brazeアカウント:API アクセス権を持つBrazeアカウント
  • API キー:Brazeダッシュボードで取得できるアプリの API キー
  • SDKエンドポイント:BrazeのSDKエンドポイントURL(例:sdk.iad-01.braze.com)

認証情報の取得

  1. API キー:Brazeダッシュボードの設定 → API キーにあります。
  2. SDKエンドポイント:設定 → SDK認証 → エンドポイントにあります。
  3. Service Worker:プッシュ通知に必要です(プッシュ通知のセクションを参照してください)。

インストール

npm install --save @braze/web-sdk
# or, using yarn:
# yarn add @braze/web-sdk

クイックスタート

次のスニペットは、Braze Web SDKの初期化に必要な最小限の設定を示しています。

import * as braze from "@braze/web-sdk";

// Initialize the SDK
braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: "YOUR-SDK-ENDPOINT-HERE",
});

braze.changeUser('Jane Doe');

設定リファレンス

初期化オプション

initialize 関数は、以下のプロパティを持つオプションオブジェクトを受け付けます。

オプション 型 デフォルト 説明
baseUrl string 必須 このオプションは、統合に適したエンドポイントを使用するよう Braze Web SDKを設定するために必要です。例: braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'sdk.iad-03.braze.com' })
enableLogging boolean false デフォルトでログを有効にするには true に設定します。この設定により、Braze は JavaScript コンソールにログを出力し、そのログはすべてのユーザーに表示されることに注意してください。ページを本番環境にリリースする前に、この設定を削除するか、setLogger で代替のロガーを指定することをおすすめします。
allowUserSuppliedJavascript boolean false デフォルトでは、Braze Web SDKはユーザー指定の JavaScript クリックアクションを許可せず、HTML アプリ内メッセージおよびバナーも有効にしません。これらは Braze ダッシュボードのユーザーがサイト上で JavaScript を実行できるようにするためです。Braze ダッシュボードのユーザーが悪意のない JavaScript クリックアクションを記述すると信頼していることを示すには、このプロパティを true に設定します。
doNotLoadFontAwesome boolean false Braze はアプリ内メッセージのアイコンに Font Awesome を使用します。デフォルトでは、Braze は FontAwesome CDN から FontAwesome 4.7.0 を自動的に読み込みます。この動作を無効にするには (サイトで FontAwesome のカスタマイズ版を使用している場合など)、このオプションを true に設定します。この設定を行う場合、サイトで FontAwesome が読み込まれるようにする責任はお客様にあることに注意してください。読み込まれない場合、アプリ内メッセージが正しく表示されないことがあります。
inAppMessageZIndex number 999999 デフォルトでは、Braze SDKは z-index 999999 で In-App Messagesを表示します。このデフォルトを上書きするには、このオプションに値を指定します。
sessionTimeoutInSeconds number 30 デフォルトでは、30秒間操作がないとセッションがタイムアウトします。このデフォルトを上書きするには、このオプションに値を指定します。
deviceId string 自動生成 デフォルトでは、Braze はランダムな GUID をデバイス ID として割り当てます。このデフォルトを独自の値で上書きするには、この設定オプションに値を指定します。
appVersion string undefined このオプションに値を指定すると、Braze に送信されるユーザーイベントが指定したバージョンに関連付けられ、ユーザーのセグメンテーションに使用できます。
appVersionNumber string undefined ユーザーのセグメンテーションに使用できる数値形式のアプリバージョンの値です。この値は “1.2.3.4” のように4つのフィールドで送信する必要があり、そうでない場合は無視されます。注: appVersion も、同じ値またはこのバージョン固有の名前で設定する必要があります。
contentSecurityNonce string undefined このオプションに値を指定すると、Braze SDKは SDKが作成するすべての <script> 要素と <style> 要素に nonce を追加します。これにより、Braze SDKを Web サイトのコンテンツセキュリティポリシーと連携させることができます。この nonce の設定に加えて、FontAwesome の読み込みを許可する必要がある場合もあります。そのためには、コンテンツセキュリティポリシーの許可リストに use.fontawesome.com を追加するか、doNotLoadFontAwesome オプションを使用して手動で読み込みます。
noCookies boolean false デフォルトでは、Braze Web SDKは Cookie を使用します。Cookie の使用を無効にするには、このオプションを true に設定します。Cookie を無効にすると、セッション間でユーザーの ID を記憶する SDKの機能に影響する可能性があることに注意してください。
allowCrawlerActivity boolean false デフォルトでは、Braze Web SDKはユーザーエージェント文字列に基づいて、Google などの既知のスパイダーや Web クローラーからのアクティビティを無視します。これによりデータポイントを節約でき、分析の精度が向上し、ページランクが改善される可能性があります。ただし、これらのクローラーからのアクティビティを Braze に記録したい場合は、このオプションを true に設定できます。
disablePushTokenMaintenance boolean false デフォルトでは、すでに Web プッシュの許可を与えているユーザー (requestPushPermission を通じて、または以前のプッシュプロバイダーから許可を与えた場合など) は、配信到達性を確保するため、新しいセッションの開始時にプッシュトークンを Braze のバックエンドと自動的に同期します。この動作を無効にするには、このオプションを true に設定します。
enableSdkAuthentication boolean false SDK 認証機能を有効にするには true に設定します。SDK 認証の詳細については、製品ドキュメントを参照してください。
manageServiceWorkerExternally boolean false デフォルトでは、Braze Web SDKはプッシュ通知用に独自のサービスワーカーを管理します。アプリケーションですでにサービスワーカーを管理しており、そこに Braze のサービスワーカー機能を組み込みたい場合は、このオプションを true に設定し、サービスワーカーファイルに Braze のサービスワーカーコードを含めてください。
minimumIntervalBetweenTriggerActionsInSeconds number 30 デフォルトでは、トリガーアクション (アプリ内メッセージの表示など) は、ユーザーごとに最大で30秒に1回しか実行されません。このデフォルトを上書きするには、このオプションに値を指定します。
serviceWorkerLocation string undefined デフォルトでは、Braze Web SDKはドメインのルートでサービスワーカーファイルを探します。このデフォルトを上書きしてサービスワーカーファイルのカスタムの場所を指定するには、このオプションに値を指定します。
safariWebsitePushId string undefined Safari のプッシュ通知に必要です。この値は Apple Developer アカウントで確認できます。Safari のプッシュ通知の設定について詳しくは、製品ドキュメントを参照してください。
localization string undefined このオプションに値を指定すると、Braze SDKはそのロケールでアプリ内メッセージと Content Cardsを表示しようとします。
openInAppMessagesInNewTab boolean false デフォルトでは、アプリ内メッセージ内のリンクは同じタブで開きます。代わりに新しいタブで開くようにするには、このオプションを true に設定します。
openCardsInNewTab boolean false デフォルトでは、Content Cards 内のリンクは同じタブで開きます。代わりに新しいタブで開くようにするには、このオプションを true に設定します。
requireExplicitInAppMessageDismissal boolean false デフォルトでは、アプリ内メッセージはメッセージの外側をクリックするか、Esc キーを押すことで閉じることができます。メッセージを閉じる際に、ユーザーが閉じるボタンまたはアクションボタンを明示的にクリックする必要があるようにするには、このオプションを true に設定します。
devicePropertyAllowlist string[] undefined デフォルトでは、Braze SDKは DeviceProperties 内のすべてのデバイスプロパティを自動的に検出して収集します。この動作を上書きするには、DeviceProperties の配列を指定します。Braze サーバーへのすべてのプロパティの送信を無効にするには、空の配列を指定します。一部のプロパティがないと、すべての機能が正しく動作しない場合があることに注意してください。たとえば、タイムゾーンがないと、ローカルタイムゾーン配信は機能しません。
serviceWorkerScope string undefined デフォルトでは、Braze Web SDKはデフォルトのスコープ (サービスワーカーのディレクトリ) でサービスワーカーを登録します。このデフォルトを上書きしてサービスワーカーのカスタムスコープを指定するには、このオプションに値を指定します。

主な機能

初期化と設定

基本的な初期化

import * as braze from "@braze/web-sdk";

// Initialize the SDK
braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: 'YOUR-SDK-ENDPOINT-HERE',
    enableLogging: true // Remove in production
});

// Start a session
braze.openSession();

高度な初期化オプション

import * as braze from "@braze/web-sdk";

braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: 'YOUR-SDK-ENDPOINT-HERE',
    enableLogging: true,
    allowUserSuppliedJavascript: true,
    doNotLoadFontAwesome: false,
    inAppMessageZIndex: 999999,
    sessionTimeoutInSeconds: 30,
    deviceId: 'custom-device-id',
    appVersion: '1.0.0',
    contentSecurityNonce: 'your-nonce-here'
});

ユーザー管理

ユーザーを変更する

import { changeUser } from "@braze/web-sdk";

// Change to a new user
changeUser('user-123');

ユーザー属性を設定する

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    user.setEmail('[email protected]');
    user.setFirstName('John');
    user.setLastName('Doe');
    user.setCustomUserAttribute('subscription_tier', 'premium');
    user.setCustomUserAttribute('last_login', new Date());
}

ユーザーの位置情報を設定する

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    user.setCountry('US');
    user.setHomeCity('San Francisco');
    user.setLanguage('en');
    user.setCustomLocationAttribute('latitude', 37.7749);
    user.setCustomLocationAttribute('longitude', -122.4194);
}

ユーザーエイリアスと購読グループ

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    // Add alias
    user.addAlias('external_id', '12345');

    // Add to subscription group
    user.addToSubscriptionGroup('newsletter_subscribers');

    // Remove from subscription group
    user.removeFromSubscriptionGroup('old_subscribers');
}

ユーザーのログアウト

import { wipeData } from "@braze/web-sdk";

// There is no explicit method to logout. To "forget" the current users entirely, use wipeData().
// This is a complete data wipe (use with caution, this wipes things such as device ID)
wipeData();

In-App Messages

自動表示

import { automaticallyShowInAppMessages } from "@braze/web-sdk";

// Automatically show in-app messages
automaticallyShowInAppMessages();

手動表示

import { subscribeToInAppMessage, showInAppMessage } from "@braze/web-sdk";

// Subscribe to in-app messages
subscribeToInAppMessage((inAppMessage) => {
    // Show the message
    showInAppMessage(inAppMessage);
});

カスタムアプリ内メッセージの処理

import { subscribeToInAppMessage, showInAppMessage } from "@braze/web-sdk";

subscribeToInAppMessage((inAppMessage) => {
    // Custom logic before showing
    if (inAppMessage.getExtras()['priority'] === 'high') {
        showInAppMessage(inAppMessage);
    }
});

アプリ内メッセージのインタラクションを記録する

import {
    logInAppMessageClick,
    logInAppMessageImpression,
    logInAppMessageButtonClick
} from "@braze/web-sdk";

// Log when user sees the message
logInAppMessageImpression(inAppMessage);

// Log when user clicks the message
logInAppMessageClick(inAppMessage);

// Log when user clicks a button in the message
logInAppMessageButtonClick(inAppMessage, button);

カスタムHTMLアプリ内メッセージ

import { subscribeToInAppMessage, logInAppMessageImpression, logInAppMessageClick } from "@braze/web-sdk";

// Don't call automaticallyShowInAppMessages() when using custom rendering
// braze.automaticallyShowInAppMessages(); // Comment this out

subscribeToInAppMessage((inAppMessage) => {
    // Extract message data
    const messageData = {
        title: inAppMessage.getMessage(),
        body: inAppMessage.getBody(),
        imageUrl: inAppMessage.getImageUrl(),
        buttons: inAppMessage.getButtons(),
        deepLink: inAppMessage.getExtras()['deep_link_url']
    };

    // Define your own HTML structure, using messageData
    const customHTML = ` <!-- Add your custom styling and structure -->`;

    /* Render the In-App Message here */

    // Here we naively log an impression once the message is rendered.
    // Be precise about exactly when you want to log an impression (ie. only the first time it enters the view port).
    logInAppMessageImpression(inAppMessage);
});

// Handle button clicks and deep linking
const handleButtonClick = (button, inAppMessage) => {
    logInAppMessageClick(inAppMessage);
    // Handle additional click actions (ie. deep linking)
};

Content Cards

Content Cardsを表示する

import { showContentCards } from "@braze/web-sdk";

// Show content cards in default location
showContentCards();

// Show in specific container
const container = document.getElementById('content-cards-container');
showContentCards(container);

Content Cardsの更新をサブスクライブする

import { subscribeToContentCardsUpdates } from "@braze/web-sdk";

subscribeToContentCardsUpdates((cards) => {
    console.log('Content cards updated:', cards);
    // Display cards or update UI
});

Content Cardsのインタラクションを記録する

import {
    logContentCardClick,
    logContentCardImpressions,
    logCardDismissal
} from "@braze/web-sdk";

// Log card impressions
logContentCardImpressions(cards);

// Log card clicks
logContentCardClick(card);

// Log card dismissals
logCardDismissal(card);

Content Cardsをフィルターする

import { showContentCards } from "@braze/web-sdk";

// Show only pinned cards
// You can also provide a parent element instead of null
showContentCards(null, (cards) => {
    return cards.filter(card => card.getIsPinned());
});

Content Cardsの更新をリクエストする

import { requestContentCardsRefresh } from "@braze/web-sdk";

requestContentCardsRefresh(
    () => console.log('Content cards refreshed'),
    () => console.log('Failed to refresh content cards')
);

カスタムContent Cards

import { subscribeToContentCardsUpdates, logContentCardClick, logContentCardImpressions, requestContentCardsRefresh } from "@braze/web-sdk";

// State for impression de-duping
const loggedImpressions = new Set();
const idToCard = new Map();

subscribeToContentCardsUpdates((cards) => {
    // Build cards one by one
    cards.getCards().forEach(card => {
        // Skip control cards
        if (card.getIsControl()) return;

        // Extract card data
        const cardData = {
            id: card.getId(),
            title: card.getTitle(),
            description: card.getDescription(),
            imageUrl: card.getImageUrl(),
            url: card.getUrl(),
            extras: card.getExtras()
        };

        // Define your own HTML structure, using cardData
        const customHTML = ` <!-- Add your custom styling and structure -->`;

        /* Render each card here */

        // Basic observer for impression logging.
        // Be precise about exactly when you want to log an impression (ie. only the first time it enters the view port).
        const observer = new IntersectionObserver((entries) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    logContentCardImpressions([card]);
                }
            });
        });

        // Observe card element when rendered
        // observer.observe(cardElement);
    });
});

// Handle card clicks
const handleCardClick = (card) => {
    logContentCardClick(card);
    // Handle additional click actions (ie. navigation)
};

プッシュ通知

プッシュ許可をリクエストする

import { requestPushPermission } from "@braze/web-sdk";

requestPushPermission(
    () => console.log('Push permission granted'),
    () => console.log('Push permission denied')
);

プッシュのサポートを確認する

import { isPushSupported, isPushPermissionGranted } from "@braze/web-sdk";

if (isPushSupported()) {
    if (isPushPermissionGranted()) {
        console.log('Push notifications are enabled');
    } else {
        console.log('Push permission not granted');
    }
}

プッシュの登録を解除する

import { unregisterPush } from "@braze/web-sdk";

unregisterPush(
    () => console.log('Successfully unregistered'),
    () => console.log('Failed to unregister')
);

フィーチャーフラグ

フィーチャーフラグを取得する

import { getFeatureFlag } from "@braze/web-sdk";

const featureFlag = getFeatureFlag('new_checkout_flow');
if (featureFlag) {
    const isEnabled = featureFlag.getBooleanProperty('enabled', false);
    const rolloutPercentage = featureFlag.getNumberProperty('rollout_percentage', 0);

    if (isEnabled) {
        // Enable new checkout flow
    }
}

フィーチャーフラグの更新をサブスクライブする

import { subscribeToFeatureFlagsUpdates } from "@braze/web-sdk";

subscribeToFeatureFlagsUpdates((featureFlags) => {
    featureFlags.forEach(flag => {
        console.log(`Feature flag ${flag.getId()}: ${flag.getBooleanProperty('enabled')}`);
    });
});

フィーチャーフラグのインプレッションを記録する

import { logFeatureFlagImpression } from "@braze/web-sdk";

const featureFlag = getFeatureFlag('new_feature');
if (featureFlag) {
    logFeatureFlagImpression(featureFlag);
}

フィーチャーフラグの更新をリクエストする

import { refreshFeatureFlags } from "@braze/web-sdk";

refreshFeatureFlags(
    () => console.log('Feature flags refreshed'),
    () => console.log('Failed to refresh feature flags')
);

バナー

バナーを取得して表示する

import { getBanner, insertBanner } from "@braze/web-sdk";

const banner = getBanner('homepage_banner');
if (banner) {
    // Insert banner into specific element
    const container = document.getElementById('banner-container');
    insertBanner(banner, container);
}

バナーの更新をサブスクライブする

サブスクライバーは、SDKのメモリ内バナーキャッシュを受け取ります。1回の更新には、直近のrequestBannersRefresh呼び出しで指定したプレースメントIDだけでなく、以前の更新で取得したプレースメントも含まれる場合があります。

import { insertBanner, subscribeToBannersUpdates } from "@braze/web-sdk";

subscribeToBannersUpdates((banners) => {
    Object.entries(banners).forEach(([placementId, banner]) => {
        if (banner) {
            console.log(`Banner for ${placementId}:`, banner);

            // Insert banner into specific element
            const container = document.getElementById(`banner-container-${placementId}`);
            insertBanner(banner, container);
        }
    });
});

カスタムUIでバナーを閉じる

import { dismissBanner, getBanner, subscribeToBannersUpdates } from "@braze/web-sdk";

subscribeToBannersUpdates((banners) => {
    const banner = getBanner("homepage_banner");
    const container = document.getElementById("custom-banner-container");
    if (!container) {
        return;
    }

    if (!banner) {
        container.replaceChildren();
        return;
    }

    banner.subscribeToDismissedEvent(() => {
        console.log("Dismissed banner:", banner);
    });

    const closeButton = document.createElement("button");
    closeButton.textContent = "Close";
    closeButton.addEventListener("click", () => {
        dismissBanner(banner);
    });

    // Render your custom UI here and include the close button.
});

dismissBanner(banner)を呼び出すと、SDKはバナーの非表示状態を処理し、アクティブなバナーの更新からそのバナーを削除し、バナーの非表示イベントのサブスクライバーに通知して、非表示の情報をBrazeに同期します。カスタムUIでは、dismissBannerをローカルのUI変更のみ、または分析ログ記録のみを行うメソッドとして扱うのではなく、subscribeToBannersUpdatesを使用して、非表示にしたバナーが削除されたことに対応するようにしてください。

バナーの更新をリクエストする

requestBannersRefresh()は、既存のバナーキャッシュに統合されます。リクエストしたプレースメントIDのみが追加、更新、または削除されます。その他のプレースメントのキャッシュ済みバナーはキャッシュに残り、元の有効期限で期限切れになります。リクエストしたプレースメントに対してサーバーがバナーを返さなかった場合、そのプレースメントはキャッシュから削除されます。

import { requestBannersRefresh } from "@braze/web-sdk";

requestBannersRefresh(
    ["placement_1", "placement_2"],
    () => console.log('Banners refreshed'),
    () => console.log('Failed to refresh banners')
);

分析とイベント

カスタムイベントを記録する

import { logCustomEvent } from "@braze/web-sdk";

// Simple event
logCustomEvent('button_clicked');

// Event with properties
logCustomEvent('purchase', {
    product_id: '123',
    price: 29.99,
    currency: 'USD'
});

購入を記録する

import { logPurchase } from "@braze/web-sdk";

logPurchase('product-123', 29.99, 'USD', 1, {
    category: 'electronics',
    brand: 'Apple'
});

データフラッシュをリクエストする

import { requestImmediateDataFlush } from "@braze/web-sdk";

// Force immediate data send
requestImmediateDataFlush();

セッション管理

セッションを開始する

import { openSession } from "@braze/web-sdk";

// Start a new session
openSession();

SDKのステータスを確認する

import { isInitialized, isDisabled } from "@braze/web-sdk";

if (isInitialized()) {
    console.log('SDK is initialized');

    if (isDisabled()) {
        console.log('SDK is disabled');
    }
}

SDKを有効化/無効化する

import { enableSDK, disableSDK } from "@braze/web-sdk";

// Disable SDK
disableSDK();

// Re-enable SDK
enableSDK();

データ管理

データを消去する

import { wipeData } from "@braze/web-sdk";

// Remove all locally stored data
wipeData();

SDKを破棄する

import { destroy } from "@braze/web-sdk";

// Clean up SDK resources
destroy();

デバイスIDを取得する

import { getDeviceId } from "@braze/web-sdk";

const deviceId = getDeviceId();
console.log('Device ID:', deviceId);

SDK認証

import { setSdkAuthenticationSignature } from "@braze/web-sdk";

// Set authentication signature
setSdkAuthenticationSignature('your-signature-here');

認証失敗をサブスクライブする

import { subscribeToSdkAuthenticationFailures } from "@braze/web-sdk";

subscribeToSdkAuthenticationFailures((error) => {
    console.log('Authentication failed:', error);
    // Provide new signature
    setSdkAuthenticationSignature('new-signature');
});

統合パターン

SSR フレームワーク

Next.js などのサーバーサイドレンダリング (SSR) フレームワークを使用している場合、SDKはブラウザ環境で実行されることを前提としているため、エラーが発生することがあります。この問題は、SDKを動的にインポートすることで解決できます。

その際、必要な SDKの部分を別ファイルでエクスポートし、そのファイルをコンポーネントに動的にインポートすれば、ツリーシェイキングのメリットを維持できます。

// MyComponent/braze-exports.js
// export the parts of the SDK you need here
export { initialize, openSession } from "@braze/web-sdk";

// MyComponent/MyComponent.js
// import the functions you need from the braze exports file
useEffect(() => {
    import("./braze-exports.js").then(({ initialize, openSession }) => {
        initialize("YOUR-API-KEY-HERE", {
            baseUrl: "YOUR-SDK-ENDPOINT",
            enableLogging: true,
        });
        openSession();
    });
}, []);

または、webpack を使用してアプリをバンドルしている場合は、webpack のマジックコメントを活用して、必要な SDKの部分だけを動的にインポートできます。

// MyComponent.js
useEffect(() => {
    import(
        /* webpackExports: ["initialize", "openSession"] */
        "@braze/web-sdk"
    ).then(({ initialize, openSession }) => {
        initialize("YOUR-API-KEY-HERE", {
            baseUrl: "YOUR-SDK-ENDPOINT",
            enableLogging: true,
        });
        openSession();
    });
}, []);

Vite

Vite を使用していて、循環依存に関する警告や Uncaught TypeError: Class extends value undefined is not a constructor or null が表示される場合は、Braze SDKを依存関係の検出対象から除外する必要がある場合があります。

export default {
    optimizeDeps: {
        exclude: ['@braze/web-sdk']
    }
}

Jest フレームワーク

Jest を使用している場合、SyntaxError: Unexpected token 'export' のようなエラーが表示されることがあります。これを修正するには、package.json の設定を調整して Braze SDKを無視するようにします。

{
  "jest": {
    "transformIgnorePatterns": [
      "/node_modules/(?!@braze)"
    ]
  }
}

非同期モジュール定義 (AMD)

AMD サポートを無効にする

サイトで RequireJS などの AMD モジュールローダーを使用しているものの、Braze Web SDKは CDN 経由で読み込みたい場合は、AMD サポートを含まないバージョンのライブラリーを読み込めます。このバージョンのライブラリーは、次の CDN の場所から読み込めます: https://js.appboycdn.com/web-sdk/6.3/braze.no-amd.min.js

モジュールローダー

RequireJS などの AMD モジュールローダーを使用している場合は、ライブラリーのコピーをセルフホストし、他のリソースと同様に参照することをおすすめします。

require(['path/to/braze.min.js'], function(braze) {
  braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'YOUR-SDK-ENDPOINT' });
  braze.automaticallyShowInAppMessages();
  braze.openSession();
});

Accelerated Mobile Pages (AMP)

AMP を統合するには、以下の作業が必要です。

  1. AMP Web プッシュスクリプトを含める: head に async の script タグを追加します
  2. 購読ウィジェットを追加する: ユーザーが購読または購読解除できるウィジェットを追加します
  3. ヘルパーファイルを追加する: helper-iframe.html と permission-dialog.html を含めます
  4. サービスワーカーを作成する: Braze のサービスワーカーファイルを追加します
  5. AMP Web プッシュ要素を設定する: API キーとベース URL をクエリパラメーターとして指定した amp-web-push 要素を追加します

AMP 統合の詳しい手順については、Braze 開発者ガイドを参照してください。

Electron

Electron は Web プッシュ通知を公式にサポートしていません (この GitHub の issue を参照してください)。Braze ではテストしていませんが、他のオープンソースの回避策を試すこともできます。

CDN 統合

  • スクリプトの読み込み: 初期化コードを script タグの後に配置して script タグの読み込み後に初期化するか、script タグの onload イベントハンドラーを使用します
  • グローバルアクセス: CDN 経由で読み込んだ場合、SDKは window.braze として利用できます

サービスワーカー (プッシュ通知)

  • 必須: プッシュ通知を機能させるには、Braze のサービスワーカーを含める必要があります
  • デフォルトの登録: デフォルトでは、Braze Web SDKは requestPushPermission() が呼び出されたとき、およびすでにプッシュ許可を付与しているユーザーの新しいセッションの開始時に、サービスワーカーを自動的に登録・管理します。ただし、Braze のサービスワーカーコードを含むサービスワーカーファイルを、想定される場所でホストする必要があります。
  • 独自のサービスワーカーを管理する: アプリケーションですでにサービスワーカーを管理している場合は、初期化オプション manageServiceWorkerExternally を true に設定し、Braze のサービスワーカーコードを自分のサービスワーカーファイルに追加して、navigator.serviceWorker.register() を使用して自分で登録します
  • プッシュ許可: braze.requestPushPermission() は、ユーザーの操作 (ボタンのクリックなど) に応じて呼び出します。ブラウザの許可をリクエストする前に、ソフトプッシュプロンプト (カスタム UI) を使用します

タグマネージャー

Tealium iQ

Tealium iQ では、基本的なターンキー型の Braze 統合を提供しています。統合を設定するには、Tealium のタグ管理インターフェイスで Braze を検索し、ダッシュボードの Web SDK API キーを入力します。詳細や Tealium の設定に関する詳しいサポートについては、統合ドキュメントを確認するか、Tealium のアカウントマネージャーにお問い合わせください。

Google Tag Manager

Web SDKは、Google Tag Manager コンテナ内のカスタム HTML タグから初期化および呼び出しができます。GTM 経由で Braze にイベントを送信する例については Google Tag Manager のサンプルアプリを、詳細については統合ドキュメントを参照してください。

その他のタグマネージャー

カスタム HTML タグ内で統合手順に従うことで、Braze は他のタグ管理ソリューションとも互換性がある場合があります。これらのソリューションの評価についてサポートが必要な場合は、Braze の担当者にお問い合わせください。


ライブラリ

次の表は、利用可能なBraze Web SDKのディストリビューションについて説明しています。

名前 説明 npm CDN URL
Full UIを含む完全なSDKです。npm版を使用する場合、JavaScriptバンドラーはUIコードを含む未使用のコードを削除します。 @braze/web-sdk https://js.appboycdn.com/web-sdk/7.1/braze.min.js
Core UIを含まないSDKです。このバージョンのSDKを使用する場合は、In-App MessagesとContent Cardsの独自UIを実装してください。CSSでカスタマイズ可能なUI要素が提供されるため、ほとんどの統合ではFullライブラリを使用してください。 該当なし https://js.appboycdn.com/web-sdk/7.1/braze.core.min.js
No-AMD AMDサポートを含まない完全なSDKです。サイトでRequireJSやその他のAMDモジュールローダーを使用しているものの、CDN経由でSDKを読み込みたい場合に便利です。 該当なし https://js.appboycdn.com/web-sdk/7.1/braze.no-amd.min.js

対応ブラウザ

  • 最新のChromiumベースのブラウザ(Chrome、Edge、Opera)
  • Firefox
  • Safari

デバッグとトラブルシューティング

初期化関数にオプション enableLogging: true を渡すと (braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'YOUR-SDK-ENDPOINT', enableLogging: true });)、Braze が JavaScript コンソールにログを出力するようになります。これは開発時に役立ちますが、すべてのユーザーに表示されます。そのため、ページを本番環境にリリースする前に、このオプションを削除するか、別のロガーを指定してください。

Font Awesome

Brazeはアプリ内メッセージのアイコンにFont Awesome 4.7.0を使用しています。Font Awesomeの読み込みを無効にするには、doNotLoadFontAwesome初期化オプションを使用してください。利用可能なアイコンを確認するには、チートシートをご覧ください。

その他のリソース

お問い合わせ

ご不明な点がございましたら、Brazeテクニカルサポートまでお問い合わせください。

リポジトリの詳細とサンプルプロジェクトについては、https://github.com/braze-inc/braze-web-sdkを参照してください。

New Stuff!