外部サービス連携

Salesforceの変更をChatworkのチャットへ知らせる

商談のフェーズが変わったときに、Chatworkの決まったチャットへ知らせを流せます。2023年に書いた記事を、2026年9月時点のChatwork APIとSalesforceの公式ドキュメントで確かめ直し、作り方まで書き足しました。

2023.05.16

どういうときに使うのか

Chatworkは、Chatwork株式会社が提供するビジネスチャットです。社内の連絡をChatworkに寄せている会社では、Salesforceの変化をChatworkで知りたい、という声がよく出ます。

たとえば次のような使い方です。

  • 商談のフェーズが「受注」に変わったら、営業チームのチャットへ知らせる
  • 大きな金額の商談が作られたら、上長のいるチャットへ知らせる
  • ケースの優先度が上がったら、サポートのチャットへ知らせる

当時の記事では、商談のフェーズを変えるとChatworkのチャットに通知が届く画面と、枠で囲んだ「インフォメーション」の形で届く画面を紹介していました。

この記事は2023年に書いたものを、2026年9月時点のChatwork APIのドキュメントとSalesforceの公式ヘルプで確かめ直しています。料金はプランや契約で変わるため、ここには書きません。Chatworkの公式サイトで確認してください。

仕組みの全体像

ここでは、SalesforceからChatwork APIを直接呼ぶ形で作ります。この形なら、何を・いつ・どのチャットへ送るかを自社で決められます。

部品役割
Chatwork APIのAPIトークンChatworkへ投稿する権限です。投稿する人のアカウントで発行します
外部ログイン情報・指定ログイン情報APIトークンをSalesforceの中に暗号化して持ち、要求のヘッダーへ付けます
呼び出し可能なApexChatwork APIへメッセージを投稿します
レコードトリガーフロー商談のフェーズが変わったときに、上のApexを呼びます

Chatwork APIで使うのは「チャットにメッセージを投稿する」(POST /rooms/{room_id}/messages)です。ベースURIは https://api.chatwork.com/v2 で、APIトークンは要求のヘッダーに x-chatworktoken というキーで付けます。

作り方

  1. Chatwork APIの利用を始める

    Chatworkの画面右上の利用者名から「サービス連携」を開き、「APIトークン」を選びます。パーソナルプラン以外では、組織管理者への利用申請が要ります。

  2. 外部ログイン情報を作る

    Salesforceの設定で外部ログイン情報を作り、認証プロトコルを「カスタム」にします。プリンシパルに認証パラメータを1つ足し、APIトークンを入れます。プリンシパルは、使う人の権限セットかプロファイルにひもづけます。

  3. カスタムヘッダーを足す

    外部ログイン情報に、名前が x-chatworktoken、値が {!$Credential.ChatworkAuth.ApiToken} のカスタムヘッダーを足します。ChatworkAuth は外部ログイン情報の名前、ApiToken は認証パラメータの名前です。

  4. 指定ログイン情報を作る

    名前を Chatwork、URLを https://api.chatwork.com/v2 にし、上の外部ログイン情報を選びます。「認証ヘッダーを生成」はオフにします。

  5. Apexクラスを置く

    下のクラスを置きます。フローから呼べるように callout=true を付けています。

  6. フローから呼ぶ

    商談のレコードトリガーフローを作り、開始要素の「アクションと関連レコード」で非同期パスを足します。非同期パスの中でApexアクション「Chatworkに投稿」を置き、ルームIDと本文を渡します。

public with sharing class ChatworkNotifier {
    public class Request {
        @InvocableVariable(required=true label='ルームID')
        public String roomId;
        @InvocableVariable(required=true label='本文')
        public String message;
    }

    @InvocableMethod(label='Chatworkに投稿' callout=true)
    public static void post(List<Request> requests) {
        Http http = new Http();
        for (Request r : requests) {
            HttpRequest req = new HttpRequest();
            req.setEndpoint('callout:Chatwork/rooms/' + EncodingUtil.urlEncode(r.roomId, 'UTF-8') + '/messages');
            req.setMethod('POST');
            req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.setBody('body=' + EncodingUtil.urlEncode(r.message, 'UTF-8'));
            HttpResponse res = http.send(req);
            if (res.getStatusCode() != 200) {
                System.debug(LoggingLevel.ERROR, 'Chatwork ' + res.getStatusCode() + ' ' + res.getBody());
            }
        }
    }
}

Chatworkのチャットへメッセージを投稿する呼び出し可能なApex

APIトークンはコードにもフローにも書きません。指定ログイン情報を通すことで、トークンは暗号化されたまま要求のヘッダーに付きます。

枠で囲んだ形で知らせる

当時の記事で見せていた「インフォメーション」の形は、Chatworkのメッセージ記法で作れます。本文を [info][title]見出し[/title]本文[/info] で囲むと、枠線とタイトルの付いたメッセージになります。

たとえば、フローの数式で本文を次のように組み立てます。

[info][title]商談のフェーズが変わりました[/title]商談名:{!$Record.Name}
フェーズ:{!$Record.StageName}[/info]

フローで組み立てる本文の例

ここで間違えやすいところです。レコードトリガーフローの、保存と同時に動く通常のパスからは外部を呼べません。Salesforceの公式ヘルプでは、外部を呼ぶ処理は非同期パスで動かすよう案内されています。また、非同期パスでは ISCHANGED 演算子が使えません。「フェーズが変わったとき」に絞るには、開始要素で条件を決め、更新時にフローを動かすタイミングを「条件を満たすように更新されたときだけ」(公式ヘルプの英語では Only when the record is updated to meet the conditions)にします。
気をつけること理由
同じチャットへの投稿回数Chatwork APIには、チャットごとに10秒あたり10回までという投稿の制限があります。一括更新でたくさん動くと、429のエラーになります
APIトークンの持ち主投稿はトークンを発行した人の名前で出ます。個人ではなく、通知用のアカウントで発行するほうが運用しやすくなります
トークンの扱いChatworkのドキュメントでは、APIトークンに有効期限がなく、すべての機能を使えると書かれています。URLのクエリに載せず、必ずヘッダーで送ります

当時の記事から変わったこと

2023年の記事には、商談のフェーズを変える画面、Chatworkに通知が届いた画面、インフォメーションの形で届いた画面の3枚を載せていました。この3枚の画像は、いまは残っていません。同じ内容を、上の手順と記法の例で文章に書き起こしています。

当時の記事にあったChatworkの料金は、改定で変わっている可能性があるため外しました。

確認した環境

  • 2026年9月時点のChatwork APIのドキュメント(エンドポイント、メッセージの投稿、メッセージ記法、利用開始の方法)で確認しています
  • Salesforce側は、2026年9月時点の公式ヘルプ(指定ログイン情報のカスタムヘッダー、レコードトリガーフローの考慮事項)とApex開発者ガイド(InvocableMethod)で確認しています

まとめ

  • SalesforceからChatwork APIを直接呼ぶ形なら、送る中身と宛先を自社で決められます
  • APIトークンは外部ログイン情報に入れ、カスタムヘッダー x-chatworktoken で送ります
  • 投稿は POST /rooms/{room_id}/messages を、callout=true の呼び出し可能なApexから呼びます
  • フローからは非同期パスで呼び、ISCHANGED の代わりに開始要素の条件で絞り込みます
  • [info][title]…[/title]…[/info] で囲むと、枠とタイトルの付いた通知になります

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。