チケットトリアージ内部ツール:1日で作るモデルとワークフロー計画
視覚的なビジネスロジックで、明確なデータモデル・ステータスワークフロー・SLA・エスカレーション通知を備えたチケットトリアージ内部ツールを1日で構築する方法。

チケットトリアージツールが実際に解決する問題
メール、チャット、ウェブフォーム、社内メッセンジャーの素早い連絡が混ざると、同じ依頼が二度届くか、最悪届かないことがあります。人はスクリーンショットを転送し、スプレッドシートにメモをコピーし、誰が何を担当しているかを記憶に頼って追いかけます。緊急のものは埋もれ、声の大きい要求が優先されます。
手作業のトリアージは引き継ぎでも破綻します。チャットで「担当」が決まっても、担当者がオフラインになれば次に何をすべきか誰も分かりません。ステータスの意味は人によって異なるため、マネージャーはダッシュボードを信用できず、依頼者は必要以上に待たされます。
遅い対応の多くは悪意が原因ではありません。構造がない――明確な所有、明確な締め切り、エスカレーションの道筋がない――ことが原因です。
チケットトリアージ内部ツールは、乱雑な受付をシンプルで見えるワークフローに変えることでこれを解決します。1日で作ることを目標にするなら、目指すのはあらゆる機能を備えたヘルプデスクではなく、拡張可能な信頼できる骨格です。
1日の終わりに目標にする4点:
- チケット、依頼者、エージェント、アクティビティの基本的なデータモデル
- 明確な遷移と所有ルールを持つ少数のステータス
- 説明しやすいSLAタイミングとエスカレーションのトリガー
- 日常作業に使える内部ダッシュボードとチケット詳細画面
AppMasterのような視覚的プラットフォームで構築すれば、コードを書く代わりにワークフローをビジネスプロセスとしてマップし、チームの実際の習慣に合わせて調整できます。
1日でのスコープ:最小限で役に立つトリアージシステム
トリアージツールが初日から役に立つためには、3つのことを確実に行える必要があります:チケットを一か所に集める、担当者を割り当てる、期限超過の作業を明確にする。その他は後回しで構いません。
まず1〜2つのチケットソースを選びます。最初のバージョンとしてはメールとシンプルなウェブフォームで十分なことが多いです。チャットは後回しにすると良いでしょう。チャットは短文や詳細不足というノイズが増え、グルーピングやラベル付け用の追加ルールが必要になります。
誰がチケットに関わり、各グループで「完了」が何を意味するかを決めます。チーム構成は小さく分かりやすく保ちます。例:Supportは受付と基本的な対応、Opsはアクセスとアカウント、Engineeringはバグやコード修正を担当。あるチームが対応できないチケットタイプは、そのチームに割り当てられないようにします。
現実的な1日スコープとしてコミットする成果は:チケットの作成と閲覧(タイトル、依頼者、緊急度、カテゴリ)、トリアージと割当(所有者+チーム、unassigned状態の明確化)、SLA時計の追跡(最初の応答期限と解決期限)、期限超過時のエスカレーション(適切なチャネルや個人へ通知)、短い結果ノート付きでのクローズです。
これはAppMasterに良く合います:シンプルなデータモデル、基本的な内部ダッシュボード、割り当てやエスカレーション通知のための視覚的なビジネスプロセスロジック。
今は指標の作成を後回しにしましょう。生データ(タイムスタンプ、ステータス変化、担当履歴)を保存しておき、レポートは後で追加します。後から応答までの時間や上位カテゴリのようなトレンドダッシュボードを追加できますが、分析が今日必要なツールの提供を遅らせないでください。
簡単なチェック:午前9時に新しい依頼が届き、誰も11時まで見ていなかった場合、最初のバージョンはその失敗を可視化し、無視しにくくするべきです。
役割、アクセス、説明責任
誰が明確に責任を持つかが決まっていないとトリアージツールは失敗します。必要な少数の役割に名前をつけ、サポート作業の実際のやり方に沿うように権限を設定してください。
ほとんどのチームは4つの役割でほぼ事足ります:
- Requester: チケットを作成しコメントを追加でき、自分のチケットのみを見られる。
- Agent: 自分に割り当てられたチケットを対応し、ステータス、優先度、メモを更新できる。
- Team lead: チーム内の再割当ができ、エスカレーションを承認し、優先度を上書きできる。
- Admin: チーム、カテゴリ、SLAルールなどのグローバル設定を管理する。
可視性のルールも決めて一貫させます。モデルを一つ選んで守らないと、人々はツールを信用しなくなります。
実務的なアプローチ:依頼者は自分のチケットのみ、エージェントは自分のチームキューのチケット、チームリードは部門全体のチケット、管理者はすべてを見られるようにします。プライバシーが必要なら、リードと管理者だけが開ける「restricted」フラグを追加します。
説明責任は複雑な権限マトリクスではなく、いくつかの厳格なルールから生まれます。例:チーム間で所有権を変更できるのはリードと管理者のみ。チケットをResolvedに移せるのは担当者(またはリード)のみ。クローズには解決ノートとカテゴリが必要。再オープンには理由が必要。
最後に監査トレイルを必須にします。サービスに影響するすべての変更を記録してください:ステータス、担当者、優先度、SLAティア、エスカレーションなど。誰がいつ何をしたのか、古い値と新しい値を保存します。
AppMasterでは組み込み認証と、重要フィールドが変わったときにAuditEventレコードを書くビジュアルビジネスプロセスでこれを強制できます。
クイックテスト:リードが「なぜこのチケットは午後6:12にResolvedになっているのか?」と聞いたときに、システムが1画面で答えられることを確認してください。
データモデル設計図:必要なテーブルとフィールド
チケットトリアージツールはデータモデルにかかっています。テーブルが整っていれば、ワークフローとダッシュボードは簡単に構築でき(後で変更もしやすく)なります。
最初はデータベースに5つの基本ブロックを作ります(例:AppMasterのData DesignerでPostgreSQLを使用):
- Tickets: subject、description、channel(email、web、phone)、priority、current status、requester情報、created_at、updated_at。
- People structure: users(agentsとadmins)とteams(support、billing、ops)。チーム所属、役割、on_callフラグを追加してワークフローが適切な担当を見つけられるようにする。
- Assignment history: チケットにcurrent_assignee_idを置いて簡易フィルタリングをしつつ、assigned_by、assigned_to、reason、assigned_atで再割当をすべて記録する。
- Conversation: 公開・内部を分けたコメントやメッセージ。添付ファイルは別テーブルにして、メッセージや監査エントリで再利用できるようにする。
- Audit log: ステータス変更、SLAタイマーの開始・停止、エスカレーションイベントを記録する一元化された場所。
将来の痛みを避けるためにいくつかのフィールドを加えます。first_response_due_atとresolve_due_atを持たせておく(計算してもいいが保存しておく)。last_customer_message_atとlast_agent_message_atを保存しておくと、複雑なクエリなしで無応答を検出できます。
ステータスや優先度はenum(または参照テーブル)にしておきます。これでレポートが一貫し、「High」「HIGH」「Urgent!!!」が別ものになる事態を避けられます。
理解しやすいステータスと遷移
ステータスの意味が分からないとトリアージは壊れます。セットは少なく、分かりやすく保ちます。基本は:New、Triaged、In Progress、Waiting、Resolved、Closed。
各ステータスは一つの質問に答えるようにすると良いです:
- New: 誰かが見たか?
- Triaged: 所有者と緊急度が分かっているか?
- In Progress: 誰かが対応中か?
- Waiting: 依頼者やベンダー、別チームの依存で停止しているか?
- Resolved: 修正や回答を提供したか?
- Closed: フォローアップと報告が完了したか?
遷移を明文化してください。誰がどこに移せるかを書き出します。AppMasterならビジュアルなビジネスロジックでUIに有効な次のアクションだけを表示するようにできます。
実務ルールの例:
- NewからTriagedへはトリアージ役だけが動かせ、優先度と担当を設定する。
- TriagedからIn Progressへは担当者のみが移せる。
- Waitingは任意のエージェントが設定できるが、必ずWaiting理由(Customer reply、Vendor、Internal dependency)を選ぶ。
- Resolvedには解決ノートが必要。Closedにはクローズ理由(Duplicate、Won’t fix、Confirmed fixed)が必要。
- ReopenはResolvedかClosedからのみ可能で、常に再オープン理由が必要。
どのイベントがタイムスタンプを作るかを決めてください。これがレポートとSLAの源になります。最初の応答時間は人の最初の公開返信でロックし、ResolvedはステータスがResolvedになったときにロックします。再オープンされた場合は元のタイムスタンプは保持し、reopened_atを追加して繰り返し問題が見えるようにします。
過度に複雑にしないSLAのモデル化
SLAはタイマーを伴う約束です。多くのチームが実際に使うタイマーに絞ってください:最初の応答(誰かが認識する)、次の応答(会話を進める)、解決(問題が完了する)。
ルールの選び方は単純に:優先度で選ぶ。顧客階層があるならそれもスイッチに追加します。これで例外だらけの迷路を避けられます。
SLAの期限は期間だけでなくタイムスタンプとして保存してください。期限タイムスタンプがあればリスト、アラート、レポートが信頼できます。例:P1チケットが10:00に作成されたら、FirstResponseDueAt=10:30、NextResponseDueAt=12:00、ResolutionDueAt=18:00のように計算して保存します。
時計を一時停止する条件を定義します。多くのチームは「Waiting on customer」のときにnext responseとresolutionを止め、first responseは止めないようにします。
- First responseタイマーはチケット作成時に開始
- Next responseタイマーは最後のエージェント返信後に開始
- タイマーは特定のステータス(例:Waiting on customer)でのみ一時停止
- チケットがアクティブなステータスに戻ったらタイマーを再開
- 期限超過は現在時刻が保存されたdueタイムスタンプを過ぎたときに発生
SLAを満たしたとみなすイベントはそれぞれ1つに絞ります:エージェントのコメント、ステータスをIn Progressにする、または外向きメッセージなど、どれを採用するか決めて一貫させます。
AppMasterなら、チケット作成、コメント追加、ステータス変更をトリガーにして期限タイムスタンプを再計算しチケットに書き戻すビジネスプロセスを作れます。
ステップ・バイ・ステップのワークフロー:新規からクローズまで
パスが予測可能だとトリアージツールはよく機能します。大半のチケットをカバーする「ハッピーパス」を1つ作り、例外を隠さず可視化してください。
1) チケット作成(デフォルトを設定)
チケットが作成されたとき(フォーム、メールインポート、内部リクエストなど)、いくつかのフィールドを自動で埋めて途中状態にならないようにします。初期ステータス(通常はNew)、デフォルト優先度(Normalなど)、依頼者、created_atやlast_activity_atのようなタイムスタンプを保存します。
トリアージに必要な最小限をキャプチャします:短いタイトル、説明、カテゴリやサービス領域。足りない項目があればチケットをIncompleteとフラグ付けして誤って割り当てられないようにします。
2) トリアージ(作業準備をする)
トリアージは簡単な品質チェックです。必須フィールドの確認、カテゴリの設定、簡単なルール(優先度+顧客種別=最初の応答期限)からSLA期限を計算します。AppMasterを使えば、これは視覚的なビジネスプロセスでdue_atフィールドを書き込み、triage_eventを監査として記録できます。
「これは我々の案件か?」の簡単な確認を行い、違うなら正しいキューにルーティングして短いメモを残し、往復しないようにします。
3) 割当(担当を決め通知)
割当は初日は手動でもよく、ルールベース(カテゴリ→チーム、最も空きが少ない人)でも構いません。担当者が設定されたらステータスはTriagedのままにし、所有者が見えるように明確な通知を送ります。
4) 対応(時間とコミュニケーションを正直にする)
対応中はIn ProgressやWaiting on Customerのようなステータス変更を許可します。公開返信があるたびにnext_response_dueを更新し、コメントがあるたびにlast_activity_atを更新します。こうすることでSLA追跡とエスカレーションが信頼できます。
5) 解決とクローズ(結果を記録)
解決には短い要約、解決コード(fixed、won’t fix、duplicate)、resolved_atを要求します。クローズは一定期間の無応答後に自動化してもいいし、確認後に手動で行っても構いませんが、closed_atは常に保存してください。
人が無視しないエスカレーション通知
エスカレーションが失敗する理由は2つ:頻発しすぎるか、受け手に次に何をすべきかを伝えないかです。目的はアラートを増やすことではなく、適切なタイミングで一回の明確な促しを出すことです。
トリガーは少数に絞る
説明しやすくテストしやすいトリガーだけにします。多くのチームは次のようなものだけで十分です:SLAが危険域に入った(ウィンドウの75%経過など)、SLAが期限超過、短い猶予(10〜15分)で未割当、Waitingに長く停滞している。
各トリガーは修正可能な最小の人々にルーティングします。まず担当者に通知。担当がいなければチームリードやオンコールに通知。依頼者には入力が必要なとき、または約束した解決時間を変えるときだけ伝えます。
アラートは実行可能で無視されないものにする
良いエスカレーションメッセージには、チケットタイトル、優先度、現在のステータス、残り時間(または遅延時間)、そして次のアクションを一つ含めます。例:「Ticket #1842 は期限まであと30分。Status: In Progress。Owner: unassigned。Next: 担当を割り当てるか、優先度を見直してメモを残してください。」
意図に合ったチャネルを使います。メールは「リスクあり」の通知に十分。SMSやTelegramは「期限超過」や「未割当の重大案件」に向きます。アプリ内通知はダッシュボード内の静かな促しに適しています。
スパムを防ぐためにシンプルなスロットリングを入れます:各ステージで1回のアラートとし、繰り返しはクールダウン(例:60分)を設ける。チケットのステータスや所有者が変わればエスカレーションタイマーをリセットします。
すべての通知をログに残しておけば信頼性の問題を後でデバッグできます。最低限、いつ送ったか、どのトリガーか、チャネルと受信者、送信結果(送信済み、失敗、バウンス)を記録してください。可能なら承認(クリック、返信、既読)も保存します。
AppMasterではこれをNotificationテーブルと、タイマーをチェックして受信者を選び(担当、リード、オンコール)、メール、SMS、Telegramモジュールで送信し、同時にアプリ内レコードを書き込むビジネスプロセスにマッピングできます。
設計をテストする現実的なシナリオ
画面を作る前に一つ難しいシナリオを実行してみてください。ステータス、期限、通知が現実でどう動くかがすぐ分かります。
12:10 PM、主要顧客から「Payment failed」のチケットが届き、件名で緊急と示されているが担当は未設定、という状況を想定します。ダッシュボードを誰も見ていなくても、トリアージは時間を重視するはずです。
まずトリアージでCategory=Billing、Priority=Urgentが設定されます。それらが設定されると瞬時に最初の応答期限(例:15分)が計算され、チケットに保存されます。その期限はリストビューで目に付くようにします。
次に自動割当が動きます。Billingのオンコール担当を選び、「Urgent billing ticket assigned. First response due 12:25.」のような短い通知を送ります。AppMasterならこれはチケット作成(または優先度変更)をトリガーにしていくつかの判断ブロックで実装できます。
12:25までに公開返信がなければエスカレーションします。エスカレーションはシンプルに:チームリードに通知、最初の応答SLAを逃した旨の内部コメントを追加し、escalation_levelフィールドを設定する(人が誤用しがちな新しいステータスを作らない)。
12:40に担当が返信してWaiting on CustomerにしたらSLAは一時停止すべきです。顧客が午後2:05に返信したらSLAは止まったところから再開し、ゼロからではありません。このテストでほとんどのワークフローの誤りが見つかります。
まず作るべき画面
1日で作るなら、やり取りを減らす画面を優先します:キューを見る場所、意思決定する場所、作業する場所。
1) チケットリスト(トリアージキュー)
ホーム画面です。10秒で何に注意すべきかが分かるようにします。
フィルタは実際のトリアージに合わせて:ステータス、優先度、SLA状態(順調、リスク、期限超過)、未割当、カテゴリ。
各行はコンパクトに:タイトル、依頼者、優先度、現在の担当、SLAカウントダウン、最終更新時間。
2) チケット詳細(作業画面)
詳細ページは一本のタイムラインのように感じられるべきです。主要なアクションを上部に置く:割当、ステータス変更、コメント追加、優先度設定。それから履歴(ステータス変更、割当、コメント)を時系列で表示します。
SLAは目立ちすぎず表示します。シンプルなカウントダウンラベルと色で十分です。エッジケース用に明確なEscalateアクションを置いてください。
3) トリアージフォーム(迅速な受付)
チケット作成時は最小限の必須項目:カテゴリ、短い要約、影響度を要求します。「Assign to me」や「Mark duplicate」のようなクイックアクションを加えてください。可能ならカテゴリや負荷に基づいて推奨担当者を表示します。
4) エージェントビューとリードビュー
エージェントはMy tickets、Due soon、ワンクリックのステータス更新を必要とします。リードはUnassigned、At risk、Breachedを見て素早く再配分できる必要があります。
5) 小さな管理画面
管理画面はカテゴリとSLAルール(カテゴリと優先度で)、オンコールの管理に絞ります。AppMasterならUIビルダーでこれらの画面は短時間で組み立てられ、ルールは視覚的なビジネスプロセスに置けるのでアプリを書き直さずに変更できます。
トリアージシステムを壊すよくある罠
多くのトリアージツールは単純な理由で失敗します:ルールがあいまいで、UIが迂回策を助長することです。
最初の罠はステータスのスプロールです。チームはあらゆる例外ごとに新しいステータスを追加し("Waiting for Vendor"、"Waiting for Finance"、"Blocked by Product"など)、すぐに誰も意味を一致させられなくなります。ステータスは少なく保ち、前に進むために何が真であるべきかを定義してください(例:In Progressは担当者が決まり次のアクションが分かっている状態)。
SLAの時間管理は二つ目の罠です。決して止まらない時計は依頼者待ちのときにエージェントを不利にし、常に止まる時計はSLAを無意味にします。説明できる一文で表せる一貫した停止ルールを選び、特定の状態(例:Waiting時のみ停止)に結びつけてください。
通知はオーナーがいないと失敗します。全員に飛ぶアラートは背景ノイズになります。エスカレーションは修正できる特定の人や役割に届き、次に何をするかを明確に伝えるべきです。
よくある失敗パターン:
- 感情を表すステータス名("Stuck")ではなく条件を表す名前("Waiting on requester response")にする。
- SLAルールが判断に頼る("公平なら停止")こと。
- エスカレーションが広範なチャンネルに送られる。
- 変更履歴が残らない(誰が優先度を変えたか、いつ再割当したかなど)。
- 依頼者メッセージと内部ノートが混ざり、誤って外部共有してしまう。
シンプルなテスト:チケットがエスカレーションされて依頼者が苦情を言ってきたとき、1分以内に各ステップで誰が担当だったか、いつSLAが停止したか、外向けに何が伝えられたかを答えられますか?答えられないなら監査トレイルを追加し、公開返信と内部ノートを分離してください。AppMasterなら別のデータフィールドと、画面ごとに見せるものを制御するビジネスプロセスでこれを強制できます。
クイックチェックリストと次のステップ
構築前に「明日から走らせられるか?」の視点で一度見直してください。データ、ルール、通知が一致していることがツール成功の鍵です。
確認項目:
- データモデル:Tickets(title、description、priority、status、requester)、Users、Teams、Comments、Audit Log、SLA期限(first response due、resolution due、paused-until)。
- ワークフロー:明確な遷移(New -> Triaged -> In Progress -> Waiting -> Resolved -> Closed)、割当ルール(手動 vs 自動)、SLAの停止/再開ルール(Waitingのみで停止、アクティブ復帰で再開)。
- 通知:トリガー(期限間近、期限超過、再割当、エスカレーション)、受信者(担当、チームリード、オンコール)、スロットリング(毎分通知しない)、ログ記録。
- UI:キュー用リストビュー、チケット詳細ページ、トリアージ画面(割当、優先度、ステータス設定)、カテゴリ・SLA設定・テンプレート用の小さな管理画面。役割ベースのアクセスを明確に。
- 説明責任:すべてのチケットに対して1人の現責任者、次にやること、全員が見られる1つの期限を持つ。
まずテーブルを作り、その後ワークフローをつなげます。AppMasterならData Designer(PostgreSQL)でデータベースをモデル化し、Business Process Editorでステータス遷移、SLAタイマー、エスカレーションルールを視覚的に実装できます。まずは1チームと1つのSLAポリシーで始め、一週間運用して安定してから複雑化(複数キュー、営業時間、カスタムフォーム)を加えてください。
安定したらチームが使いやすい環境へデプロイします:AppMaster Cloud、AWS、Azure、Google Cloud、あるいはソースコードをエクスポートしてセルフホスト。大規模な構築なしにアプローチを試したい場合、appmaster.ioのAppMasterはこの種の内部ツール向けに設計されています。視覚的ワークフローと本番対応のアプリ生成が可能です。
よくある質問
チケットを散逸させずに一つのキューにまとめ、明確な所有者、統一されたステータス、見える化された期限を提供します。最大の効果は「誰が担当で次に何をするか」を明確にし、見落としや重複作業を減らすことです。
まずはメールとシンプルなWebフォームを使ってください。詳細が取りやすく標準化しやすいためです。チャットは後で追加すると良いでしょう。チャットは短文でノイズが多く、重複判定や必須項目のルールが必要になります。
チームが議論せず説明できる小さなセットを使います:New、Triaged、In Progress、Waiting、Resolved、Closed。ステータスは感情ではなく状態を表し、誰がどの遷移を行えるかを制限して意味を保ちます。
最初は4つの役割で十分です:Requester(チケット作成者)、Agent(担当者)、Team lead(チームリード)、Admin(管理者)。これで再割当や優先度の上書きなど現実のワークフローを支えられます。
必須はTickets、Users、Teams、Comments(公開 vs 内部)、AssignmentHistory、AuditLogです。first_response_due_atやresolve_due_atのような期限タイムスタンプ、last customer/agent messageフィールドも追加しておくとSLAや無応答検知が簡単になります。
期限はチケット上のタイムスタンプで保存してください(単なる期間ではなく)。現実的なデフォルトは3つのタイマー:最初の応答、次の応答、解決。停止ルールは特定のステータス(例:Waiting on customer)に結びつけます。
可視性と速さを重視してください。1人のオーナーを設定し、明示的なunassigned状態を残しておくこと。最初は手動割当で問題ありませんが、履歴に記録して即時通知することが大切です。
覚えやすいトリガーに絞ってください:短い猶予後の未割当、SLAが危険域に達した、SLAが期限超過、Waitingに長時間留まっている、などです。各アラートは最小限の担当者に送り、次に取るべきアクションを一つ含めます。
優先的に作る画面は、キュー(リスト)、チケット詳細(タイムライン)、高速トリアージフォームです。管理用にはカテゴリ、SLAルール、オンコールの管理だけがあれば十分です。
AppMasterはルールを視覚的なビジネスプロセスとして表現できる点で適しています。PostgreSQLのデータ設計、ステータス遷移の強制、SLA計算、通知送信などをビジュアルに組めるため、コードを書かずに生産準備ができるアプリを生成できます。


