顧客のコース登録、進捗、完了を追跡するウェブアプリの計画、設計、構築方法を学びます。リマインダー、レポート、証明書の生成までカバーします。

トレーニング完了追跡は単なるチェックリストではありません——具体的な運用上の問いに答えます:誰がどのトレーニングを、いつ、どんな結果で完了したか。この答えが信頼できなければ、顧客オンボーディングが遅れ、更新がリスクになり、コンプライアンス対応がストレスになります。
最低限、学習進捗のウェブアプリは次を簡単にするべきです:
これが複数部署(CS、サポート、営業、コンプライアンス)が同じ答えを必要とする場合の“真実の源”になります。
「顧客向けトレーニング」は対象によって意味が変わります:
早い段階で対象を明確にすることで、必須/任意のコース、リマインダーの頻度、「完了」の定義などに影響します。
実用的な完了ダッシュボードは通常、次を必要とします:
「動いている」だけでなく次の指標を定義してください:
これらが何を先に作るか、後回しにできるかを導きます。
役割(誰であるか)と所属(どの顧客アカウントに属しているか)を分離すると、管理が格段に楽になります。これによりレポートの正確性が保たれ、偶発的なデータ露出を防ぎ、権限が予測可能になります。
Learner(受講者)
受講者は最もシンプルな体験であるべきです:割り当てられたコースを見る、トレーニングを開始/再開する、自分の進捗と完了状況を見る。他人(同じ顧客内の他の人)のデータは見てはいけません。
Customer Admin(顧客管理者)
顧客管理者は自組織のトレーニングを管理します:受講者の招待、コースの割り当て、チームの完了状況確認、監査用のエクスポートが可能。ユーザー属性(名前、チーム、ステータス)の編集はできても、グローバルなコースコンテンツを変更する権限は原則不要です(顧客固有コースをサポートする場合は別)。
Internal Admin(内部管理者/あなたのチーム)
内部管理者は顧客全体を横断して可視化が必要です:アカウント管理、アクセスのトラブルシュート、登録の修正、グローバルレポートの実行など。ユーザー削除、アカウントのマージ、請求関連フィールドの変更といった敏感な操作はこのロールで管理します。
Instructor / Content Manager(任意)
ライブセッションを運営したり教材を更新する担当がいる場合、コースの作成・編集、セッション管理、受講者アクティビティのレビューを行う役割を用意します。通常、請求データや顧客横断の分析データを見る必要はありません。
多くのB2Bアプリはシンプルな階層が最適です:
日常管理にはチームが、報告や期限管理にはコホートが役立ちます。
各顧客組織を独立したセキュアなコンテナとして扱ってください。最低限:
役割とテナント境界を早期に設計することで、後からレポートやリマインダー、連携を追加しても大幅なやり直しを防げます。
明確なデータモデルがあれば「なぜこのユーザーが未完了に見えるのか?」といった問題の多くを防げます。何が割り当てられ、何が起き、なぜ完了と見なすのかを記録しておくことを目指してください。
配信方法に合わせてトレーニングコンテンツをモデル化しましょう:
MVPが「コースだけ」でも、最初からモジュール/レッスンを想定しておくと、後の移行が楽になります。
完了は暗黙にするのではなく明示的にしましょう。よくあるルール:
コースレベルでは「必須のすべてのレッスン」「必須モジュールすべて」「N/Mのうち任意のN」などを定義し、使用したルールのバージョンを保存しておくと、後で要件を変更しても報告が一貫します。
受講者と項目ごとに進捗レコードを追跡します。便利なフィールド:
started_at, last_activity_at, completed_atexpires_at(年次更新やコンプライアンスサイクル用)これにより「7日間静止している」へのリマインダー、更新報告、監査証跡が可能になります。
各完了に対して保存する証拠を決めてください:
証拠は軽量に保ち、アプリ内には識別子や要約を保存し、詳細な生データ(クイズ回答、動画ログ)は本当に必要な場合のみリンクして保持すると良いです。
認証と登録を正しく設計すると、受講者にとってストレスが少なく、管理者にとって制御しやすいアプリになります。目標は摩擦を減らしつつ「誰がどのアカウントで何を完了したか」を正確に追跡することです。
MVPでは主要なサインインオプションを1つとフォールバックを1つ選びます:
大口顧客が要望したらSSO(SAML/OIDC)を後から追加できるように、ユーザープロファイルに複数の認証方法を紐づけられる設計にしておくと良いです。
多くのトレーニングアプリは次の3つの登録経路が必要です:
実務的なルール:登録は常に 誰が登録したか(enrolled_by)、いつ登録したか(enrolled_at)、どの顧客アカウント下か(organization_id) を記録すること。
まずは運用上の問いに答えられることが重要です:誰がどのトレーニングを、いつ、どのような結果で完了したか。MVPでは以下を確実に記録してください:
started_at, last_activity_at, completed_atこれらのフィールドが信頼できれば、ダッシュボードやエクスポート、コンプライアンス対応が簡単になります。
完了ルールを明示的に定義し、そのバージョンを保存しましょう。クリック履歴などから推測するのではなく、どのルールで「完了」と見なしたかを残します。
一般的なルールの種類:
コース単位では「必須項目をすべて完了する」「N/Mのうち任意のNを完了する」などを決め、ルールのバージョンを保存してコンテンツ変更後もレポートの整合性を保ってください。
テナント(顧客アカウント)とユーザーの所属を分けて考えると管理が楽になります:
その上で役割を定義します:
こうするとデータ漏えいを防ぎ、レポートも信頼できるものになります。
現場でよく使われる最低限の流れは次の3つです:
どの流れでも , , を記録して「どうやって入ったか」を明確にしておくことが重要です。
マジックリンクはパスワードの摩擦を減らしますが、下記は必須です:
パスワード方式は顧客の期待によっては有効ですが、リセットやロックアウト対応の工数を見込んでください。現実的な道筋は「まずマジックリンク→大口顧客向けにSSO(SAML/OIDC)を追加」です。
受講者にとって次に何をすべきかが明確なら完了率は上がります。
何が残っているかが見えなければ、受講者は迷走して進まなくなります。
初日から管理者が知りたいことに答えるビューを用意してください:
さらに、管理者がすぐ行動できるようにバルク操作(Enroll、Send reminders、CSV export)を結果一覧から実行できると良いです。
試行を上書きするのではなく、試行履歴をファーストクラスデータとして扱ってください。
実務的なやり方:
これにより「3回目で合格した」といった正確な説明が可能になり、争いが減ります。
コンテンツ変更はバージョン管理の問題として扱ってください。
選択肢:
course_version_id を登録・完了に保存しておくと、コンテンツ更新で過去のレポートが変わることを防げます。
まずは顧客IDとワークフローを握るシステムから着手します:
APIをシンプルに保つ:
POST /api/usersenrolled_byenrolled_atorganization_idPOST /api/enrollmentsPOST /api/completionsGET /api/courses使うべきコアWebhookは course.completed(account_id, user_id, course_id, completed_at, score を含む)です。署名、再試行、冪等性を提供してください。