Salesforce Experience Cloud: 魅力的なデジタルエクスペリエンスの構築


背景とアプリケーションシナリオ

現代のビジネス環境において、企業は顧客、パートナー、従業員とより深く、よりパーソナルなレベルで繋がる必要性を強く感じています。デジタル化が加速する中で、情報共有、コラボレーション、セルフサービスを効率的に実現するためのプラットフォームは不可欠です。ここでその真価を発揮するのが、Salesforce の Experience Cloud (エクスペリエンスクラウド) です。Experience Cloud は、以前は Community Cloud (コミュニティクラウド) として知られていましたが、その機能と提供価値の拡大に伴い、名称が変更されました。これは単なるポータル構築ツールではなく、企業がブランド化された、統一感のあるデジタルエクスペリエンスを迅速に構築し、展開するための包括的なプラットフォームです。

Experience Cloud を利用することで、企業は様々なオーディエンス向けにカスタマイズされたオンライン空間を作成できます。これにより、顧客エンゲージメントの向上、パートナーとの連携強化、従業員の生産性向上といった、多岐にわたるビジネス目標の達成を支援します。主なアプリケーションシナリオは以下の通りです。

  • 顧客サービスポータル (Customer Service Portal): 顧客が自分でケースを登録、追跡したり、ナレッジ記事を検索したり、FAQを参照したりできるセルフサービスハブを提供します。これにより、サポートコストの削減と顧客満足度の向上が期待できます。
  • パートナーポータル (Partner Portal): 販売パートナーやチャネルパートナーが商談情報にアクセスし、リードを登録し、マーケティング資料を共有し、トレーニングを受講できるコラボレーションスペースを構築します。パートナーエコシステム全体の効率性と生産性を高めます。
  • 従業員向けポータル (Employee Portal / Intranet): 従業員が福利厚生情報にアクセスしたり、社内ニュースを閲覧したり、同僚とコラボレーションしたり、HR 関連のタスクを実行したりするための中心的なハブを提供します。社内コミュニケーションを活性化し、エンゲージメントを向上させます。
  • 公開ナレッジベース (Public Knowledge Base): 認証されていない訪問者でもアクセスできる公開サイトを通じて、製品情報、使い方ガイド、トラブルシューティングなどの情報を提供します。これは SEO 対策にもなり、潜在顧客へのリーチ拡大にも繋がります。
  • イベント管理サイト (Event Management Site): イベントの登録、情報提供、参加者間の交流の場を提供します。
  • サードパーティ統合 (Third-Party Integration): 他のシステムやサービスと統合し、よりリッチなデジタルエクスペリエンスを提供します。例えば、EC サイトと連携して注文履歴を表示したり、外部のフォーラムと連携したりすることが可能です。

Experience Cloud は、Salesforce プラットフォーム上に構築されているため、Sales Cloud (セールスクラウド)、Service Cloud (サービスクラウド)、Marketing Cloud (マーケティングクラウド) など、他の Salesforce 製品とシームレスに連携します。これにより、顧客、パートナー、従業員に関するデータが一元的に管理され、よりパーソナライズされたエクスペリエンスの提供が可能になります。セキュリティと拡張性にも優れており、ビジネスの成長に合わせて柔軟に対応できるスケーラブルなソリューションです。


原理説明

Experience Cloud は、Salesforce の強力なプラットフォーム基盤上に構築されており、その核となるのは Salesforce Sites (セールスフォースサイト) の技術です。これにより、Salesforce インスタンスのデータを外部に公開するための安全なインフラが提供されます。Experience Cloud の主な機能と原理は以下の通りです。

エクスペリエンスビルダー (Experience Builder)

Experience Builder (エクスペリエンスビルダー) は、Experience Cloud サイトを視覚的に構築・カスタマイズするためのローコード/ノーコードツールです。ドラッグ&ドロップインターフェースを通じて、テンプレートを選択し、コンポーネントを追加し、レイアウトを調整し、ブランド設定を適用できます。HTML や CSS の知識がなくても、プロフェッショナルな外観のサイトを簡単に作成・管理できます。

テンプレート (Templates)

