SaaS ごとの利用者とログインの記録を n8n で毎日ためて、使われていないライセンスの候補を判定し、本人への回収の案内まで出す
SaaS へのサインインの記録を毎日ため、月初に SaaS ごとの割り当てと突き合わせて、しばらく使っていない人を拾います。AI がその人の申請の理由と在籍の状態を読んで回収候補か保留かを判定し、本人に使い続けるかを尋ねる案内まで出します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- IT・SaaS/人材/広告/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/判断に時間がかかる/期限・対応漏れが起きる
- AIで行う処理
- 判定
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が月初に、SaaS の管理画面に1つずつ入り、利用者と最終ログインの日を書き出す
- 人事システムの社員データと社員番号で突き合わせる
- 60日以上ログインしていない人に印を付け、休職中や入社直後の人を目で外す
- 残った人の申請の理由を探して読み、季節やプロジェクト単位の利用でないかを確かめる
- 分からない人を部門ごとにまとめ、部門長にメールで尋ねる
- 部門長から本人に聞いてもらい、返事をスプレッドシートに書き写す
- 返してよい人のライセンスを、各 SaaS の管理画面で外す
- 自動毎日深夜、前日の Entra ID のサインインの記録を取り、利用者 × SaaS ごとの最後の日をためる
- 人シングルサインオンの無い8本は、担当者が月初に利用者の一覧を書き出して置く
- 自動月初の朝、SaaS ごとの割り当てを引き、サインインの日と人事の社員データを結び付ける
- 自動計算のノードが、最後のサインインからの日数と割り当てからの日数を出し、SaaS ごとの基準日数を超えた人を拾う
- 自動拾った人ごとに、申請の理由、在籍の区分と休職の予定、過去の返答の記録、台帳の注記をまとめて AI に渡す
- 自動AI が、回収候補・保留(季節)・保留(期間)・対象外・人が見るの5つに判定し、根拠と案内文の下書きを返す
- 自動休職中の人は、4番目の時点で規則により保留にしてある(AI の判定で変えない)
- 人担当者が SaaS ごとの判定の一覧を見て、案内を送る人を決める
- 自動本人あてに、「使い続ける」「返してよい」を選べる案内をメールで送り、返事を14日待つ
- 自動返事を台帳に戻し、返事の無い人を一覧にまとめる
- 人担当者が返事と一覧を見て、各 SaaS の管理画面でライセンスを外す
各工程の詳しい説明を読む
- 担当者が月初に、SaaS の管理画面に1つずつ入り、利用者と最終ログインの日を書き出す
- 人事システムの社員データと社員番号で突き合わせる
- 60日以上ログインしていない人に印を付け、休職中や入社直後の人を目で外す
- 残った人の申請の理由を探して読み、季節やプロジェクト単位の利用でないかを確かめる
- 分からない人を部門ごとにまとめ、部門長にメールで尋ねる
- 部門長から本人に聞いてもらい、返事をスプレッドシートに書き写す
- 返してよい人のライセンスを、各 SaaS の管理画面で外す
(a)30本の管理画面を回るだけで半日が消える。 最終ログインの表示のしかたも書き出しの形式も SaaS ごとに違い、同じ「最終ログイン」を30通りの方法で取っています。
(b)「使っていない」の中身が日数では分からない。 90日ログインしていない人の中に、育児休業中の人も、年4回の決算のときだけ使う人も、本当に要らなくなった人もいます。見分けるには記録を1人ずつ開くしかありません。
(c)聞いてから返事が来るまでが長い。 部門長を経由すると返事まで1〜2週間かかり、追いかけきれないまま更新日を迎える SaaS が毎月いくつかあります。
(d)同じ人に毎月同じことを聞いてしまう。 「決算のときだけ使う」と答えた記録が埋もれ、翌月また同じ質問が届きます。
- 【自動】 毎日深夜、前日の Entra ID のサインインの記録を取り、利用者 × SaaS ごとの最後の日をためる
- 【人】 シングルサインオンの無い8本は、担当者が月初に利用者の一覧を書き出して置く
- 【自動】 月初の朝、SaaS ごとの割り当てを引き、サインインの日と人事の社員データを結び付ける
- 【自動】 計算のノードが、最後のサインインからの日数と割り当てからの日数を出し、SaaS ごとの基準日数を超えた人を拾う
- 【自動】 拾った人ごとに、申請の理由、在籍の区分と休職の予定、過去の返答の記録、台帳の注記をまとめて AI に渡す
- 【自動】 AI が、回収候補・保留(季節)・保留(期間)・対象外・人が見るの5つに判定し、根拠と案内文の下書きを返す
- 【自動】 休職中の人は、4番目の時点で規則により保留にしてある(AI の判定で変えない)
- 【人】 担当者が SaaS ごとの判定の一覧を見て、案内を送る人を決める
- 【自動】 本人あてに、「使い続ける」「返してよい」を選べる案内をメールで送り、返事を14日待つ
- 【自動】 返事を台帳に戻し、返事の無い人を一覧にまとめる
- 【人】 担当者が返事と一覧を見て、各 SaaS の管理画面でライセンスを外す
8番目と11番目が、この設計の分かれ目です。 案内を送る相手を決めるのも、ライセンスを外すのも人です。AI の判定は記録を読む手間を省くためのもので、回収を決めるためのものではありません。
9番目では部門長を経由せず本人に直接聞き、 部門長には返事の無い人の一覧だけを送ります。
02今回想定するシステム構成
【トリガー1】毎日 2:00(Schedule Trigger) ▼ n8n ├─ HTTP Request(Microsoft Graph)── 前日分のサインインの記録(auditLogs/signIns) ├─ Code ── 利用者 × SaaS ごとに最後の成功したサインインの日をまとめる └─ Data Table ── 最終サインインの台帳に Upsert 【トリガー2】毎月1日 8:00(Schedule Trigger) ▼ n8n ├─ Data Table ── SaaS 台帳(基準日数、注記、契約の単位) ├─ HTTP Request(Microsoft Graph)── SaaS ごとの割り当て(appRoleAssignedTo) ├─ 書き出しの読み込み ── シングルサインオンの無い SaaS の利用者一覧 ├─ 書き出しの読み込み ── 人事の社員データ(在籍、休職の予定、部署) ├─ Code ── 日数の計算、基準を超えた人の抽出、休職の規則 ▼ Basic LLM Chain + Anthropic Chat Model + Structured Output Parser │ 回収候補/保留/対象外/人が見る の判定と案内文 ▼ Microsoft Outlook ── 担当者へ SaaS ごとの判定の一覧 ▼ 【担当者が案内を送る人を決める】 ▼ Microsoft Outlook(Send and Wait for Response:Custom Form)── 本人へ ▼ Data Table ── 返答の記録 / 返事の無い人の一覧 ▼ 【担当者が各 SaaS でライセンスを外す】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier、Power Automate |
| 生成AI | Claude(n8n の Anthropic Chat Model ノード) | OpenAI API、Gemini API |
| 連携 | Microsoft Graph(Entra ID のサインインの記録と割り当て) | Google Workspace の Admin SDK Reports API |
| 保管 | n8n の Data Table(最終サインインの台帳、返答の記録) | スプレッドシート、社内のデータベース |
| 通知 | Microsoft Outlook(n8n の Microsoft Outlook ノード) | Slack、Microsoft Teams |
利用の記録を Entra ID から取るのは、22本の SaaS の記録が1か所にそろうからです。 Microsoft Graph の List signIns が返す1件には、利用者(userPrincipalName、userId)、アプリ(appDisplayName、appId)、日時(createdDateTime)、結果(status.errorCode)が入っています。
毎日ためるのは、記録が30日で消えるからです。 サインインの記録の保存期間は、Free で7日、P1 と P2 で30日です。60日使っていないかを見るには、30日より長い記録が要ります。 毎日前日分を取り、利用者 × SaaS ごとの最後の日だけを n8n の Data Table に上書きします。Data Table はインスタンス全体で既定200 MiBまでなので、記録を全部ためる使い方には向きません。
03どうやって実装するのか
処理の起点を決める
トリガーは2つに分けます。 毎日深夜にサインインの記録をためる流れと、月初に判定と案内をする流れです。1つにまとめると、月初の処理の不具合で毎日の取り込みまで止まり、判定の材料が欠けます。
毎日の流れは Schedule Trigger で2:00に動かし、前日の0:00から23:59までを取ります。 月初の流れは、Schedule Trigger の Months の間隔で毎月1日の8:00にします。
タイムゾーンを最初に確かめてください。 Schedule Trigger はワークフローのタイムゾーン、無ければインスタンスのタイムゾーンで動き、自前で立てた n8n の既定は America/New York です。 そのままだと「2:00」が日本の昼過ぎになり、「前日」の範囲が13〜14時間ずれます。ワークフローの設定で Asia/Tokyo にします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| サインインの記録 | 利用者、アプリ、日時、結果 | Microsoft Graph の List signIns |
| 最終サインインの台帳 | 利用者 × SaaS ごとの最後の成功したサインインの日 | n8n の Data Table(毎日ためたもの) |
| 割り当ての一覧 | SaaS ごとに割り当てられた利用者・グループと、割り当てた日 | Microsoft Graph の appRoleAssignedTo |
| シングルサインオンの無い SaaS の利用者 | 利用者、最終ログインの日(管理画面の書き出し) | 担当者が置くフォルダ |
| SaaS 台帳 | 基準日数、契約の単位、月額、更新日、注記、共用・連携用のアカウントの一覧 | n8n の Data Table |
| 人事の社員データ | 社員番号、メールアドレス、在籍の区分、休職の開始日と終了予定日、部署、入社日 | 人事システムの書き出し |
| 利用の申請の記録 | 申請日、申請者、申請の理由(自由記述) | 申請フォームの回答 |
| 過去の返答の記録 | 前回までに本人が答えた内容と日付 | n8n の Data Table |
質を決めるのは、申請の理由と過去の返答の記録です。 日数と在籍の区分だけなら規則で判定できます。AI に読ませる意味は、自由記述の「決算のときだけ」を読み分けるところにあります。
基準日数は SaaS ごとに変えます。 チャットなら30日、経費精算なら60日、監査対応の道具なら180日。同じ日数で見ると、頻度の低い SaaS ほど誤って候補に上がります。
データの取得方法を決める
サインインの記録は、HTTP Request ノードで Microsoft Graph を呼びます。 認証は、Entra ID に登録したアプリの OAuth2 の資格情報で行います。
| 取るもの | 呼び方 | 要る権限 |
|---|---|---|
| サインインの記録 | GET /auditLogs/signIns?$filter=createdDateTime ge {前日0時} and createdDateTime le {前日23時59分} | AuditLog.Read.All |
| SaaS ごとの割り当て | GET /servicePrincipals/{id}/appRoleAssignedTo | Application.Read.All |
サインインの記録は、必ず期間で絞って取ります。 公式の説明でも、要求がタイムアウトしないように $filter で期間を付けるよう書かれています。1回に返るのは最大1,000件で、続きは @odata.nextLink に入ります。HTTP Request ノードのページ送りを「Response Contains Next URL」にし、Next URL に {{ $response.body["@odata.nextLink"] }} を入れます。
22本の appId を SaaS 台帳に持たせ、Code ノードでその記録だけを残します。 そのうちstatus.errorCode が0(成功)のものだけを取り、利用者 × SaaS ごとに一番新しい createdDateTime を Data Table に Upsert します。
割り当ての一覧には、グループで割り当てたものが混ざります。 principalType が Group の行は人ではないので、グループのメンバーを別に引いて人に展開します。
シングルサインオンの無い8本は、担当者が書き出した CSV をワークフローが読みます。 列名が SaaS ごとに違うので、SaaS 台帳に列の対応を持たせ、Code ノードで同じ形にそろえます。
AIへ渡す前に整形する
- 時刻を日本時間にそろえる … Graph の日時は ISO 8601 の UTC です。日数を数える前に日本時間に直し、日付の境目で1日ずれないようにします
- 利用者を社員番号に結び付ける … サインインの記録のメールアドレスと、人事データのメールアドレスで結び付けます。改姓や異動でアドレスが変わった人は、
userIdで結び付け直します - 日数を計算する … 最後のサインインから今日まで、割り当ての日から今日までの日数を出します
- 基準を超えた人を拾う … SaaS 台帳の基準日数を超えた人、割り当てから30日以上たって一度もサインインしていない人を拾います
- 規則で先に分ける … 割り当てから30日未満の人は「新規」として外し、SaaS 台帳の共用・連携用のアカウントの一覧に載るものは「対象外」にします
- 休職中の人を保留にする … 人事データで休職中の人は、規則で保留にし、AI に回しません
- 申請の理由と過去の返答を付ける … その人 × その SaaS のものを引いて付けます
5番目と6番目を AI より先に置くのは、規則で決められることを AI に任せないためです。
AIに処理させる
させるのは、規則で決まらなかった人について、5つの区分のどれに当たるかを判定し、根拠にした記録を写し、案内文の下書きを作ることだけです。
| 区分 | 判定の目安 | 根拠にする記録 |
|---|---|---|
reclaim_candidate(回収候補) | 基準日数を超えて使っておらず、使う予定を示す記録が無い | 日数、申請の理由、過去の返答 |
hold_seasonal(保留:季節の利用) | 申請の理由や過去の返答に、決まった時期にだけ使う旨がある | 申請の理由、過去の返答 |
hold_project(保留:期間の利用) | 案件・期間の終わりが書かれており、まだその前である | 申請の理由 |
out_of_scope(対象外) | 共用・連携用のアカウントと読める | 台帳の注記、アカウント名 |
needs_review(人が見る) | 記録が食い違う、読み取れない、判断の材料が足りない | - |
AI に読ませる理由は、自由記述の表現がそろっていないからです。 「Q末だけ」「決算期に利用」「3・6・9・12月」「監査対応用」はどれも季節の利用ですが、規則の言葉で拾おうとすると、書き方の数だけ条件が要ります。 逆に「当面」「しばらく」「いずれ使う」は、使う時期を示していないので季節の利用には当たりません。
| させないこと | 理由 |
|---|---|
| 日数の計算と、基準を超えたかの判断 | 計算のノードが決める。AI に数えさせると日付を取り違える |
| 回収するかどうかの結論 | 本人の返事と担当者の判断で決める |
| 本人の仕事の内容の推測 | 記録に無い「この職種なら使わないはず」を根拠にしない |
| 次に使う時期の推測 | 書かれていなければ「不明」とする |
3行目が一番起きやすい失敗です。 部署が「営業」で SaaS が「設計の道具」だと、「営業職には不要」と書いて回収候補にしがちです。
指示内容を固定する
あなたは情報システム部門で、SaaS のライセンスの見直しを手伝う立場です。
渡された記録だけを見て、この利用者のライセンスがどの区分に当たるかを判定してください。
回収するかどうかは決めません。推測で埋めないでください。
【区分】
- reclaim_candidate ... 基準日数を超えて使っておらず、使う予定を示す記録が無い
- hold_seasonal ....... 申請の理由や過去の返答に、決まった時期にだけ使う旨が書かれている
- hold_project ........ 案件や期間の終わりが書かれており、今日がその前である
- out_of_scope ........ 共用・連携用のアカウントと台帳の注記から読める
- needs_review ........ 記録どうしが食い違う、材料が足りない、判断がつかない
迷ったときは needs_review を選んでください。reclaim_candidate を選ばないでください。
【厳守事項】
- 日数は【計算結果】の値をそのまま使ってください。日付から数え直さないでください。
- 「当面」「しばらく」「いずれ」は、使う時期を示していないので hold_seasonal にしないでください。
- 部署・役職・職種から、その SaaS が要るか要らないかを推測しないでください。
- 次に使う時期が書かれていなければ next_use_period を「不明」としてください。
- evidence には、根拠にした記録の文面をそのまま写し、どの記録かを source に書いてください。
- 過去の返答で「使い続ける」と答えている場合は、その日付と内容を evidence に入れてください。
- 案内文は本人あてに、です・ます調で、最後のサインインの日と、返事の期限を入れてください。
回収が決まったような書き方をしないでください。「使い続ける場合はボタンを押してください」
のように、本人が選べる形にしてください。
【利用者】{user}
【SaaS】{saas_name}(基準日数 {threshold_days} 日)
【計算結果】最後のサインインから {days_since_signin} 日、割り当てから {days_since_assigned} 日
【申請の理由】{request_reason}
【過去の返答】{past_answers}
【台帳の注記】{saas_note}
【返事の期限】{reply_deadline}
「迷ったら reclaim_candidate を選ばない」を明記しないと、回収候補に寄ります。 「見直しを手伝う」という役割を与えると、AI は減らす方向の答えを出そうとします。見直しの目的は減らすことではなく、使っていないものを確かめることだと、区分の選び方で示します。
「日数を数え直さない」を入れるのは、数え直した値が計算のノードの値と食い違うと、確認する人が迷うからです。
出力形式を固定する
次の形のJSONで受け取ります。 n8n の Structured Output Parser に JSON Schema で定義します。このノードは JSON Schema の $ref に対応していないので、定義は1つの塊に展開して書きます。
{
"user_id": "",
"saas_id": "",
"category": "reclaim_candidate | hold_seasonal | hold_project | out_of_scope | needs_review",
"next_use_period": "",
"evidence": [
{ "source": "request_reason | past_answer | saas_note", "text": "" }
],
"conflicts": [],
"notice_draft": {
"subject": "",
"body": ""
}
}
1つ目の理由は、category を後段の規則で読み替えられることです。 「hold_seasonal の人には案内を送らず、次の季節が過ぎた月にもう一度見る」「reclaim_candidate だけを案内の対象にする」といった扱いは、ワークフローの分岐で決めます。 扱いを変えても、AI の指示は直しません。
2つ目は、evidence に記録の種類が付くことです。 担当者は一覧で「申請の理由にこう書いてあるから季節の利用」と読めます。記録を開き直さずに、判定が妥当かを確かめられます。
3つ目は、conflicts で食い違いを拾えることです。 申請の理由に「プロジェクト期間のみ」とあるのに、前回「今後も使う」と答えているような場合で、category に関係なく人が見る一覧に回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Microsoft Graph(サインインの記録) | HTTP Request ノード、OAuth2 | 毎日、前日分を取る。読み取りだけ |
| Microsoft Graph(割り当て) | HTTP Request ノード、OAuth2 | 月初に SaaS ごとの割り当てを取る。読み取りだけ |
| n8n の Data Table | Data Table ノード(Upsert/Get/Update) | 最終サインインの台帳、SaaS 台帳、返答の記録 |
| 人事の社員データ | 書き出しの読み込み | 在籍の区分、休職の予定、部署 |
| Microsoft Outlook | Microsoft Outlook ノード(Send/Send and Wait for Response) | 担当者への一覧と、本人への案内 |
本人への案内は、Microsoft Outlook ノードの Send and Wait for Response で送ります。 応答の形は Approval、Free Text、Custom Form の3つがあり、ここでは Custom Form で「使い続ける」「返してよい」の選択と、任意の一言の欄を作ります。 Limit Wait Time で待つ期間を14日にし、期限を過ぎたら返事が無いものとしてワークフローを再開させます。
Microsoft Graph へは書き込みません。 割り当てを外す権限をワークフローに持たせると、判定の誤りがそのまま誰かの仕事を止めます。 外すのは担当者が各 SaaS の管理画面で行い、外したことを返答の記録に書きます。権限も、サインインの記録を読む AuditLog.Read.All と、割り当てを読む Application.Read.All だけにします。
人が確認する
人が見るのは2回です。 案内を送る前と、ライセンスを外す前です。
- 案内を送る前に、SaaS ごとの一覧を見る …
reclaim_candidateの人に案内を送ってよいかを確かめます。役員・顧客対応の窓口になっている人など、案内の送り方に配慮が要る人はここで外します needs_reviewとconflictsのある人を見る … 記録を開き、区分を決めます。決めた区分と理由を返答の記録に残します- 返事を見て、外すかを決める … 「返してよい」と答えた人は外します。「使い続ける」と答えた人は、次の見直しで同じ質問が届かないよう、返答の記録に期間を残します
- 返事の無い人を部門長に回す … 14日で返事が無い人だけを部門ごとにまとめ、部門長に送ります。返事が無いことを理由に、担当者だけで外さないでください
4番目が信頼の分かれ目です。 休暇で14日メールを見ない人はいます。返事が無いだけで外すと、次の案内が読まれなくなります。
例外に対処する
| 起きること | 対応 |
|---|---|
| サインインの記録の取得が失敗した日がある | その日を「欠け」として記録し、欠けがある期間の判定には needs_review を付ける |
| ためはじめて60日たっていない | 基準日数に満たない SaaS は判定せず、ためた日数を一覧に書く |
| シングルサインオンの無い SaaS の書き出しが置かれていない | その SaaS を「未取得」として担当者に知らせ、判定しない |
| 書き出しの列名が変わった | 台帳の対応と合わない列があれば止め、推測で列を当てない |
| メールアドレスで社員に結び付かない | userId で結び直し、だめなら needs_review |
| 長く同じ画面を開いたまま使う SaaS | サインインの記録が残りにくい。台帳に「記録が少ない SaaS」と注記し、基準日数を長くする |
| 本人がすでに退職している | 人事データで退職と分かれば、この流れから外して退職者の手続きに回す |
| AI の応答が JSON の形にならない | 1回だけやり直し、だめなら needs_review |
| 返事の期限内にワークフローが止まった | 返答の記録の未回収を翌朝に見直し、案内を二重に送らない |
上から6行目は見落とされやすい例外です。 List signIns が返すのは対話型のサインインと成功したフェデレーションのサインインで、画面を開いたまま使う SaaS では、使っていても記録が残らないことがあります。
記録を残す
- 毎日の取り込みの結果(取った件数、ページ数、失敗した日)
- 最終サインインの台帳(利用者 × SaaS ごとの最後の日と、その日を取り込んだ日)
- 月初の判定の入力(日数、在籍の区分、申請の理由、過去の返答)と AI の出力の全文
- 担当者が区分を変えた記録(どの人を、どの区分から、どの区分に、なぜ)
- 案内を送った日時、返事の内容と日時、返事の無かった人
- ライセンスを外した日と、外した担当者
- 外したあと30日以内に、同じ人から再び利用の申請があったか
最後の行が、基準日数を直す材料になります。 外してすぐ申請し直された人が多い SaaS は、基準日数が短すぎます。
04実装レベルの3段階
半自動化で、1件120分が60分程度になります。 部門長に聞いて返事を取りまとめる④の作業が残るためです。 本格構成で30分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を2〜3か月見て基準日数を直してから案内を送るほうが、外れの案内が減ります。
05工数削減シミュレーション
導入後 30件 × 30分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 従業員が数百名以上で、人数課金の SaaS を数十本使っている会社の情報システム部門。SaaS の多くを Microsoft Entra ID のシングルサインオンにつないでいるが、「誰がしばらく使っていないか」を SaaS ごとの管理画面で数えている場合。回収の前に本人や部門に確かめる手間が重く、確かめきれないまま更新日を迎えている場合。
- SaaS が数本で、管理画面を見れば数分で分かる場合。シングルサインオンを使っておらず、どの SaaS からも利用者とログインの記録を書き出せない場合(先に書き出しの経路を作る)。人事の在籍・休職の情報を情報システム部門に渡せない場合。なお、ライセンスを回収するか、契約数を減らすかの判断はこの構成では代替できません。
07最小構成で試す方法
- 見直しの対象から、人数の多い SaaS を3本選ぶ
- 利用者と最終ログインの日、在籍の区分を書き出す
- 60日以上ログインしていない在籍者について、申請の理由と過去の返答を1つの表にまとめる
- 手元の Claude の画面に表を貼り付け、「この表の1行ずつについて、回収候補・季節の利用・期間の利用・共用・人が見る のどれに当たるかを判定し、根拠にした文面を写してください。部署や職種から推測しないでください。迷ったら人が見るにしてください」と指示する
- 出てきた判定を、担当者が1行ずつ判定した結果と見比べる
ここで確かめるのは、自由記述を読み分けられるかだけです。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の判定とほぼ同じ | 毎日の取り込みと月初の判定をつなぐ段階に進む |
| 季節の利用を回収候補にした | 申請の理由の書き方がそろっていない。申請フォームに「使う時期」の欄を足す |
| 職種から推測して判定した | 指示の書き方で直る。構成は有効 |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 60日の判定が最初の2か月正しく出ない | 記録の保存期間は P1 で30日。 ためはじめてからの日数を一覧に出し、満たない間は判定しない |
| 「前日」の範囲がずれる | 自前の n8n の既定のタイムゾーンは America/New York。 ワークフローを Asia/Tokyo にし、Graph の UTC を直す |
| 取得が途中で切れる | 1回に最大1,000件。@odata.nextLink でページを送る。 期間で絞らないとタイムアウトする |
| 使っているのに候補に上がる | 長く画面を開いたまま使う SaaS はサインインの記録が残りにくい。SaaS 側の記録で補うか基準日数を長くする |
| グループで割り当てた人が漏れる | principalType が Group の行を展開する |
| 休職中の人に案内が届く | 人事データで規則で保留にし、AI に判定させない |
| 職種から「不要」と推測する | 指示で禁じ、根拠の記録の種類を evidence に付けさせる |
| 同じ人に毎月同じ質問が届く | 返答の記録に「使い続ける」と答えた期間を残し、その間は案内しない |
| 返事が無い人を外してしまう | 返事の無い人は部門長に回す。 担当者だけで外さない |
上の4行が失敗のほとんどです。 どれも AI ではなく、「最後のサインイン」という数字の取り方の問題です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員の氏名・メールアドレス・所属、SaaS ごとのサインインの日時と結果、休職・育児休業の開始日と終了予定日、利用の申請の理由です。
- 休職の情報を AI に渡さない … 休職中の人は規則で保留にし、AI に回しません。休職の理由は人事システムから書き出しもしません
- サインインの記録を、人の働きぶりを測る材料にしない … 「ログインが少ない人」の一覧を、評価や勤怠の確認に流用しないでください。 使い道を最初に決め、社内に示しておきます
- ワークフローに書き込みの権限を持たせない … 権限は AuditLog.Read.All と Application.Read.All の読み取りだけにします
- 案内文で回収を決めたように書かない … 本人が選べる形にし、返事の期限と問い合わせ先を書きます
- IP アドレスや場所は残さない … 取り込みの段階で、日時・利用者・アプリ・結果以外を捨てます。Data Table は情報システム部門だけのプロジェクトに置きます
誤りのリスクは、使っている人のライセンスを外すことと、使っていない人を見逃し続けることの2つです。 前者のほうが影響が大きいので、迷ったら外さない側に倒します。
10まず何から始めるか
1週目:毎日の取り込みを始める
Entra ID にアプリを登録して管理者の同意を得、毎日の取り込みの流れだけを作ります。記録は30日で消えるので、ためはじめるのは早いほど良いです。
2週目:SaaS 台帳を整える
30本について、appId、基準日数、共用・連携用のアカウント、書き出しの列の対応を SaaS 台帳に書きます。
3週目:3本で試す
人数の多い SaaS を3本選び、手元の Claude の画面で判定を試して担当者の判定と見比べます。
4週目:申請フォームを直す
利用の申請フォームに「使う時期」の欄を選択式で足します。
2か月目: 記録が60日分たまったら、月初の判定の流れを作り、判定の一覧を担当者に送ります。この時点では本人への案内は送らず、一覧と担当者の判定の食い違いを数えます。 3か月目以降: 本人への案内と返事の回収を足し、1本120分が何分になったかを実測します。外したあと30日以内に申請し直された人の数を SaaS ごとに見て、基準日数を直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
対話型と成功したフェデレーションのサインインを返すこと。1ページ最大1,000件。期間で絞ること。権限 AuditLog.Read.All。返る項目と @odata.nextLink | Microsoft Learn: List signIns | 2026-10-15 |
| サインインの記録の保存期間(Free 7日、P1・P2 30日) | Microsoft Learn: Microsoft Entra data retention | 2026-10-15 |
| 休暇など正当な理由を考えること。90〜180日が目安とされること。反映に最大24時間かかりうること | Microsoft Learn: How to manage inactive user accounts | 2026-10-15 |
割り当てられた利用者・グループ(principalType、createdDateTime)。権限 Application.Read.All。反映の遅れ | Microsoft Learn: List appRoleAssignments granted for a service principal | 2026-10-15 |
| Months・Cron の指定、タイムゾーン(自前の既定 America/New York)、公開時のみ動くこと | n8n Docs: Schedule Trigger | 2026-10-15 |
| OAuth2 などの認証と、ページ送り「Response Contains Next URL」 | n8n Docs: HTTP Request | 2026-10-15 |
| Insert/Upsert/Get/Update などの操作 | n8n Docs: Data Table | 2026-10-15 |
| 既定200 MiB、プロジェクトのメンバーが見られること | n8n Docs: Data tables | 2026-10-15 |
| 出力の形を求める設定と出力パーサーの接続 | n8n Docs: Basic LLM Chain | 2026-10-15 |
JSON Schema で定義でき、$ref に対応しないこと | n8n Docs: Structured Output Parser | 2026-10-15 |
| モデル・最大トークン数・温度の設定 | n8n Docs: Anthropic Chat Model | 2026-10-15 |
| Send and Wait for Response の Approval/Free Text/Custom Form と Limit Wait Time | n8n Docs: Microsoft Outlook | 2026-10-15 |
ライセンスを回収するか、契約数を減らすかは、各 SaaS の管理部門と情報システム部門で決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1650)についてのご相談はこちらから。
