Media > AI活用ユースケース > 情報システム > SaaSの契約数と利用状況を突き合わせて、使われていないライセンスを洗い出す

SaaSの契約数と利用状況を突き合わせて、使われていないライセンスを洗い出す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

各SaaSの利用状況と、契約台帳・人事の在籍データを突き合わせ、使われていないライセンス、退職者に残っているアカウント、契約数と利用者数のずれを一覧にします。担当者の作業は、40本のサービスに1つずつログインして数えることから、出てきた一覧を確認することに変わります。

サマリー
利用ツール
ChatGPT/Claude/Gemini/Google Apps Script/Power Automate/Python
対象業界
IT・SaaS/その他/製造/金融
対象部門
情報システム/購買
対象業務
台帳・マスタ管理/集計・分析
主な課題
データ分析に時間がかかる/人手が足りない/判断に時間がかかる
AIで行う処理
判定
主な効果
判断支援/品質標準化/工数削減
導入難易度
★★☆☆☆
実装レベル
半自動化
費用感
既存ツールのみ(小)
人間の確認
必須
現在工数
20h/月
AI導入後
5.3h/月
想定削減
73%
年間削減
176h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 契約台帳を開き、その月に確認するサービスを選ぶ
  2. サービスの管理画面にログインする
  3. 契約しているライセンス数と、割り当てられているアカウント数を確認する
  4. 最終ログイン日が分かるサービスは、利用状況を書き出す
  5. アカウント一覧と人事の在籍者名簿を見比べ、退職者が残っていないか確認する
  6. 請求額と契約数が合っているかを会計システムで確認する
  7. 気になる点を業務部門へメールで確認する
  8. 結果を契約台帳に記録する
導入後(After)
  1. 毎月1日に処理が始まる
  2. 自動APIのあるサービスは、アカウント一覧と利用状況を取得する
  3. APIのないサービスは、管理画面からCSVを書き出してフォルダへ入れる
  4. 自動形式の違う一覧を、共通の項目(アカウント・氏名・プラン・最終利用日・状態)に整える
  5. 自動人事の在籍データと突き合わせ、退職者・休職者のアカウントを抽出する
  6. 自動契約台帳の契約数と、割り当て済み数・実際に使われている数を比べる
  7. 自動一定期間使われていないアカウント、機能が重なるサービスを候補として挙げる
  8. 自動確認すべき点を、サービスごと・部署ごとに整理する
  9. 情報システム部が内容を確認し、業務部門へ照会する
  10. 退職者のアカウントは、確認のうえ速やかに停止する
各工程の詳しい説明を読む
  1. 契約台帳を開き、その月に確認するサービスを選ぶ
  2. サービスの管理画面にログインする
  3. 契約しているライセンス数と、割り当てられているアカウント数を確認する
  4. 最終ログイン日が分かるサービスは、利用状況を書き出す
  5. アカウント一覧と人事の在籍者名簿を見比べ、退職者が残っていないか確認する
  6. 請求額と契約数が合っているかを会計システムで確認する
  7. 気になる点を業務部門へメールで確認する
  8. 結果を契約台帳に記録する

問題は4つあります。

(a)サービスごとに画面も用語も違う。 「ライセンス」「シート」「メンバー」「編集者」と呼び方が違い、CSVの形式も統一されていません。40本分を毎回読み替えるのは、それだけで疲れる作業です。

(b)最終ログイン日が取れないサービスがある。 取れないサービスでは、使われているかどうかが分かりません。

(c)退職者のアカウントが残る。 全社共通のシステムは退職手続きで止まりますが、部署が個別に契約したサービスは手続きの対象になっていないことがあります。