Experience Cloud は、様々な用途に対応するための複数のテンプレート (テンプレート) を提供しています。これらのテンプレートは、事前に構築された構造と機能を提供し、サイト構築の出発点となります。

  • Customer Service (カスタマーサービス): ケース管理、ナレッジ記事、フォーラムなどを提供する顧客向けセルフサービスポータル。
  • Partner Central (パートナーセントラル): パートナーとの協業を促進するためのダッシュボード、商談管理、リード登録機能など。
  • Build Your Own (自分で構築): 最も柔軟性の高いテンプレートで、ゼロから完全にカスタマイズされたサイトを構築したい場合に適しています。Lightning Web Components (LWC) (ライトニングウェブコンポーネント) や Aura Components (オーラコンポーネント) を最大限に活用できます。
  • Aloha (アロハ): Salesforce の組み込み CMS (コンテンツ管理システム) 機能に最適化されたテンプレート。

テンプレートを選択した後、Experience Builder でサイトの見た目やコンテンツを調整していきます。

コンポーネント (Components)

サイトは、様々なコンポーネント (コンポーネント) の組み合わせで構成されます。これらのコンポーネントは、特定の機能やコンテンツを表示するためのブロックです。標準で提供されるコンポーネント (例: ナレッジ検索、ケース作成、ログイン、レコードリストなど) に加えて、開発者は Lightning Web Components (LWC) や Aura Components (オーラコンポーネント) を使用して、カスタムコンポーネントを作成し、Experience Builder で利用できるようにすることができます。これにより、Salesforce の標準機能だけでは実現できない、独自のビジネスロジックや UI をサイトに組み込むことが可能になります。

オーディエンスターゲティング (Audience Targeting)

Audience Targeting (オーディエンスターゲティング) は、特定のユーザーグループに対してパーソナライズされたコンテンツやエクスペリエンスを提供するための重要な機能です。ユーザーのプロファイル、権限セット、ロケーション、デバイスなどに基づいて、表示されるコンポーネント、ページ、ナビゲーションメニューなどを動的に変更できます。これにより、各ユーザーにとって最も関連性の高い情報を提供し、エンゲージメントを最大化できます。

セキュリティと共有設定 (Security and Sharing)

Experience Cloud は、Salesforce の堅牢なセキュリティモデル (セキュリティモデル) を継承しています。サイトユーザーは、通常の Salesforce ユーザーとは異なるライセンス (例: Customer Community、Partner Community) を持ち、それぞれのプロファイルと権限セットに基づいて、アクセスできるデータと実行できる操作が厳密に管理されます。特に、共有設定 (共有設定) (例: 組織の共有設定、ロール階層、共有ルール、Apex 共有) は、サイト内のデータアクセスを制御するために不可欠です。

また、認証されていないユーザー向けの公開サイトの場合、Guest User Profile (ゲストユーザプロファイル) を使用して、アクセスできるオブジェクト、項目、および Apex クラスを制限します。このプロファイルは、セキュリティ上の理由から非常に厳格に設定する必要があり、公開されるデータは最小限に抑えるべきです。

テーマとブランディング (Theme and Branding)

企業は、テーマ (テーマ) とブランディング (ブランディング) の設定を通じて、サイトのルック&フィールを自社のブランドガイドラインに合わせて完全にカスタマイズできます。ロゴ、色、フォント、ヘッダー/フッターなどを変更し、訪問者に対して一貫したブランドエクスペリエンスを提供できます。


示例コード

Experience Cloud 自体はローコード/ノーコードでの構築が中心ですが、より高度な機能や Salesforce 標準では提供されていない独自のデータ表示ロジックを実現するためには、カスタムの Lightning Web Component (LWC) (ライトニングウェブコンポーネント) を開発することが一般的です。ここでは、ログインしている Experience Cloud ユーザーの取引先に関連するケースのリストを表示する LWC の例を紹介します。このコンポーネントは、Apex メソッドを呼び出してデータを取得し、それをサイトに表示します。

Apex クラス (サーバーサイドコントローラ)

まず、Salesforce からケースデータを取得するための Apex クラスを定義します。このクラスは、ログインしている Experience Cloud ユーザーの取引先 ID を特定し、その取引先に関連するケースを SOQL クエリで取得します。@AuraEnabled(cacheable=true) アノテーションは、このメソッドが Lightning コンポーネントから呼び出し可能であり、結果をクライアントサイドでキャッシュできることを示します。

