コンテンツにスキップ

Web SDK リポジトリガイド

Braze Web SDKについて

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

できること

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

シングルページアプリケーション、ECサイト、コンテンツプラットフォームのいずれを構築している場合でも、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. サービスワーカー: プッシュ通知に必要です(プッシュ通知のセクションを参照)

インストール

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アプリ内メッセージやBannersも有効にしません。これらは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はIn-App Messagesをz-index 999999で表示します。このオプションに値を指定すると、そのデフォルトを上書きできます。
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サイトのContent Security Policyと連携させることができます。このnonceの設定に加えて、FontAwesomeの読み込みを許可する必要がある場合もあります。Content Security Policyの許可リストに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 デフォルトでは、アプリ内メッセージは外側をクリックするかEscapeキーを押すことで閉じることができます。このオプションを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();

アプリ内メッセージ

自動表示

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を使用してアプリをバンドルしている場合は、マジックコメントを活用して、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をViteの依存関係探索から除外する必要があります。

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

Jestフレームワーク

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

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

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

AMDサポートの無効化

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

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

Electron

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

CDN統合

  • スクリプトの読み込み:スクリプトタグの後に初期化コードを配置するか、スクリプトタグの 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サンプルアプリを参照するか、詳細については統合ドキュメントを確認してください。

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

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


ライブラリ

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

名前 説明 npm CDN URL
Full UIを含む完全なSDKです。npmバージョンを使用する場合、JavaScriptバンドラーがUIコードを含む未使用のコードを削除します。 @braze/web-sdk https://js.appboycdn.com/web-sdk/7.0/braze.min.js
Core UIなしのSDKです。このバージョンのSDKを使用する場合、In-App MessagesおよびContent Cards用に独自のUIを実装してください。ほとんどの統合では、CSSを通じてカスタマイズ可能なUI要素を提供するフルライブラリを使用してください。 N/A https://js.appboycdn.com/web-sdk/7.0/braze.core.min.js
No-AMD AMDサポートなしの完全なSDKです。サイトでRequireJSや他のAMDモジュールローダーを使用しているが、CDN経由でSDKを読み込むことを好む場合に便利です。 N/A https://js.appboycdn.com/web-sdk/7.0/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!