(d)棚卸しが後回しになる。 障害対応や問い合わせが優先され、四半期に1度の棚卸しが半年空くことがあります。

  1. 毎月1日に処理が始まる
  2. 【自動】 APIのあるサービスは、アカウント一覧と利用状況を取得する
  3. 【人】 APIのないサービスは、管理画面からCSVを書き出してフォルダへ入れる
  4. 【自動】 形式の違う一覧を、共通の項目(アカウント・氏名・プラン・最終利用日・状態)に整える
  5. 【自動】 人事の在籍データと突き合わせ、退職者・休職者のアカウントを抽出する
  6. 【自動】 契約台帳の契約数と、割り当て済み数・実際に使われている数を比べる
  7. 【自動】 一定期間使われていないアカウント、機能が重なるサービスを候補として挙げる
  8. 【自動】 確認すべき点を、サービスごと・部署ごとに整理する
  9. 【人】 情報システム部が内容を確認し、業務部門へ照会する
  10. 【人】 退職者のアカウントは、確認のうえ速やかに停止する

自動化されるのは「集める」「形式を揃える」「突き合わせる」の3つです。残るのは「解約・減数するかの判断」と「業務部門との調整」です。

02今回想定するシステム構成

構成図
【トリガー】毎月1日(時間主導型トリガー)
   │
   ▼
Google Apps Script
   │
   ├──▶ Admin SDK の Reports API(Google Workspace の利用状況)
   │       GET /admin/reports/v1/usage/dates/yyyy-mm-dd
   │
   ├──▶ APIのある他のSaaS(アカウント一覧・最終ログイン)
   │
   ├──▶ 手で書き出したCSV(APIのないサービス)
   │
   ├──▶ Claude API ── 形式の違う一覧を共通項目へ整え、確認事項を作る
   │
   ├──▶ 人事の在籍データと突合(退職者・休職者)
   │
   └──▶ 棚卸しシート(サービス別・アカウント別)+ 情シスへ通知
   │
   ▼【人が確認】業務部門へ照会・退職者アカウントの停止
役割想定する製品代替候補
実行環境Google Apps ScriptPower Automate、Python
生成AIClaude APIOpenAI API、Gemini API
利用状況の取得Admin SDK の Reports APIMicrosoft Graph のレポート
台帳GoogleスプレッドシートMicrosoft Lists、kintone

Google Workspace を使っている会社では、Admin SDK の Reports API から利用状況を取れます。 このAPIには、ドメイン全体の利用状況を返す顧客単位のレポートと、利用者ごとのレポート、操作の記録(アクティビティ)、エンティティ単位のレポートがあります。顧客単位の利用状況は GET https://admin.googleapis.com/admin/reports/v1/usage/dates/yyyy-mm-dd の形で日付を指定して取得します。各レポートで既定かつ最大の対象期間は直近450日です。

Microsoft 365 中心の会社では、同様のレポート機能に置き換えて同じ構成が組めます。

03どうやって実装するのか

Step1

処理の起点を決める

毎月1日の定期起動にします。Google Apps Script の時間主導型トリガーで月次の実行を設定します。

退職者のアカウント確認だけは、月1回では遅いことがあります。人事システムの退職者情報を週次で取得し、該当アカウントが残っているサービスを知らせる処理を別に動かしてください。 費用の棚卸しと、アカウントの停止は、必要な速さが違います。

Step2

入力データを集める

データ中身取得元
契約台帳サービス名、契約数、単価、契約期間、更新日、契約部署、管理者スプレッドシート
アカウント一覧アカウント、氏名、プラン、権限、状態各SaaS(API またはCSV)
利用状況最終ログイン日、期間内の利用回数各SaaS(API またはCSV)
在籍データ社員番号、氏名、メールアドレス、在籍区分、退職日、部署人事システム
請求実績サービスごとの月額・年額会計システム

4番目の在籍データが、この構成でもっとも重要な入力です。 これが無いと、アカウントが誰のものかを判定できません。

Step3

データの取得方法を決める

APIのあるサービス: アカウント一覧と最終ログイン日を取得します。項目名はサービスごとに違うため、取得後に共通の形へ整えます。

APIのないサービス: 管理画面からCSVを書き出し、所定のフォルダへ入れます。この手作業は残ります。 40本のうち半数程度はここに当たると見ておいてください。書き出し手順をサービスごとに手順書にしておくと、担当が替わっても回ります。

Google Workspace の利用状況: Reports API から取得します。日付を指定して取る形のため、当日や前日のデータはまだ揃っていないことがあります。 数日前の日付を指定する設計にしてください。

