メインコンテンツまでスキップ

ワークフロールール

カスタマイズ可能なワークフロールールでサポートプロセスを自動化します。ワークフロールールを使用すると、チケット属性を自動的に更新し、 通知を送信し、定義されたイベントまたは条件に基づいて特定のアクションをトリガーできます。この機能は、手作業を減らし、 一貫性を維持し、応答時間を高速化するのに役立ちます。

インストール後、Helpdesk MXは自動的にデフォルトのワークフロールール「エージェント返信時にステータスを顧客待ちに自動変更」を作成します。


一般情報​

一般情報一般情報
  • Rule Name: ルールの説明的な名前を定義します。明確な名前は、チームが各ルールの動作を簡単に識別するのに役立ちます。
  • Active: ルールを有効または無効にします。アクティブなルールのみが、イベントと条件が満たされたときに実行されます。
  • Event: ルールをトリガーするイベントを選択します。
  • Priority / Sort Order: ルールの処理順序を指定します。小さい数字が最初に実行されます。これにより、複数のルールが同じイベントに適用される場合に、どのルールが優先されるかを制御できます。
  • Stop Further Rules Processing: このルールが適用された後、優先度の低いルールの実行を停止します。特定のルールがイベントを完全に制御したい場合に便利です。

イベント​

イベントは、ワークフロールールが評価されるタイミングを定義します。利用可能なイベント:

  • New Ticket — 新しいチケットが作成されたときにトリガーされます。
  • New Customer Reply — 顧客が新しい返信を送信したときにトリガーされます。
  • New Staff Reply — エージェントが返信を投稿したときにトリガーされます。
  • New Third Party Reply — 第三者がメッセージを送信したときにトリガーされます。
  • Ticket Assigned — チケットがユーザーに割り当てられたときにトリガーされます。
  • Ticket Updated — チケットフィールドが更新されたときにトリガーされます。
  • Cron Every Hour — システムによって毎時トリガーされ、時間ベースのアクションを可能にします。

条件​

条件は、ワークフロールールをいつ実行すべきかを定義します。1つまたは複数の条件を使用し、ALL/ANYロジックで組み合わせ、 高度なフィルタリングのためにネストされたグループを作成することもできます。 イベントが発生するたびにルールを実行する場合は、このセクションを空のままにします。

条件条件

利用可能なフィールド​

次のフィールドを使用して条件を構築できます:

  • Subject — チケットの件名の単語またはフレーズをチェックします。
  • Customer Email — 顧客のメールアドレスと一致します。
  • Customer Name — 顧客の名前を比較します。
  • Channel — 特定のソース(例:メール、連絡フォーム、API)から作成されたチケットをフィルタリングします。
  • Department — チケットに割り当てられた現在の部門と一致します。
  • Department (Before Change) — 更新イベント前の部門との比較を許可します。
  • Folder — チケットが現在属しているフォルダをチェックします。
  • Folder (Before Change) — 最後の変更前のフォルダをチェックします。
  • Owner — 割り当てられたエージェントと一致します。
  • Owner (Before Change) — 更新前の所有者を比較します。
  • Priority — チケットの現在の優先度をチェックします。
  • Priority (Before Change) — 更新前の優先度を比較します。
  • Status — チケットの現在のステータスをチェックします。
  • Status (Before Change) — 以前のステータスを比較します。
  • Last Message — 最後のメッセージのコンテンツをチェックできます。
  • Last Reply By — 最後に返信したのが誰か(顧客、スタッフ、または第三者)を決定します。
  • Hours Since Created — チケット作成からの経過時間。
  • Hours Since Last Reply — 最後の返信からの時間。
  • Hours Since Updated — チケットの最後の変更からの時間。

条件演算子​