// ファイル名: CaseService.cls
public with sharing class CaseService {

    /**
     * @description 現在ログインしている Experience Cloud ユーザーの取引先に関連するケースのリストを取得します。
     *              このメソッドは、ログインユーザーが取引先に関連付けられた取引先責任者であると仮定しています。
     * @return Case レコードのリスト
     */
    @AuraEnabled(cacheable=true)
    public static List<Case> getCasesForCurrentUserAccount() {
        try {
            // 現在のユーザーIDを取得
            Id currentUserId = UserInfo.getUserId();

            // User オブジェクトをクエリし、関連する Contact の AccountId を取得
            // Experience Cloud ユーザーは通常、Contact レコードにリンクされており、
            // その Contact が Account にリンクされています。
            User currentUser = [
                SELECT Id, ContactId, Contact.AccountId
                FROM User
                WHERE Id = :currentUserId
                LIMIT 1
            ];

            Id accountId = null;
            if (currentUser.ContactId != null && currentUser.Contact.AccountId != null) {
                // ユーザーが Contact にリンクされており、その Contact が Account にリンクされている場合
                accountId = currentUser.Contact.AccountId;
            } else {
                // ユーザーが Contact にリンクされていない、または Contact が Account にリンクされていない場合
                // デバッグログを出力し、空のリストを返す
                System.debug('現在ログイン中のユーザー (' + currentUserId + ') は Contact にリンクされていないか、' +
                             'または Contact が Account にリンクされていません。');
                return new List<Case>();
            }

            if (accountId != null) {
                // 特定の取引先に関連するケースをクエリし、最新の10件を取得
                List<Case> cases = [
                    SELECT Id, CaseNumber, Subject, Status, Priority, CreatedDate
                    FROM Case
                    WHERE AccountId = :accountId
                    ORDER BY CreatedDate DESC
                    LIMIT 10 // パフォーマンス向上のため件数を制限
                ];
                return cases;
            } else {
                // AccountId が特定できない場合も空のリストを返す
                return new List<Case>();
            }
        } catch (QueryException qe) {
            // SOQL クエリ実行中のエラーを捕捉
            System.debug('getCasesForCurrentUserAccount で QueryException が発生しました: ' + qe.getMessage());
            // LWC で処理できるように AuraHandledException をスロー
            throw new AuraHandledException('ケースの取得中にエラーが発生しました: ' + qe.getMessage());
        } catch (Exception e) {
            // その他の予期せぬエラーを捕捉
            System.debug('getCasesForCurrentUserAccount で予期せぬエラーが発生しました: ' + e.getMessage());
            throw new AuraHandledException('予期せぬエラーが発生しました: ' + e.getMessage());
        }
    }
}

Lightning Web Component (LWC)

次に、上記の Apex メソッドを呼び出し、取得したケースデータを Experience Cloud サイトに表示する LWC を作成します。このコンポーネントは、Experience Builder でドラッグ&ドロップで配置できるように設定されます。

myAccountCases.html

LWC のテンプレートです。取得したケースデータをループ表示し、データがない場合やエラーが発生した場合のメッセージも表示します。

<!-- ファイル名: myAccountCases.html -->
<template>
    <!-- Lightning Card でコンポーネントを囲み、タイトルとアイコンを表示 -->
    <lightning-card title="My Account Cases" icon-name="standard:case">
        <!-- ケースデータが存在する場合に表示 -->
        <template if:true={cases}>
            <div class="slds-m-around_medium">
                <!-- 各ケースアイテムをループで表示 -->
                <template for:each={cases} for:item="caseItem">
                    <p key={caseItem.Id}>
                        <b>Case #: </b> {caseItem.CaseNumber}<br/>
                        <b>Subject: </b> {caseItem.Subject}<br/>
                        <b>Status: </b> {caseItem.Status}<br/>
                        <b>Priority: </b> {caseItem.Priority}<br/>
                        <b>Created Date: </b> {caseItem.CreatedDate}
                        <hr/>
                    </p>
                </template>
            </div>
        </template>
        <!-- ケースデータが存在しない場合に表示 -->
        <template if:false={cases}>
            <p class="slds-m-around_medium">No cases found for your account.</p>
        </template>
        <!-- エラーが発生した場合に表示 -->
        <template if:true={error}>
            <p class="slds-m-around_medium slds-text-color_error">Error loading cases: {error}</p>
        </template>
    </lightning-card>