人事の在籍データ: 人事システムから月次(退職者は週次)で書き出します。メールアドレスで突合できる形にしておくことが前提です。 氏名での突合は同姓同名で誤ります。

Step4

AIへ渡す前に整形する

  1. 項目名の統一 … 「ライセンス」「シート」「メンバー」を1つの項目に揃えます
  2. 日付形式の統一 … サービスごとに表記が違います
  3. アカウントの名寄せ … 会社のメールアドレスを軸に、別ドメインや個人アドレスで登録されたアカウントを拾います
  4. 共有アカウントの識別info@sales@ のような共有アカウントを別扱いにします。個人に紐づかないアカウントは、退職者判定の対象外にします
  5. 無料枠の分離 … 無料プランのアカウントは費用の対象外ですが、情報の管理の対象にはなります

3番と4番を飛ばすと、退職者判定の結果が信用されなくなります。

Step5

AIに処理させる

処理内容
形式の統一サービスごとに異なる項目名・表記を、共通の項目へ対応づける
状態の判定利用あり/一定期間利用なし/未ログイン/退職者/共有アカウント
重複の候補機能が重なるサービスの組み合わせを挙げる(チャット、ファイル共有、タスク管理など)
確認事項の作成部署へ聞くべきこと(今後も使うか、誰が使っているか)
台帳との差の指摘契約数と割り当て済み数、請求額の食い違い

解約や減数の提案を書かせないでください。 「このサービスは解約できます」と書かれた一覧が回ると、業務部門との関係が悪くなります。出すのは「3か月間ログインがありません。今後も必要かご確認ください」までです。

Step6

指示内容を固定する

あなたは情報システム部でSaaSの棚卸しを担当しています。
サービスごとの利用状況、契約台帳、在籍データを渡します。
確認すべき点を整理してください。

【厳守事項】
- 解約、減数、プラン変更を提案しないでください。
  事実と、部署に確認すべき点だけを書いてください。
- 「不要」「無駄」といった評価を書かないでください。
  利用がないことと、不要であることは違います。
- 最終ログイン日が取得できないサービスは「利用状況不明」としてください。
  利用がないと判定しないでください。
- 在籍データに無いアカウントは、まず「要確認」としてください。
  退職者と断定するのは、退職日が確認できる場合だけです。
- 共有アカウントは個人の利用状況で判定しないでください。
- 契約数と割り当て済み数の差は、計算した値をそのまま書いてください。
  金額の試算をしないでください。
- 機能が重なるサービスの指摘は、どの機能が重なるかを具体的に書いてください。

【契約台帳】
{contracts}

【利用状況(サービス別)】
{usage_data}

【在籍データ】
{hr_data}

「利用がないことと、不要であることは違う」という前提を書いておくことが大切です。 年に2回の監査対応でしか使わないサービスは、11か月間ログインがありません。

Step7

出力形式を固定する

{
  "service": "",
  "contract_seats": 0,
  "assigned_accounts": 0,
  "active_accounts": 0,
  "usage_available": true,
  "findings": [
    {
      "type": "未利用 | 退職者の可能性 | 要確認 | 契約数の差 | 機能の重複",
      "account": "",
      "detail": "",
      "last_login": ""
    }
  ],
  "questions_for_department": [],
  "renewal_date": "",
  "days_to_renewal": 0
}

usage_available が false のサービスは、判定の対象から外して一覧に表示します。 「利用状況が取れないサービス」として可視化しておくことに意味があります。

days_to_renewal は、確認を急ぐべきサービスを見分けるために持ちます。年間契約は更新日を過ぎると1年動かせません。

Step8

システムへ連携する

出し先内容
棚卸しシートサービス別・アカウント別の状態と確認事項
退職者アカウントの一覧週次。費用の一覧とは別に、すぐ対応する
部署への照会契約部署の管理者へ、確認事項をまとめて送る(人が確認してから)
契約台帳の更新確認の結果を反映(人が入力)

契約台帳を自動で書き換えないでください。 台帳は契約の記録であり、突合の結果で上書きするものではありません。