各条件は、値の比較方法を定義するために次の演算子のいずれかを使用できます:

  • Equals — フィールド値が指定された値と正確に一致したときにトリガーされます。
  • Not Equals — フィールド値が指定された値と異なるときにトリガーされます。
  • Greater Than — 値が指定されたものより大きい場合にトリガーされます(主に数値または時間フィールド用)。
  • Greater Than or Equals — 値が指定されたものより大きいまたは等しい場合にトリガーされます。
  • Less Than — 値が指定されたものより小さい場合にトリガーされます。
  • Less Than or Equals — 値が指定されたものより小さいまたは等しい場合にトリガーされます。
  • Between — 値が2つの指定された数値の間にある場合にトリガーされます(時間ベースの条件に便利)。
  • Matches Regex — 高度なパターンマッチングのために正規表現を使用してフィールド値を比較します。
  • Starts With — フィールドが指定されたテキストで始まる場合にトリガーされます。
  • Ends With — フィールドが指定されたテキストで終わる場合にトリガーされます。
  • Is Empty — フィールドに値がない場合にトリガーされます。
  • Is Not Empty — フィールドに任意の値が含まれている場合にトリガーされます。
  • Contains — フィールドに指定されたテキストが含まれている場合にトリガーされます。
  • Does Not Contain — フィールドに指定されたテキストが含まれていない場合にトリガーされます。

アクション​

アクションは、すべての条件が満たされた後に何が起こるかを定義します。1つのルールで複数のアクションを組み合わせることができます。

アクションアクション

利用可能なアクション:

  • Set Status — チケットのステータスを更新します。
  • Set Priority — 優先度レベルを変更します。
  • Set Department — チケットを別の部門に再割り当てします。
  • Set Owner — 特定のエージェントに割り当てます。
  • Change Folder — チケットを特定のフォルダに移動します。
  • Add Tags — 分類用のタグを追加します。
  • Remove Tags — チケットから既存のタグを削除します。
  • Send Email — 指定された受信者にメール通知を送信します。
  • Run Script — 高度な自動化のためにカスタムJavaScriptコードを実行します。

Send Emailアクション​

Send Emailアクションを使用すると、ルールが実行されたときに自動メール通知を送信できます。これは、チームメンバーに通知したり、顧客に情報を提供したり、外部の関係者とコミュニケーションを取るのに便利です。

利用可能なオプション:

  • Send to ticket owner — 割り当てられたエージェントに通知します。
  • Send to all department users — チケットの部門のすべてのメンバーに通知します。
  • Send to customer — 更新について顧客に情報を提供します。
  • Send to other addresses — カスタムメールアドレスを指定します。
  • Email Subject — メールの件名を定義します(Liquidテンプレート変数をサポート)。
  • Email Body — メールのコンテンツを作成します(Liquidテンプレート変数をサポート)。
  • Include attachments — コンテキストのために最後のメッセージからのファイルを添付します。

テンプレート変数​

Email SubjectおよびEmail BodyフィールドでLiquidテンプレート変数を使用して、チケット、顧客、メッセージ情報を動的に挿入できます。

チケット変数:

変数説明
{{ ticket.code }}チケットコード(例:T-001)
{{ ticket.subject }}チケットの件名
{{ ticket.created_at }}チケット作成のタイムスタンプ
{{ ticket.updated_at }}最後の更新のタイムスタンプ
{{ ticket.customer_name }}顧客のフルネーム
{{ ticket.customer_email }}顧客のメールアドレス
{{ ticket.admin_url }}管理パネルのチケットへの直接リンク
{{ ticket.admin_last_message_text }}エージェントの最後の返信の本文(プレーンテキスト)
{{ ticket.admin_last_message_html }}エージェントの最後の返信の本文(HTML)
{{ ticket.customer_last_message_text }}顧客の最後の返信の本文(プレーンテキスト)
{{ ticket.customer_last_message_html }}顧客の最後の返信の本文(HTML)

所有者/割り当て変数:

変数説明
{{ owner.firstname }}割り当てられたエージェントの名
{{ owner.lastname }}割り当てられたエージェントの姓
{{ owner.email }}割り当てられたエージェントのメール
{{ owner.fullname }}割り当てられたエージェントのフルネーム
{{ owner.is_admin }}所有者が管理者かどうか

部門変数:

変数説明
{{ department.name }}部門名
{{ department.sender_name }}部門の送信者名

メッセージ変数(メッセージイベントによってトリガーされた場合):