</template>

myAccountCases.js

LWC の JavaScript ファイルです。Apex メソッドをインポートし、@wire デコレータを使用して非同期的にケースデータを取得します。データが取得されたら、テンプレートに表示するためのプロパティに割り当てます。

// ファイル名: myAccountCases.js
import { LightningElement, wire } from 'lwc';
// Apex クラスのメソッドをインポート
import getCasesForCurrentUserAccount from '@salesforce/apex/CaseService.getCasesForCurrentUserAccount';

export default class MyAccountCases extends LightningElement {
    cases; // 取得したケースデータを保持するプロパティ
    error; // エラーメッセージを保持するプロパティ

    // @wire デコレータを使用して、Apex メソッドから非同期的にデータを取得
    // cacheable=true なので、結果はキャッシュされる可能性がある
    @wire(getCasesForCurrentUserAccount)
    wiredCases({ error, data }) {
        if (data) {
            this.cases = data; // データが正常に取得された場合、cases プロパティに割り当てる
            this.error = undefined; // エラーをクリア
        } else if (error) {
            // エラーが発生した場合、エラーメッセージを error プロパティに割り当てる
            // より堅牢なエラー処理が必要な場合は、error.body.message などを解析
            this.error = error.body.message; 
            this.cases = undefined; // ケースデータをクリア
        }
    }
}

myAccountCases.js-meta.xml

LWC の設定ファイルです。<isExposed>true</isExposed> を設定することで、Experience Builder でコンポーネントが利用可能になります。<targets> セクションでは、このコンポーネントがどこで利用できるかを指定します。特に lightningCommunity__PagelightningCommunity__Default は、Experience Cloud サイトでの利用を可能にするために重要です。

<!-- ファイル名: myAccountCases.js-meta.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>59.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__RecordPage</target>
        <target>lightning__AppPage</target>
        <!-- このコンポーネントを Experience Cloud サイトで利用可能にするためのターゲット -->
        <target>lightningCommunity__Page</target>
        <target>lightningCommunity__Default</target>
    </targets>
    <targetConfigs>
        <!-- Experience Builder で設定可能なプロパティを定義 (ここではタイトル) -->
        <targetConfig targets="lightningCommunity__Default">
            <property name="title" type="String" default="My Account Cases" label="Component Title" description="Title of the cases list component."/>
        </targetConfig>
    </targetConfigs>
</LightningComponentBundle>

これらのコードは、Salesforce の標準的な LWC 開発パターンと Apex 連携のベストプラクティスに基づいています。Experience Cloud の特定のニーズに合わせて、認証されたユーザーのコンテキストでデータを安全に取得し、表示する方法を示しています。このコンポーネントをデプロイした後、Experience Builder でサイトページにドラッグ&ドロップするだけで、ユーザーは自分の取引先に関連するケースのリストを閲覧できるようになります。


注意事項

Experience Cloud サイトを構築・運用する際には、いくつかの重要な考慮事項があります。これらを適切に管理することで、サイトのセキュリティ、パフォーマンス、およびユーザーエクスペリエンスを最適化できます。

権限 (Permissions)