Step9

人が確認する

全件、人が確認します。 判断は3つに分かれます。

判断誰が決めるか
退職者アカウントの停止情報システム部(在籍データで確認のうえ、速やかに)
未利用アカウントの扱い契約部署の管理者(今後も使うかの判断)
解約・減数・プラン変更契約部署と購買(更新日から逆算して)

1つ目だけは、費用の話とは切り離して急いでください。 残っていること自体が問題になります。

Step10

例外に対処する

起きること対応
最終ログイン日が取れない「利用状況不明」とする。未利用と判定しない
在籍データに無いアカウント「要確認」にする。業務委託、派遣、退職者のいずれかを人が確認
共有アカウント個人の判定から外す。ただし、退職者が使っていた可能性は別途確認する
年に数回しか使わないサービス部署の回答を台帳に記録し、次回以降は「低頻度利用」として扱う
更新日が近いサービス確認を優先する。更新後は1年動かせないことを明示する
無料プランへ落とすとデータが消える解約・降格の前に、データの保全を確認する項目を設ける
部署が個別契約しているサービスが台帳にない会計システムの支払先から候補を拾い、台帳への追加を促す
同じ人が複数アカウントを持っている重複として挙げる。役割が違う場合もあるため人が判断
利用状況の取得が失敗した前回の値を使い回さない。取得できなかったことを記録する
Step11

記録を残す

  • サービスごとの契約数・割り当て数・利用者数(月ごと)
  • 判定結果と、人が変更した内容
  • 部署への照会と回答
  • 停止したアカウントと停止日
  • 解約・減数した内容と、その後の請求額

1番目を月ごとに残すと、推移が見えます。 契約数が増え続けているサービス、利用者が減り続けているサービスが分かり、更新の交渉材料になります。

利用状況のデータは、個人がいつ何を使ったかの記録でもあります。保存期間と閲覧範囲を決めてください。

04実装レベルの3段階

最小構成:CSVを手で書き出し、表計算で突き合わせる / 突合のみ
半自動化:APIのあるサービスは自動取得、無いものはCSV投入。整形・突合・確認事項の作成を自動化 / 収集の一部と整形・突合
本格構成:上記+週次の退職者チェック+更新日の通知+推移の可視化 / 定期的な監視まで

半自動化で30分が8分程度になります。 本格構成にしても、管理画面からのCSV書き出しは残るため、時間の差は大きくありません。本格構成の価値は、退職者アカウントを週次で見つけられることにあります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
40 件
1件あたり現在時間
30 分
1件あたり導入後時間
8 分
現在  40件 × 30分 ÷ 60 = 20 時間/月
導入後 40件 × 8分 ÷ 60 = 5.3 時間/月
月間削減時間
14.7h
削減率
73%
年間削減時間
176h
年間金額換算(時間単価3,800円)
67万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 部署ごとに契約したSaaSが20本以上あり、契約数と実際の利用者数が合っているか把握できていない会社。退職者のアカウントが残っていないかを定期的に確認したい場合。
向いていない
  1. SaaSが数本で、情報システム部門がすべて把握している場合。SaaS管理の専用サービスをすでに導入している場合。

07最小構成で試す方法

  1. 契約数の多いサービスを3本選ぶ
  2. それぞれの管理画面からアカウント一覧をCSVで書き出す
  3. 人事から在籍者の一覧(メールアドレス付き)をもらう
  4. 表計算で突き合わせ、在籍データに無いアカウントを数える
  5. 最終ログイン日が90日以上前のアカウントを数える

4番の結果で、この棚卸しの価値が分かります。 在籍データに無いアカウントが1件でも見つかれば、それだけで実施する理由になります。

判断の目安は次のとおりです。

3本の結果判断
在籍データに無いアカウントがあったすぐに全サービスへ広げる
未利用アカウントが1割以上あった半自動化に進む価値がある
どちらも無かった頻度を落としてよい。四半期に1度で足りる

この段階では生成AIを使いません。 表計算の突き合わせで十分です。サービスが増えて形式の違いが負担になった段階で、整形の部分にAIを使います。