変数説明
{{ message.body_text }}メッセージのコンテンツ(プレーンテキスト)
{{ message.body_html }}メッセージのコンテンツ(HTML)
{{ message.type }}メッセージタイプ
{{ message.created_at }}メッセージ作成のタイムスタンプ

日付/時刻変数:

変数説明
{{ now }}現在のタイムスタンプ(RFC3339)
{{ date }}現在の日付(YYYY-MM-DD)
{{ time }}現在の時刻(HH:MM:SS)
{{ year }}現在の年

メールテンプレートの例:

件名: チケット#{{ ticket.code }}への新しい返信

こんにちは {{ owner.firstname }}さん、

顧客がチケット「{{ ticket.subject }}」に返信しました。

顧客: {{ ticket.customer_name }} ({{ ticket.customer_email }})

最後のメッセージ:
{{ ticket.customer_last_message_text }}

チケットを表示: {{ ticket.admin_url }}

Run Scriptアクション​

Run Scriptアクションを使用すると、単純なフィールド割り当てを超えた複雑な自動化ロジックを実装するためにカスタムJavaScriptコードを実行できます。スクリプトはチケットデータを読み取り、条件付き決定を行い、複数のフィールドを同時に更新できます。

利用可能なチケットプロパティ(読み取り):

プロパティ説明
ticket.idチケットの一意の識別子
ticket.subjectチケットの件名
ticket.folder現在のフォルダ(INBOX、ASSIGNED、SPAMなど)
ticket.tagsタグの配列
ticket.statusid、code、nameを持つオブジェクト
ticket.priorityidとnameを持つオブジェクト
ticket.departmentidとnameを持つオブジェクト
ticket.ownerid、email、firstname、lastnameを持つオブジェクト
ticket.customerid、email、firstname、lastname、nameを持つオブジェクト
ticket.<custom_field_code>そのコードによるカスタムフィールド値

利用可能なチケットプロパティ(書き込み):

プロパティ期待される値
ticket.statusステータスコード(文字列)またはステータスID
ticket.priority優先度名(文字列)または優先度ID
ticket.department部門名(文字列)または部門ID
ticket.ownerユーザーメール(文字列)またはユーザーID
ticket.folderフォルダ名: "INBOX"、"ASSIGNED"、"SPAM"、"ARCHIVE"
ticket.tagsタグの文字列配列
ticket.<custom_field_code>カスタムフィールドタイプに一致する値

ヘルパー関数:

関数戻り値
getStatuses()すべての利用可能なステータスの配列
getPriorities()すべての利用可能な優先度の配列
getDepartments()すべての利用可能な部門の配列
getUsers()すべての利用可能なユーザーの配列
fetch(url, options)外部APIへのHTTPリクエストを実行

メッセージコンテキスト(メッセージイベントによってルールがトリガーされた場合に利用可能):

プロパティ説明
message.idメッセージの一意の識別子
message.body_textメッセージのコンテンツ(プレーンテキスト)
message.body_htmlメッセージのコンテンツ(HTML)
message.createdAtメッセージ作成のタイムスタンプ

スクリプト例:

// 件名キーワードに基づいて優先度を設定
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
}
// コンテンツに基づいて部門別にチケットをルーティング
if (ticket.subject.includes("billing") || ticket.subject.includes("invoice")) {
ticket.department = "Billing";
} else if (ticket.subject.includes("technical") || ticket.subject.includes("error")) {
ticket.department = "Technical Support";
}
// VIP顧客を処理
if (ticket.customer && ticket.customer.email.endsWith("@enterprise.com")) {
ticket.priority = "High";
ticket.tags = ["vip", "enterprise"];
}
// カスタムフィールド値を設定
ticket.order_id = "12345";
ticket.vip_customer = true;
ticket.order_amount = 99.99;
// 外部APIから顧客データを取得してチケットを更新
var response = fetch("https://api.example.com/customers/" + ticket.customer.email, {
headers: { "Authorization": "Bearer YOUR_API_KEY" }
});

if (response.ok && response.json) {
ticket.customer_tier = response.json.tier;
if (response.json.tier === "enterprise") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
}
}