Salesforce Experience Cloud は、Salesforce の堅牢な権限モデル (権限モデル) に基づいています。サイトユーザーには、適切なライセンスタイプ (例: Customer Community、Partner Community) に対応するプロファイルまたは権限セットが割り当てられます。データの可視性とアクセス権を厳密に制御することが重要です。

  • プロファイルと権限セット: サイトユーザーがアクセスできるオブジェクト、項目、タブ、Apex クラス、Visualforce ページなどを定義します。必要最低限のアクセス権のみを与える最小権限の原則 (Principle of Least Privilege) を遵守してください。
  • 共有設定: 組織の共有設定 (Org-Wide Defaults)、ロール階層 (Role Hierarchy)、共有ルール (Sharing Rules)、マニュアル共有 (Manual Sharing)、Apex 共有 (Apex Sharing) を利用して、ユーザーがアクセスできるレコードレベルのデータを制御します。特に外部ユーザーの場合は、内部ユーザーとは異なる共有モデルを設計する必要があります。
  • ゲストユーザプロファイル (Guest User Profile): 認証されていないユーザーがサイトにアクセスする場合、このプロファイルが適用されます。非常に厳格にセキュリティを設定し、公開するデータは最小限に留めてください。CRUD (作成、読み取り、更新、削除) 操作の権限は慎重に付与し、特に「すべてのデータを表示」や「すべてのデータを変更」といった権限は絶対に付与しないでください。
  • Apex クラスのアクセス: カスタム LWC や Aura コンポーネントが Apex メソッドを呼び出す場合、その Apex クラスへのアクセス権がユーザーのプロファイルまたは権限セットで許可されている必要があります。

API 制限 (API Limits)

Salesforce は、組織のパフォーマンスと安定性を維持するために、様々なAPI 制限 (API制限) を設けています。Experience Cloud サイト、特にアクセス数の多い公開サイトでは、これらの制限に抵触しないよう注意が必要です。

  • SOQL クエリの最適化: 効率的な SOQL クエリを使用し、ループ内でクエリを実行するなどのアンチパターンを避けてください。取得するフィールド数を最小限に抑え、WHERE 句と ORDER BY 句を適切に使用して、必要なデータのみを取得するようにします。
  • ガバナ制限: Apex のガバナ制限 (Governor Limits) (例: SOQL クエリの数、DML 操作の数、CPU 時間) に注意し、トランザクションあたりの処理量を抑える設計を心がけてください。バッチ処理や非同期処理 (Queueable Apex, Future Methods) を活用することも検討してください。
  • 外部 API 呼び出し: 外部システムとの連携を行う場合、外部 API の制限と Salesforce のコールアウト制限の両方に注意が必要です。

エラー処理 (Error Handling)

サイトユーザーにとって、予期せぬエラーはフラストレーションの原因となります。適切なエラー処理 (エラー処理) とユーザーフレンドリーなエラーメッセージの実装が不可欠です。

  • Apex でのエラー処理: `try-catch` ブロックを使用して、Apex メソッド内の例外を捕捉し、適切なエラーメッセージを返すようにします。`AuraHandledException` を使用すると、Lightning コンポーネント側でエラーをより適切に処理できます。
  • LWC でのエラー表示: LWC コンポーネントでは、ワイヤーサービスや命令型 Apex 呼び出しからのエラーを捕捉し、ユーザーインターフェースに明確かつ分かりやすい形で表示します。一般的なエラーメッセージだけでなく、可能であれば具体的な指示を提供することで、ユーザーが次の行動を取りやすくなります。
  • ロギング: デバッグログやイベントモニタリングを使用して、発生したエラーを監視し、迅速に問題解決にあたれるようにします。

パフォーマンス (Performance)

サイトのパフォーマンスは、ユーザーエクスペリエンスに直結します。応答速度の遅いサイトは、ユーザーの離脱を招きます。

  • キャッシュの活用: `cacheable=true` を Apex メソッドに設定したり、Experience Builder のキャッシュ設定を活用したりして、サーバーへのリクエスト数を減らします。
  • コンポーネントの最適化: 複雑すぎるコンポーネントを避け、軽量で高速な LWC を優先します。DOM 要素の数を最小限に抑え、不必要なレンダリングを避けます。
  • 画像とメディア: 画像は適切に圧縮し、CDN (Content Delivery Network) を利用して配信することで、読み込み速度を向上させます。
  • モバイル最適化: レスポンシブデザインを実装し、モバイルデバイスでも高速かつ快適に利用できるようにします。

セキュリティ (Security)