08実装時につまずきやすいポイント

問題対策
最終ログイン日が取れないサービスがある「利用状況不明」として分ける。未利用と混ぜない
氏名での突合が同姓同名で誤るメールアドレスを軸に突合する
共有アカウントが退職者として上がる共有アカウントの一覧を持ち、判定から外す
業務委託・派遣のアカウントが在籍データにない対象者の一覧を別に用意する
「不要」と書かれた一覧が部署に回って揉める評価を書かせない。確認事項の形にする
更新日を過ぎてから気づく更新日までの日数を一覧に出し、60日前に通知する
取得に失敗した月のデータが前回値で埋まる取得失敗を記録し、空欄のままにする
解約したらデータが消えた解約・降格の前にデータ保全の確認項目を通す
個人の利用状況が評価に使われる目的を明示し、閲覧範囲を限定する

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: SaaSのアカウント一覧、利用状況、在籍データ、契約金額。アカウントと利用状況は、誰がいつ何を使ったかという個人の活動記録です。

  1. 監視目的で使わない … 利用状況は、ライセンスの要否を見るために集めるものです。個人の勤務状況の把握や評価に使わないことを、導入時に明示してください。 目的外に使われると、現場の協力が得られなくなります
  2. 退職者アカウント … 棚卸しで見つかった退職者のアカウントは、費用の判断を待たずに停止してください。残っていること自体が情報の管理上の問題です
  3. 外部AIへの入力 … アカウント名(多くはメールアドレス)が外部のサービスへ渡ります。氏名やメールアドレスを渡さず、アカウントIDに置き換えて整形させる方法も取れます。 判定に必要なのは「在籍しているか」「最終利用日」であり、氏名は必須ではありません
  4. 契約金額 … 取引条件にあたります。渡す必要がなければ、整形の対象から外します
  5. 学習利用 … 入力を学習に使わない設定または契約のサービスを選びます
  6. 自動実行してよい範囲 … 収集、整形、突合、確認事項の作成までです。アカウントの停止、解約、減数は、確認のうえ人が行います。 特に自動停止は、業務を止める事故につながります

誤りが起きた場合のリスクは、使用中のアカウントを止めて業務を止めること、逆に退職者のアカウントを見落とすことです。前者は影響が大きく、後者は気づかれにくいという違いがあります。

10まず何から始めるか

1週目:在籍データを受け取る形を決める

人事から、メールアドレス付きの在籍者一覧を定期的に受け取る形を決めます。ここが決まらないと、この棚卸しは成立しません。

2週目:3サービスで突き合わせる

契約数の多い3本で、アカウント一覧と在籍データを突き合わせます。在籍データに無いアカウントと、90日以上未ログインのアカウントを数えます。

3〜4週目:対象を全サービスに広げる

契約台帳を整え、40本分の書き出し手順を作ります。APIのあるサービスから順に自動取得へ切り替えます。

2か月目以降: 退職者チェックを週次で回し、更新日の60日前通知を加えます。月ごとの推移を残し、契約更新の交渉材料にしてください。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-09-15/最終更新:2026-09-15
確認した内容情報源確認日
Google Workspace の顧客単位の利用状況レポートを GET https://admin.googleapis.com/admin/reports/v1/usage/dates/yyyy-mm-dd の形式で日付を指定して取得できること。各レポートの既定かつ最大の対象期間が直近450日であることGoogle for Developers: Reports API - Customers Usage Report2026-09-15
Admin SDK の Reports API に、操作の記録(activities)、顧客単位の利用状況(customerUsageReports)、エンティティ単位(entityUsageReports)、利用者単位(userUsageReport)のリソースがあることGoogle for Developers: Admin SDK Reports API リファレンス2026-09-15

SaaSごとのAPIの有無、取得できる項目、最終ログイン日の取得可否は、サービスによって異なります。この部分は利用しているサービスごとの個別確認が必要です。 利用状況データの取り扱いは、自社の個人情報保護方針と労使の取り決めに照らして判断してください。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0088)についてのご相談はこちらから。

AI活用について相談する
目次