重要な注意:

  • スクリプトには無限ループを防ぐための10秒のタイムアウトがあります。
  • 無効なフィールド値(存在しないステータス、優先度など)は無視されます。
  • スクリプトエラーは他のルールに影響を与えたり、システムに失敗を引き起こしたりしません。
  • カスタムフィールドは名前ではなくコードでアドレス指定されます。

通知​

ルールが実行されたときに自動メール通知を送信して、すべての関係者に情報を提供できます。

通知通知

通知オプション:

  • Send email to ticket owner — 割り当てられたエージェントに通知します。
  • Send email to all department users — 部門のすべてのメンバーに通知します。
  • Send email to customer — 変更について顧客に情報を提供します。
  • Send email to other addresses — 外部の受信者に送信します。
  • Email Subject — メールの件名を指定します。
  • Email Body — メールのコンテンツを作成します。
  • Attach files previously attached to the last message — コンテキストのために以前の添付ファイルを含めます。

ワークフロールールの例​

顧客返信時のステータス変更
顧客が返信すると、システムは自動的にチケットのステータスをWaiting for Agentに変更します。

タイプ: Workflow Rule
Is Active: はい
Event: New Customer Reply
Conditions: Status Not Equals Closed
Actions: Set Status → Waiting for Agent
第三者からの新しい返信
第三者がメッセージを送信すると、システムはステータスをWaiting for Agentに設定し、`third_party`タグを追加します。

タイプ: Workflow Rule
Is Active: はい
Event: New Third Party Reply
Conditions: なし
Actions:
Set Status → Waiting for Agent
Add Tags → third_party
チケットがスタッフに割り当てられました
チケットがスタッフメンバーに割り当てられると、自動的にAssignedフォルダに移動し、メール通知が送信されます。

タイプ: Workflow Rule
Is Active: はい
Event: Ticket Assigned
Conditions: なし
Actions:
Change Folder → Assigned
Send email to ticket owner
72時間返信がない場合にチケットをクローズ
72時間以内に返信がない場合、チケットは自動的にクローズされます。

タイプ: Workflow Rule
Is Active: はい
Event: Cron Every Hour
Conditions:
Status Equals Waiting for Customer
Hours Since Last Reply Greater Than 72
Actions: Set Status → Closed
スクリプト: 顧客のメールドメインに基づくルーティングと優先順位付け
企業顧客を専門サポートにルーティングし、高優先度を設定します。

タイプ: Workflow Rule
Is Active: はい
Event: New Ticket
Conditions: なし
Actions: Run Script

```javascript
if (ticket.customer && ticket.customer.email) {
var domain = ticket.customer.email.split("@")[1];

if (domain === "enterprise.com" || domain === "bigcorp.com") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.tags = ["enterprise", "priority"];
}
}
```
スクリプト: 件名キーワードによる自動チケット分類
件名のコンテンツに基づいてチケットを自動的に分類し、カスタムフィールドを設定します。

タイプ: Workflow Rule
Is Active: はい
Event: New Ticket
Conditions: なし
Actions: Run Script

```javascript
var subject = ticket.subject.toLowerCase();

if (subject.includes("refund") || subject.includes("return")) {
ticket.department = "Billing";
ticket.category = "refund_request";
} else if (subject.includes("password") || subject.includes("login")) {
ticket.department = "Technical Support";
ticket.category = "account_access";
} else if (subject.includes("order") || subject.includes("shipping")) {
ticket.department = "Orders";
ticket.category = "order_inquiry";
}
```
スクリプト: メッセージコンテンツ分析に基づくエスカレーション
メッセージ内の緊急キーワードを検出し、チケットを自動的にエスカレートします。

タイプ: Workflow Rule
Is Active: はい
Event: New Customer Reply
Conditions: なし
Actions: Run Script

```javascript
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
var urgentKeywords = ["asap", "urgent", "critical", "down", "outage", "emergency"];

for (var i = 0; i < urgentKeywords.length; i++) {
if (body.includes(urgentKeywords[i])) {
ticket.priority = "High";
ticket.tags = ticket.tags.concat(["escalated"]);
break;
}
}
}
```