何を自動化したか
問い合わせは早く返すほど成約につながりやすく、体験の前日に一言リマインドすると無断キャンセルが減る。これは業界で広く言われている知見で、僕の教室でも体感として一致する。これをもとに、体験生への「前日リマインダー」「翌日お礼」「数日後フォロー」のメール下書きを毎朝自動生成する仕組みと、出欠メモから退会予兆を検知して声かけ文案を作る仕組みを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日ずれる、あるいは休日で発火しない、といったことがあり得るため、「前日〜当日」のような幅(範囲判定)にして、多少ずれても次回の実行で拾えるようにした。
- 同じ下書きを二重に作ってしまう。対応ログの文字列に「リマインダー」「お礼」「フォロー」が含まれているかをチェックしてから作成することで、同じ体験生に同じ段階のメールを何度も下書きしないようにした。
- 「お礼」メールの窓は1〜2日しかなく、失敗を翌日のダイジェスト通知にまとめると間に合わない。この処理だけは失敗時に即時通知する例外扱いにしている。お礼メールは温度が命で、翌朝の再試行を待たずに手動対応できるようにする必要があった。
- 退会予兆の検知は過剰反応との戦い。1回の欠席だけで警告を出すと通知が増えすぎて無視されるようになるため、プロンプトで明示的に閾値の考え方(連続欠席・頻度の増加)を指定し、単発の欠席では拾わないようにした。
- 面談・値引きなど家庭の個別事情には触れさせない。関連する面談ブリーフ生成でも同様だが、AIに生成させる文章には「家庭の個別事情や特別対応の理由には一切触れない」という制約を毎回プロンプトに入れている。生成AIは文脈があれば触れてしまうことがあるため、明示的な禁止事項として書く必要があった。
導入手順
- スプレッドシートに「体験生フォロー」シート(名前・保護者メール・体験日・ステータス・メモ・対応ログ)と「出欠・様子メモ」シート(日付・生徒名・出欠・メモ)を用意する。
- スクリプトプロパティに
GEMINI_API_KEYを登録する(メール文・退会予兆の判定にGeminiを使うため)。 - 体験生フォロー処理を、既存の「毎朝実行」の時間主導型トリガーに載せる(新規トリガーは作らず、既存のディスパッチャーに関数を1本足すだけにする)。
- 退会予兆スキャンは「毎週月曜実行」のトリガーに載せる。
- 日々の出欠と気づきを「出欠・様子メモ」シートに手入力する運用を決める(この入力がないと退会予兆は検知できない)。
- 実行後はGmailの下書きフォルダを確認し、内容を見てから送信する。自動送信はしない設計のため、必ず人の目を通す。
- 口コミ依頼・保護者向け進捗レポートなど、不定期に使う機能は依頼キュー方式にして、都度シートに1行入力する運用にする。
よくある質問
Q. メールを自動送信しないのはなぜですか
AIが生成した文章にはまれに事実誤認や温度感のズレが起こり得るため、保護者に直接届くメールは必ず人が最終チェックしてから送る設計にしている。自動化するのは「下書きを作るところまで」と割り切っている。
Q. 退会予兆の検知はどのくらいの頻度で誤検知しますか
件数として計測はしていないが、「1回の欠席だけでは挙げない」という条件をプロンプトに入れてからは、明らかな見当違いのアラートは体感で減った。最終判断は必ず人が行う前提で運用している。
Q. 体験生フォロー以外の用途にも応用できますか
同じ仕組みは冬期講習修了者の入会検討フォローにも転用している。新しい仕組みを作るのではなく、「体験生フォロー」シートに体験日を過去の日付でずらして登録し、既存の「フォロー」ステップの判定窓に入るようにするだけで対応できた。
この仕組みの「全体像」と「コード全文」
- Kindle『個人塾長、AIを雇う。』(500円・Kindle Unlimited対応)2年間の実録を1冊に。何をどの順で自動化したか、失敗も含めて
- note『個人塾をGASで自動化した実録(実コード付き)』(1,800円)この記事で省略したコード全文と、貼り付け手順
- English edition: How I Automated My One-Man Tutoring School with AI ($6.99)