体験生フォローを自動化する——前日リマインド・当日お礼・退会予兆の検知

体験生への前日リマインダー・お礼・数日後フォローのメール下書きを毎朝自動生成し、出欠メモから退会予兆も検知する仕組みをGASで作った。

2026-09-14 公開 / 滋賀県彦根市の一人塾「総合学習教室ブリッジ」で実際に動いている仕組みの記録 / Google Apps Script(GAS)

何を自動化したか

問い合わせは早く返すほど成約につながりやすく、体験の前日に一言リマインドすると無断キャンセルが減る。これは業界で広く言われている知見で、僕の教室でも体感として一致する。これをもとに、体験生への「前日リマインダー」「翌日お礼」「数日後フォロー」のメール下書きを毎朝自動生成する仕組みと、出欠メモから退会予兆を検知して声かけ文案を作る仕組みをGASで作った。

件数としての実測値は取っていないため体感になるが、以前は体験の前日に「明日リマインドしなきゃ」と手作業で思い出す必要があり、うっかり抜けることがあった。いまは毎朝6時に自動で下書きができているので、僕がやることは内容を確認して送信ボタンを押すだけになった。メール自体は自動送信せず、必ず人が最後に見てから送る設計にしている。

仕組み(データの流れ)

起点は「体験生フォロー」シート(名前・保護者メール・体験日・ステータス・メモ・対応ログの6列)。ここに1行追加されるだけで、以後の下書き作成はすべて自動で回る。

タイミング条件作られるもの
体験日の前日・当日対応ログに「リマインダー」の記録がまだない持ち物・場所・時間確認のリマインダーメール下書き
体験日の1〜2日後対応ログに「お礼」の記録がまだない体験時の様子に触れたお礼+入会案内メール下書き
体験日の3〜6日後対応ログに「フォロー」の記録がまだない検討状況を気遣うフォローメール下書き
毎週月曜「出欠・様子メモ」シートの直近4週間退会予兆アラート+声かけ文案(該当者がいる時だけ)

日付のピンポイント一致ではなく「前日〜当日」「1〜2日後」のような幅で判定しているのがポイントで、トリガーが1日動かなくても次の実行で取りこぼさない。同じ段階の下書きを二度作らないように、対応ログに書いた文字列(「リマインダー」「お礼」「フォロー」)をチェックしてから実行する。

この仕組みは体験生の予約フォームとも直結している。フォームからの体験予約が入ると「体験生フォロー」シートに自動で行が追加され、翌朝からこのフォロー処理の対象に入る。

コード(要点)

本体は「体験日と今日の日数差」で3段階のどれに当たるかを判定し、Geminiにメール文を作らせてGmailの下書きに保存するだけの単純な構造になっている。

function successTrialFollowUps() {
  var sheet = autoSheet('体験生フォロー', ['名前', '保護者メール', '体験日', 'ステータス', 'メモ', '対応ログ']);
  var data = sheet.getDataRange().getValues();
  var today = new Date();
  today.setHours(0, 0, 0, 0);

  for (var r = 1; r < data.length; r++) {
    var name = String(data[r][0] || '').trim();
    var email = String(data[r][1] || '').trim();
    var trialDate = new Date(data[r][2]);
    var status = String(data[r][3] || '').trim();
    var log = String(data[r][5] || '');
    if (!name || !email || isNaN(trialDate.getTime())) continue;
    if (status === '入会' || status === '辞退') continue;

    trialDate.setHours(0, 0, 0, 0);
    var diffDays = Math.round((trialDate.getTime() - today.getTime()) / (24 * 3600 * 1000));

    var step = null;
    if ((diffDays === 1 || diffDays === 0) && log.indexOf('リマインダー') < 0) {
      step = { tag: 'リマインダー', goal: '明日・本日の体験のリマインダー' };
    } else if (diffDays <= -1 && diffDays >= -2 && log.indexOf('お礼') < 0) {
      step = { tag: 'お礼', goal: '体験のお礼と入会案内' };
    } else if (diffDays <= -3 && diffDays >= -6 && log.indexOf('フォロー') < 0) {
      step = { tag: 'フォロー', goal: '検討状況を気遣うフォロー' };
    }
    if (!step) continue;

    // ここでGeminiにメール文(件名・本文)をJSONで作らせ、GmailApp.createDraftで下書き保存
    // 成功したら対応ログに「◯◯下書き 9/13」のように追記して二重生成を防ぐ
  }
}

退会予兆の検知は、直近4週間の出欠・様子メモをまとめてAIに渡し、危険サインのある生徒だけをJSONで返させる方式。1回の欠席だけでは挙げないよう、プロンプト側で明示的に「過剰反応しない」と釘を刺している。

var result = autoGeminiJson([
  'あなたは学習塾の退会防止の専門家です。以下は直近4週間の出欠・様子メモです。',
  rows.join('\n'),
  '退会につながる危険サイン(連続欠席・欠席頻度の増加・遅刻増・ネガティブな様子)がある生徒を特定してください。',
  '該当者がいなければ空配列。過剰反応しないこと(1回の欠席だけでは挙げない)。',
  '各生徒に、塾長が保護者または本人にかける「具体的な声かけ文案」を1つ付けてください。',
  'JSON形式: {"alerts":[{"name":"生徒名","sign":"検出した危険サイン","action":"声かけ文案"}]}',
].join('\n'));

メール生成・保存部分の全文と、依頼キュー連携(学習レポート・口コミ依頼)の実装はnoteへ。

ハマった点と回避策

導入手順

  1. スプレッドシートに「体験生フォロー」シート(名前・保護者メール・体験日・ステータス・メモ・対応ログ)と「出欠・様子メモ」シート(日付・生徒名・出欠・メモ)を用意する。
  2. スクリプトプロパティに GEMINI_API_KEY を登録する(メール文・退会予兆の判定にGeminiを使うため)。
  3. 体験生フォロー処理を、既存の「毎朝実行」の時間主導型トリガーに載せる(新規トリガーは作らず、既存のディスパッチャーに関数を1本足すだけにする)。
  4. 退会予兆スキャンは「毎週月曜実行」のトリガーに載せる。
  5. 日々の出欠と気づきを「出欠・様子メモ」シートに手入力する運用を決める(この入力がないと退会予兆は検知できない)。
  6. 実行後はGmailの下書きフォルダを確認し、内容を見てから送信する。自動送信はしない設計のため、必ず人の目を通す。
  7. 口コミ依頼・保護者向け進捗レポートなど、不定期に使う機能は依頼キュー方式にして、都度シートに1行入力する運用にする。

よくある質問

Q. メールを自動送信しないのはなぜですか

AIが生成した文章にはまれに事実誤認や温度感のズレが起こり得るため、保護者に直接届くメールは必ず人が最終チェックしてから送る設計にしている。自動化するのは「下書きを作るところまで」と割り切っている。

Q. 退会予兆の検知はどのくらいの頻度で誤検知しますか

件数として計測はしていないが、「1回の欠席だけでは挙げない」という条件をプロンプトに入れてからは、明らかな見当違いのアラートは体感で減った。最終判断は必ず人が行う前提で運用している。

Q. 体験生フォロー以外の用途にも応用できますか

同じ仕組みは冬期講習修了者の入会検討フォローにも転用している。新しい仕組みを作るのではなく、「体験生フォロー」シートに体験日を過去の日付でずらして登録し、既存の「フォロー」ステップの判定窓に入るようにするだけで対応できた。

この仕組みの「全体像」と「コード全文」