Salesforceでのサブスクリプション売上管理のコツ〜時系列マトリックス〜

Salesforceを活用する中で、商談受注後の売上額までSalesforce内で管理したいと考えることはよくあるのではないでしょうか。

売り切り型の商品であれば商談の受注日とその金額をそのままその時点の売上として利用できますが、サブスクリプション形式のサービスを提供する事業では、契約期間中の売上金額を継続して記録していく必要があります。

つまり売上の推移を時系列に従って管理する必要がありますが、Salesforceの標準画面でこのようなデータを取り扱おうとすると、縦方向でのリスト形式となってしまい、全体の把握がむずかしくなってしまいます。

そのため、サブスクリプションサービスの売上管理において、データを横方向に並べて表示および管理できる「時系列マトリックス変換機能」は大変有効な選択肢となります。

(※時系列マトリックス変換機能について詳しくはこちらをご覧ください。)


売上データを表示する時系列マトリックスの作成

ここでは時系列マトリックス変換の対象となるオブジェクトを「売上」として、「サブスクリプション」オブジェクトに対して関連リストとして保持される場合を想定します。

「売上」オブジェクトには「計上日」「計上金額」といった項目があり、サブスクリプションオブジェクトとは(サブスクリプションを主とする)主従関係にあります。

以下、Mashmatrix Sheetで月次の売上データを表示する方法について記載します。

  1. 新しくシートを作成し、シート内に表示するオブジェクトとして「サブスクリプション」オブジェクトを選択します。
  2. 列ヘッダのメニューから「列の追加」を選び、ダイアログのタブから「時系列マトリックス列を追加」タブを選びます。
    (こちらのタブは『時系列マトリックス変換オプション』を有効化した場合のみアクセス可能となります。オプションを有効化するには営業担当までご連絡ください)

  3. 子関連オブジェクトとして「売上」を選択します。
  4. 系列項目として「計上日」項目を選択します。
  5. 表示間隔として「月ごと」を選択し、開始と期間は任意の開始日付・期間を指定します
  6. 列として表示する項目を追加し、「計上金額」項目を選択します

できあがりのイメージはこちらです。各サブスクリプションごとに横方向に売上額が月ごとに表示されているのがわかるかと思います。


時系列マトリックスの注意点と対処方法

以下、サブスクリプションの売上推移を時系列マトリックスで実現するにあたり、注意すべき点と代表的な対処方法についてとりあげます。

同一月の重複レコードを禁止する

時系列マトリックスで月ごとのデータを管理する場合、各親レコードに対して同じ月の系列値を持つレコードは必ず1件以下となる必要があります。

これは重要な制約です。もし同一の月で複数のレコードが存在する場合、Sheetのマトリックス列からは編集対象となるレコードを1つに決定できなくなります。

Sheetの時系列マトリックス列からデータを入力する限りはこのような重複は発生しませんが、それ以外の入力経路がある場合には注意が必要です。

この制約は、以下のようにしてSalesforceプラットフォームの設定で強制させることができます。

キー項目の準備

新しくテキスト型の項目として「売上管理キー」項目を用意します。この項目は”ユニーク”として設定されており、「売上」オブジェクト内で重複する値のレコードが存在できないように制約しておきます。

プロセスビルダーによる自動更新設定

ここでSalesforceのプロセスビルダーを用いることで、「計上日」項目が更新されると自動的にその売上が所属するサブスクリプションレコードのID値と計上日の年月値とをつなぎ合わせた文字列で「売上管理キー」項目を更新するように設定していきます。

  1. プロセスビルダー画面にアクセスし、新規にプロセスを作成。プロセスを開始するタイミングは「レコードが変更されたとき」
  1. オブジェクトとして「売上」を選択、プロセスの開始条件は「レコードを作成または編集したとき」と指定
  1. 「条件を追加」をクリックし、条件を追加する。アクションの実行条件として「数式の評価がtrueになる」を選び、以下の数式を入力する。

    ISNEW() || ISCHANGED([Sales__c].Accounting_date__c)

    (ここで Sales__c は「売上」オブジェクトのAPI参照名で、Accounting_date__c は「計上日」項目のAPI参照名)
  1. ルール適用時のアクションから「アクションを追加」をクリックし、アクション種別として「レコードの更新」を選択する。レコードには「プロセスを開始したレコードを選択」を選択する。レコードを更新する条件は設定せず、更新するレコードの新しい項目値に、「売上管理キー」を項目として選び、数式として以下の値を設定する

    [Sales__c].Subscription__c & "_" &
    TEXT(YEAR([Sales__c].Accounting_date__c)) & "_" &
    TEXT(MONTH([Sales__c].Accounting_date__c))


    (ここで Sales__c は「売上」オブジェクトのAPI参照名で、Subscription__c は「サブスクリプション」参照項目のAPI参照名、Accounting_date__c は「計上日」項目のAPI参照名)
  1. プロセスを保存し、有効化する