サイトのセキュリティ (セキュリティ) は最も重要です。情報漏洩や不正アクセスを防ぐための対策を講じる必要があります。

  • OWASP Top 10: Salesforce のセキュリティ機能は多くの一般的な脆弱性 (例: XSS, CSRF) に対応していますが、カスタムコードを記述する際には、OWASP Top 10 に基づくベストプラクティスを常に意識してください。
  • FSL (Field-level Security): Apex で SOQL クエリを実行する際は、ユーザーの項目レベルセキュリティ (Field-level Security) を尊重するために、`with sharing` または `without sharing` キーワードを適切に使用し、`stripInaccessible` を使用してアクセスできない項目を削除することを検討してください。
  • SSL/TLS: すべての通信が HTTPS/TLS で暗号化されていることを確認します。
  • パスワードポリシー: 強力なパスワードポリシーを設定し、定期的なパスワード変更を推奨します。

ライセンス (Licensing)

Experience Cloud には、異なる要件と機能を提供する複数のライセンスタイプ (ライセンスタイプ) があります。プロジェクトのニーズに最も適したライセンスを選択することが重要です。

  • Community Login License: ログインごとに課金されるモデルで、不定期にアクセスするユーザーに適しています。
  • Community Member License: 月額固定料金で、定期的にサイトにアクセスするユーザーに適しています。
  • Customer Community Plus / Partner Community: より高度な共有機能やロール階層が必要な場合に使用します。

ライセンスの種類によって、利用できる機能や API の制限、データストレージなどが異なりますので、事前に要件を明確にし、適切なライセンスを選定してください。


まとめとベストプラクティス

Salesforce Experience Cloud は、企業が顧客、パートナー、従業員とのデジタルインタラクションを変革するための強力なプラットフォームです。このプラットフォームを活用することで、パーソナライズされたデジタルエクスペリエンスを提供し、エンゲージメントを高め、ビジネスプロセスを効率化することができます。

成功する Experience Cloud サイトを構築し、運用するためのベストプラクティス (ベストプラクティス) を以下に示します。

  • 明確な目的設定: サイトを構築する前に、ターゲットオーディエンス、主要なビジネス目標、提供したい主要な価値を明確に定義します。これにより、サイトの設計と機能の優先順位付けが容易になります。
  • 標準機能とテンプレートの活用: Salesforce の標準機能と提供されているテンプレートを最大限に活用することから始めます。これにより、開発時間とコストを削減し、迅速にサイトを展開できます。カスタム開発は、標準機能では実現できない独自の要件がある場合にのみ検討します。
  • ユーザーエクスペリエンス (UX) の重視: サイトはユーザー中心に設計されるべきです。直感的で使いやすいナビゲーション、明確な情報構造、モバイルデバイスでの良好なレスポンシブデザインを心がけ、ユーザーのジャーニーを最適化します。
  • セキュリティの最優先: データセキュリティは常に最優先事項です。最小権限の原則に基づき、プロファイル、権限セット、共有設定、ゲストユーザプロファイルを厳格に管理してください。定期的なセキュリティレビューと脆弱性テストを実施します。
  • パフォーマンスの最適化: 高速で応答性の高いサイトは、ユーザー満足度を高めます。効率的な Apex コードと LWC を作成し、キャッシュ戦略を適切に実装し、メディアファイルを最適化することで、サイトのロード時間を短縮します。
  • コンテンツ戦略とガバナンス: サイトのコンテンツは常に最新かつ関連性の高い状態に保つ必要があります。コンテンツの作成、承認、公開、アーカイブのプロセスを確立し、コンテンツの質と一貫性を維持するためのガバナンスモデルを確立します。
  • パーソナライゼーションの活用: オーディエンスターゲティング機能を利用して、ユーザーの役割、地域、行動履歴などに基づいて、パーソナライズされたコンテンツや情報を提供します。これにより、ユーザーエンゲージメントを大幅に向上させることができます。
  • 継続的な監視と改善: サイトのパフォーマンス、ユーザーアクティビティ、エラーログを継続的に監視します。ユーザーからのフィードバックを収集し、分析に基づいてサイトを繰り返し改善していくことで、長期的な成功を確実なものにします。

Experience Cloud は単なるツールではなく、顧客、パートナー、従業員との関係を深め、ビジネスの成長を加速させるための戦略的な資産です。これらのベストプラクティスを適用することで、企業は強力で魅力的なデジタルエクスペリエンスを構築し、競争優位性を確立できるでしょう。

コメント