以上により、同一のサブスクリプション内で同じ年月の計上日項目を持つレコードが作成されたときは、ユニーク制約のエラーが発生するので、必ずサブスクリプションごとに同一月のレコードが1つ以下であることを保証できます。


計上日に月初以外の値を許可する場合

時系列マトリックス変換の仕様として、系列として指定する日付項目にはかならずその期間の最初の日付値が設定される必要があります。

例えば表示間隔が月ごとである場合、系列となる項目には「2020/4/1」「2020/5/1」といった月初の日付が格納される必要があります。

そのため、もし月次での売上管理を行っている中で、売上の計上日として月初(1日)以外の値を格納する必要がある場合、時系列マトリックス変換用に月初の日付値を保持する新しい日付項目を用意する必要があります。

「計上月」項目の用意

時系列マトリックスの系列項目として用いるために、新しく「計上月」項目を用意します。項目の名前は「計上月」としていますが、日付値を格納する日付項目となります。

月初の日付は数式で表現することもできますが、Sheetのマトリックス列から入力を行うためには必ず系列となる項目は書き込み可能である必要があるため、数式ではなく新規の日付項目として作成します。



日付項目値の同期設定

計上月項目を導入したため、日付を格納する項目が2つ存在することになりました。二重管理を避けるため、値の変更時には自動的に同期するようSalesforce上で設定します。

以下、「計上日」項目が更新されると自動的にその計上日の月初の日付値に「計上月」項目を更新するようにプロセスビルダーを設定していきます。

  1. プロセスビルダー画面にアクセスし、新規にプロセスを作成。プロセスを開始するタイミングは「レコードが変更されたとき」
  2. オブジェクトとして「売上」を選択、プロセスの開始条件は「レコードを作成または編集したとき」と指定
  3. 「条件を追加」をクリックし、条件を追加する。アクションの実行条件として「数式の評価がtrueになる」を選び、以下の数式を入力する。


(ISNEW() || ISCHANGED([Sales__c].Accounting_date__c)) &&
!ISBLANK([Sales__c].Accounting_date__c)


(ここで Sales__c は「売上」オブジェクトのAPI参照名で、Accounting_date__c は「計上日」項目のAPI参照名)

  1. ルール適用時のアクションから「アクションを追加」をクリックし、アクション種別として「レコードの更新」を選択する。レコードには「プロセスを開始したレコードを選択」を選択する。レコードを更新する条件は設定せず、更新するレコードの新しい項目値に、「計上月」を項目として選び、数式として以下の値を設定する

    DATE(
      YEAR([Sales__c].Accounting_date__c),
      MONTH([Sales__c].Accounting_date__c),
      1
    )


    (ここで Sales__c は「売上」オブジェクトのAPI参照名で、Accounting_date__c は「計上日」項目のAPI参照名)
  1. プロセスを保存

Sheet内のマトリックス列から売上データが新規入力されたときは、計上日項目ではなく系列項目として設定する計上月項目に値が設定されて保存されます。そのため、新しいレコードに「計上月」項目が設定されたときは「計上日」項目を同じ値で設定するように指定します。

  1. 先の手順で作成したプロセスの「条件を追加」をクリックし、条件を追加する。アクションの実行条件として「数式の評価がtrueになる」を選び、以下の数式を入力する。

    (ISNEW() || ISCHANGED([Sales__c].Accounting_month__c)) &&
    !ISBLANK([Sales__c].Accounting_month__c)


    (ここで Sales__c は「売上」オブジェクトのAPI参照名で、Accounting_month__c は「計上月」項目のAPI参照名)
  1. ルール適用時のアクションから「アクションを追加」をクリックし、アクション種別として「レコードの更新」を選択する。レコードには「プロセスを開始したレコードを選択」を選択する。レコードを更新する条件は設定せず、更新するレコードの新しい項目値に、「計上日」を項目として選び、項目の参照から「計上月」項目を選択する
  1. プロセスを保存し、有効化する

あとは、「計上日」項目のかわりに「計上月」項目を時系列マトリックス変換の系列項目として指定し、時系列マトリックス列をシートに追加します。

まとめ

時系列マトリックス変換は強力な機能ですが、Salesforceのデータ構造を設計する時点で意識しなければならない点も数多くあります。プロセスビルダー/フローなどのSalesforceプラットフォームの自動化処理を組み込めば既存のデータ構造にうまくマッチさせることもできますが、データモデル設計の段階から時系列マトリックス変換の特色をあらかじめ考慮しておくに越したことはないでしょう。

30日間無料トライアルを試してみる

まずは、30日間無料トライアルから始めませんか?