パン屋の「焼き上がり通知」をLINEで自動化する手順

LINE公式アカウント × エルメ

パン屋の「焼き上がり通知」を
LINEで自動化する手順

貼り紙も全員への一斉送信もやめる。焼けた時刻を入れて配信ボタンを押すだけで、
そのパンが好きで、その曜日に受け取りたい人にだけ届く仕組みを、画面の手順どおりに作ります。

はじめに:3つの道具の役割分担

この記事では、LINE公式アカウント・エルメ(エルメッセージ)・Googleスプレッドシート+GASの3つを使います。先に「誰が何をするか」を決めておくと、途中で迷いません。

道具担当すること担当しないこと
エルメ友だちの受信・タグ付け・自動応答・ステップ配信・焼き上がりの一斉配信・フォーム(スタンプ)—
連携シートエルメがフォーム回答を自動で書き込む受け口人は編集しない
GAS(時間トリガー専用)連携シート→スタンプ記録の取込、顧客台帳の集計、店主へのメールLINEの受信も、お客様への送信もしない
スプレッドシートスタンプ・来店履歴・焼き上がりの記録を保存—
この分担が崩れると動かなくなります。LINE公式アカウントの受信口(Webhook)は1つしかなく、エルメを接続した時点でエルメが使います。GASにLINEの受信や、お客様個人への送信を担わせる設計にすると、エルメの接続が壊れます。お客様に届くメッセージはすべてエルメから送り、GASは「時間が来たらシートを整えて店主にメールする」役に徹します。
◆ ◆ ◆

1. 友だち追加・ウェルカム設定

友だち追加した直後にウェルカムメッセージを自動送信し、翌日に好きなパンの種類、翌々日に通知を受け取る曜日を選んでもらいます。選んだ内容がタグとして記録され、章2の焼き上がり通知の出し分けに使います。

ステップ配信の設定

操作場所:エルメッセージ管理画面 > シナリオ配信 > 新規作成

  1. 「シナリオ配信」を開き、「新規作成」をクリックする。シナリオ名に「ウェルカム_ベーカリー」と入力。
  2. ステップ1(即時送信):テキスト+画像のウェルカムメッセージを設定。配信タイミングは「友だち追加直後」。
  3. ステップ2(1日後送信):パンの種類を選ぶボタン付きメッセージを設置。各ボタンに「タグを付ける」アクションを設定する(下表)。
  4. ステップ3(2日後送信):「通知を受け取る曜日を選んでください」の曜日ボタン付きメッセージを送る(内容は章3と同じものを流用)。
  5. 「有効」に切り替えて保存する。
🍞 〇〇ベーカリーへようこそ!
友だち登録ありがとうございます🎉

毎日、焼きたてパンの焼き上がり時間をお知らせします🔔
ぜひ焼きたてを食べにいらしてください!
Step1 即時送信
🍞 好きなパンを教えてください!
通知を受け取りたいパンの種類を選んでね👇
Step2 翌日送信
📅 通知を受け取る曜日を選んでください
受け取りたい曜日のボタンを押してください🔔
Step3 2日後送信
配信タイミングは「即時 → 1日後 → 2日後」の順に固定します。曜日を選んでもらわないと通知が届かないため、ステップ3は必ず入れてください。ステップ配信はPushメッセージなので、1人につき3通を消費します(章8)。

タグ設定(パン種別・曜日)

エルメのタグは記事全体で以下の12個に統一します。パン種別タグ5個と曜日タグ7個の2系統で、この組み合わせで配信先を絞ります。「全部通知して」「毎日受け取る」は専用のタグを作らず、該当するタグをまとめて付ける形にします(タグが増えると配信条件が複雑になるため)。

パン種別タグ(好きなパンを選んだときに付与)

食パン好き クロワッサン好き 惣菜パン好き 菓子パン好き バゲット好き

曜日タグ(通知を受け取る曜日を選んだときに付与)

通知_月 通知_火 通知_水 通知_木 通知_金 通知_土 通知_日

ボタンテキスト付与するタグ備考
🍞 食パン食パン好き毎日焼く定番品
🥐 クロワッサンクロワッサン好き週4回焼成
🥙 惣菜パン惣菜パン好き日替わり
🍩 菓子パン菓子パン好き土日多め
🥖 バゲットバゲット好き火・金・日
🔔 全部通知して!上の5つをすべて付ける1つのボタンに複数タグを設定
設定場所:エルメッセージ > シナリオ配信 > ステップ2のメッセージ > ボタンの設定 ボタンを押したときのアクションで「タグを付ける」を選び、対応するタグを設定します。「全部通知して!」は5つのタグをすべて選びます。ボタンのタップへの反応はReplyなので通数は消費しません。
◆ ◆ ◆

2. 焼き上がり通知の配信設定

焼き上がりの通知は、エルメの一斉配信から送ります。パンごとに配信の下書きを作っておき、焼き上がる直前にスマホで下書きを開いて、時刻と在庫数を書き換えて配信ボタンを押す、という運用です。配信対象を「そのパンのタグ」と「今日の曜日タグ」で絞るので、興味のない人には届きません。

通知メッセージテンプレ

🍞 焼き上がりました! ▶ 食パン(1斤) 🕐 焼き上がり:10:30 📦 本日の在庫:8本 焼きたてをぜひ😊 売り切れ次第終了です🙏 📍 ベーカリー 営業:9:00〜18:00(日曜は17:00まで/水曜定休)

毎回書き換えるのは「🕐 焼き上がり」と「📦 本日の在庫」の2か所だけです。パン名はパンごとの下書きに入れておきます。

🍞 焼き上がりました!

▶ 食パン(1斤)
🕐 焼き上がり:10:30
📦 本日の在庫:8本

焼きたてをぜひ😊
売り切れ次第終了です🙏

パンごとの配信下書きを作る(最初に1回)

操作場所:エルメ管理画面 > 配信 > 一斉配信 > 新規作成

  1. 配信名を「焼き上がり_食パン」にする(パンの数だけ繰り返す)。
  2. 配信対象を「絞り込む」にし、条件1に タグ 食パン好き を含む、条件2に タグ 通知_月 を含む、を設定する(曜日は当日に差し替えるので仮でよい)。
  3. 本文に上のテンプレを貼る。
  4. 配信方法を「日時指定」にして保存だけし、配信はしない(下書きとして残す)。
絞り込み条件は「条件1 かつ 条件2」で設定します。食パンが好きで、しかも月曜に受け取りたい人だけが対象になります。エルメの配信作成画面には対象人数が表示されるので、人数が0や全員になっていないか、必ず目で確認してから送ってください。

当日の配信手順(焼き上がる5分前・スマホでOK)

  1. エルメの一斉配信一覧から、そのパンの下書き「焼き上がり_食パン」を複製する。
  2. 配信対象の条件2の曜日タグを、今日の曜日に変える(火曜なら 通知_火)。
  3. 本文の「🕐 焼き上がり」と「📦 本日の在庫」を書き換える。
  4. 配信方法を「今すぐ配信」にして、対象人数を確認し、配信ボタンを押す。
  5. 配信後、章5の「焼き上がり記録」シートに、パン名・時刻・在庫数・配信人数を1行書く(通数の管理に使う)。

配信対象の絞り込み条件(早見表)

通知対象パン条件1(パン種別)条件2(曜日・当日に差し替え)想定頻度
🍞 食パン食パン好き を含む今日の 通知_◯ を含む毎日
🥐 クロワッサンクロワッサン好き を含む同上週4回
🥙 惣菜パン惣菜パン好き を含む同上毎日
🍩 菓子パン菓子パン好き を含む同上週5回
🥖 バゲットバゲット好き を含む同上火・金・日
⚠️ 無料枠200通の注意:一斉配信はPushメッセージで、届いた人数ぶんが通数として数えられます。1日5回配信して各回10人に届けば1日50通、4日で無料枠が尽きます。友だちが20人を超えたら、ライトプラン(月5,000通)を前提に計画してください(章8に試算あり)。
◆ ◆ ◆

3. 曜日指定通知(受け取る日をお客様が選ぶ)

お客様がリッチメニューの「通知設定変更」を押すと曜日ボタンが表示されます。受け取りたい曜日を選ぶと曜日タグが付き、章2の一斉配信で「今日の曜日タグ」を持つお客様だけが対象になります。この仕組みはエルメの自動応答だけで完結し、GASは使いません。

① エルメの自動応答(キーワード反応)を設定する

操作場所:エルメ管理画面 > 自動応答 > 新規作成

  1. キーワードに 通知設定を変更したい を入力する(リッチメニューのボタンテキストと完全一致させる)。
  2. 返信メッセージに、曜日ボタン付きのメッセージ(ボタン型テンプレート)を設定する。ボタンは「月〜日」の7つと「毎日受け取る」「通知を止める」の計9つ。
  3. 各ボタンに「タグを付ける」または「タグを外す」のアクションを設定する(下表参照)。
  4. 「有効」に切り替えて保存する。
📅 通知を受け取る曜日を選んでください
受け取りたい曜日のボタンを押してください🔔
何度でも変更できます。
月 火 水 木 金 土 日 全日
✅ 火曜日に設定しました!
毎週火曜に焼き上がりをお知らせします🍞
自動返信

② 曜日ボタンのタグ設定一覧

ボタンテキスト付与するタグ同時に外すタグ
月曜日通知_月—
火曜日通知_火—
水曜日通知_水—
木曜日通知_木—
金曜日通知_金—
土曜日通知_土—
日曜日通知_日—
🔔 毎日受け取る曜日タグ7つをすべて付ける—
🔕 通知を止める—曜日タグ7つをすべて外す
複数の曜日ボタンを順番に押すと、複数の曜日タグが同時に付きます。例:月・水・金を選ぶ → 通知_月 通知_水 通知_金 の3タグが付きます。ボタンのタップへの反応はReplyなので、何度押しても通数は消費しません。

③ 配信条件の早見表

今日の曜日食パンの通知が届く人
月曜日食パン好き と 通知_月 の両方を持つ人
火曜日食パン好き と 通知_火 の両方を持つ人
日曜日食パン好き と 通知_日 の両方を持つ人
曜日タグを1つも持っていないお客様には通知が届きません。章1のウェルカム配信ステップ3(2日後)で曜日設定を促す構成にしています。
◆ ◆ ◆

4. リッチメニューの設定

トーク画面下部に常設されるリッチメニューです。6マス構成で、焼き上がり確認・通知設定変更・スタンプカードへのアクセスを1タップで行えます。

リッチメニューの配置

🍞 ベーカリー メニュー
🔔
本日の
焼き上がり
📋
パンの
ラインナップ
🕐
営業時間
📍
アクセス
・地図
🎴
スタンプ
カード
⚙️
通知設定
変更

各ボタンのアクション設定

操作場所:エルメ管理画面 > リッチメニュー > 新規作成

ボタンアクション種別設定内容
🔔 本日の焼き上がりテキスト送信今日の焼き上がりを教えて
📋 ラインナップURL遷移メニュー紹介ページURL
🕐 営業時間テキスト送信営業時間を教えて
📍 アクセスURL遷移Google マップURL
🎴 スタンプカードテキスト送信スタンプカードを見る
⚙️ 通知設定変更テキスト送信通知設定を変更したい
「⚙️ 通知設定変更」のボタンテキスト(通知設定を変更したい)は、章3で設定した自動応答のキーワードと完全一致させてください。

リッチメニューの作成手順

  1. 「リッチメニュー」→「新規作成」をクリックし、タイトルに「ベーカリー_基本メニュー」と入力する。
  2. テンプレートから「大(3×2の6分割)」を選択する。プレビューの上部帯「ベーカリー メニュー」は画像に描き込む飾りで、ボタンではありません。
  3. 2500×1686px の画像を用意してアップロードする(Canva等の無料ツールで作成可)。
  4. 各エリアをクリックし、上表のとおりアクション種別と設定内容を入力する。
  5. 表示期間を「無期限」に設定し、保存して反映する。
LINE公式アカウント側のリッチメニューはオフにする。エルメでリッチメニューを出すときは、LINE Official Account Managerの「リッチメニュー」を表示オフにします。両方オンだと表示が競合します。なお、エルメのフリープランで作れるリッチメニューは2つまでです。

ボタンに応答する自動応答の設定

リッチメニューのボタンはテキストを送信するだけです。エルメ側で同じキーワードに反応する自動応答を作らないと、押しても何も返ってきません。以下の4つを登録します。自動応答の返信はReplyなので通数は消費しません。

操作場所:エルメ管理画面 > 自動応答 > 新規作成

キーワード返信内容
今日の焼き上がりを教えて本日の焼成スケジュール(固定テキスト)を返信
営業時間を教えて営業時間・定休日を返信
スタンプカードを見るスタンプの貯め方(レジ横のQRを読む)と特典の案内を返信
通知設定を変更したい曜日選択ボタン付きメッセージを返信(章3で設定済み)

コピペ用テンプレ(本日の焼き上がり)

🍞 本日の焼き上がりスケジュール 🕘 9:30 食パン 🕚 11:00 クロワッサン 🕦 11:30 惣菜パン 🕝 14:00 菓子パン 🕟 15:30 バゲット ※ 日によって前後します ※ 売り切れ次第終了です🙏

コピペ用テンプレ(営業時間)

🕐 営業時間のご案内 平日・土曜 9:00〜18:00 日曜    9:00〜17:00 定休日   毎週水曜日 📍 アクセスはリッチメニューの 「📍 アクセス・地図」からどうぞ。
◆ ◆ ◆

5. スプレッドシート構成とGASスクリプト

スプレッドシートは「記録を残す」ためのものです。配信も受信もエルメがやるので、GASの仕事は時間が来たら連携シートを読み、スタンプ記録と顧客台帳を整え、店主にメールすることだけです。

シートの役割分担

シート誰が書くか役割
スタンプ回答(連携シート)エルメだけ章6のスタンプフォームの回答の受け口。人は編集しない
スタンプ記録GAS来店1回=1行の履歴(正本)
顧客台帳GASお客様ごとの累計スタンプ・最終来店日
焼き上がり記録スタッフ配信したパン・時刻・在庫・配信人数(通数の管理用)
ここで決めた列名と列順は、以降のGASコード・本文・図表すべてで一致させます。後から列を挿入するとGASの列番号がずれるので、先に確定させてください。
📥 スタンプ回答シート(エルメが自動作成・人は触らない)
列見出し内容
A回答日時エルメが記録。GASはこれを「来店日」にする
B友だち名エルメが記録。LINEの表示名
C購入したパンフォームの質問(任意)
エルメが書き出す連携シートは、A列が回答日時、B列が友だち名、C列以降がフォームの質問の順です。GASは列の位置ではなく見出し名で読むので、質問を足しても動きます。見出し名を変えたときはGASの H の値を合わせてください。
🎴 スタンプ記録シート(GASが書く)
列項目名内容
A来店日回答日時の日付部分(自動)
B友だち名連携シートから写す(自動)
C購入品フォームの回答(任意)
D取込キー回答日時+友だち名(二重取込の防止用)
📋 顧客台帳シート(GASが書く)
列項目名内容
A友だち名LINEの表示名
B累計スタンプ来店日の数(1日1個)
C最終来店日いちばん新しい来店日
Dクーポン発行回数10個達成のたびに1増える
名前が同じお客様は1人に数えられます。連携シートにはLINEの表示名しか入らないため、同姓同名(「はなこ」が2人など)は台帳上で区別できません。気づいたときは、エルメの友だち情報(表示名の横のアイコンなど)で見分け、台帳のA列を「はなこ(2)」のように手で直してください。
🔔 焼き上がり記録シート(スタッフが書く)
列項目名内容
A日付配信した日
Bパン名プルダウンで選択
C焼き上がり時刻例:10:30
D在庫数本数・個数
E配信人数エルメの配信画面に出た対象人数を転記

GASコード(コード.gs 全文)

操作場所:連携シートが入っているスプレッドシート > 拡張機能 > Apps Script

  1. 章6で連携したスプレッドシート(「スタンプ回答」シートが入っているファイル)を開く。
  2. 同じファイルに「スタンプ記録」「顧客台帳」「焼き上がり記録」の3シートを作り、上の表のとおり1行目に見出しを入れる。
  3. 拡張機能からApps Scriptを開き、エディタの中身をすべて消して下のコードを貼り付ける。
  4. 冒頭の OWNER_MAIL を店主のメールアドレスに書き換える。連携シートの名前を変えた場合は SHEET_LINKED も合わせる。
  5. 関数 importStamps を一度手動で実行し、権限の確認画面で許可する。
  6. 左メニューの時計アイコン(トリガー)から importStamps を「時間主導型 > 分ベースのタイマー > 10分おき」で登録する。
  7. 同じ画面で monthlyPushCheck を「日付ベースのタイマー > 午前8時〜9時」で登録する。
// ===== パン屋 スタンプ記録GAS(時間トリガー専用・受信も個別送信もしない) =====
// エルメが連携シートに書いたフォーム回答を、時間が来たら読みに行くだけ。
// LINEのWebhookはエルメが持ったままなので、両者は問題なく共存する。

const SHEET_LINKED = 'スタンプ回答';     // エルメが作った連携シートの名前(章6)
const SHEET_STAMP  = 'スタンプ記録';     // A列=来店日, B列=友だち名, C列=購入品, D列=取込キー
const SHEET_LEDGER = '顧客台帳';         // A列=友だち名, B列=累計スタンプ, C列=最終来店日, D列=クーポン発行回数
const SHEET_BAKE   = '焼き上がり記録';   // A列=日付, B列=パン名, C列=時刻, D列=在庫数, E列=配信人数
const OWNER_MAIL   = 'owner@example.com'; // 店主の通知先
const TZ           = 'Asia/Tokyo';
const FREE_LIMIT   = 200;                 // 無料枠(通/月)
const WARN_AT      = 160;                 // この通数を超えたらメールで知らせる

// 連携シートの見出し名(フォームの質問名と一致させる)
const H = { AT: '回答日時', NAME: '友だち名', ITEM: '購入したパン' };

// ===== 10分おき:連携シートの新しい回答をスタンプ記録へ写し、台帳を更新 =====
function importStamps() {
  const ss     = SpreadsheetApp.getActiveSpreadsheet();
  const linked = ss.getSheetByName(SHEET_LINKED);
  const stamp  = ss.getSheetByName(SHEET_STAMP);
  if (!linked || linked.getLastRow() < 2) return;

  const data = linked.getDataRange().getValues();
  const head = data[0].map(String);
  const c = { at: head.indexOf(H.AT), name: head.indexOf(H.NAME), item: head.indexOf(H.ITEM) };
  if (c.at < 0 || c.name < 0) {
    mail_('【要確認】連携シートの見出しが見つかりません', '見出し: ' + head.join(' / '));
    return;
  }

  const done    = existingKeys_(stamp);   // 取込済みキー(D列)
  const touched = {};                     // 今回スタンプが増えた人

  for (let i = 1; i < data.length; i++) {
    const r = data[i];
    if (!r[c.at]) continue;                            // 空行
    const name = String(r[c.name]).trim();
    const key  = ymdhms_(r[c.at]) + '|' + name;
    if (done[key]) continue;                           // 取込済み
    stamp.appendRow([ymd_(r[c.at]), name, c.item >= 0 ? r[c.item] : '', key]);
    done[key] = true;
    touched[name] = true;
  }

  const names = Object.keys(touched);
  if (names.length) updateLedger_(ss, stamp, names);
}

// ===== 顧客台帳を更新(累計=来店日の数、1日1個) =====
function updateLedger_(ss, stamp, names) {
  const ledger = ss.getSheetByName(SHEET_LEDGER);
  const rows   = stamp.getDataRange().getValues();   // A列=来店日, B列=友だち名
  const days   = {};                                  // 名前 → {来店日: true}
  for (let i = 1; i < rows.length; i++) {
    const n = String(rows[i][1]).trim();
    if (!names.includes(n)) continue;
    (days[n] = days[n] || {})[String(rows[i][0])] = true;
  }

  const lv      = ledger.getDataRange().getValues();  // A列=友だち名, B列=累計, C列=最終来店日, D列=クーポン回数
  const coupon  = [];

  names.forEach(function (n) {
    const visit  = Object.keys(days[n] || {}).sort();
    const total  = visit.length;
    const last   = visit[visit.length - 1] || '';
    let row = -1;
    for (let i = 1; i < lv.length; i++) if (String(lv[i][0]).trim() === n) { row = i + 1; break; }
    const issued = row > 0 ? Number(lv[row - 1][3]) || 0 : 0;
    const due    = Math.floor(total / 10);            // 10個ごとに1回
    if (row < 0) {
      ledger.appendRow([n, total, last, due]);
    } else {
      ledger.getRange(row, 2).setValue(total);
      ledger.getRange(row, 3).setValue(last);
      ledger.getRange(row, 4).setValue(due);
    }
    if (due > issued) coupon.push(n + '(累計 ' + total + ' 個)');
  });

  if (coupon.length) {
    mail_('【スタンプ10個達成】クーポンを送るお客様',
          '次のお客様が10個に達しました。エルメの個別トークからクーポンを送ってください。\n\n' + coupon.join('\n'));
  }
}

// ===== 毎朝:今月の配信人数を合計し、無料枠に近づいたら知らせる =====
function monthlyPushCheck() {
  const ss   = SpreadsheetApp.getActiveSpreadsheet();
  const bake = ss.getSheetByName(SHEET_BAKE);
  if (!bake || bake.getLastRow() < 2) return;
  const ym   = Utilities.formatDate(new Date(), TZ, 'yyyy/MM');
  const rows = bake.getDataRange().getValues();       // A列=日付, E列=配信人数
  let total = 0;
  for (let i = 1; i < rows.length; i++) {
    if (rows[i][0] instanceof Date && Utilities.formatDate(rows[i][0], TZ, 'yyyy/MM') === ym) {
      total += Number(rows[i][4]) || 0;
    }
  }
  if (total >= WARN_AT) {
    mail_('【通数注意】今月の焼き上がり通知が ' + total + ' 通です',
          '無料枠は月 ' + FREE_LIMIT + ' 通です。残り ' + Math.max(0, FREE_LIMIT - total) + ' 通。\n' +
          '配信回数を減らすか、プランの切り替えを検討してください。');
  }
}

// ===== 補助 =====
function existingKeys_(sheet) {
  const out = {};
  if (sheet.getLastRow() < 2) return out;
  sheet.getRange(2, 4, sheet.getLastRow() - 1, 1).getValues().forEach(function (r) { if (r[0]) out[r[0]] = true; });
  return out;
}
function ymd_(v)    { return v instanceof Date ? Utilities.formatDate(v, TZ, 'yyyy/MM/dd') : String(v).slice(0, 10); }
function ymdhms_(v) { return v instanceof Date ? Utilities.formatDate(v, TZ, 'yyyy/MM/dd HH:mm:ss') : String(v); }
function mail_(subject, body) { MailApp.sendEmail(OWNER_MAIL, subject, body); }
タイムゾーンの確認:来店日の判定はGASプロジェクトのタイムゾーンに依存します。GAS画面「プロジェクトの設定」でタイムゾーンが (GMT+09:00) 東京 になっているか確認してください。ずれていると深夜の回答が前日の来店として数えられます。
◆ ◆ ◆

6. QRコードでスタンプを自動記録する

レジ横にQRコードを1枚置くだけです。お客様がスキャンするとエルメのスタンプフォームが開き、送信ボタンを押した瞬間に連携シートへ「回答日時・友だち名」が記録されます。それを章5のGASが10分おきに読み、来店日としてスタンプ記録と顧客台帳に写します。スタッフの操作は一切不要です。

① 全体の流れ

誰が何をするか自動/手動
お客様レジ横のQRコードをスマホで読む手動(お客様)
エルメスタンプフォームを開く(LINEでログイン済みなら名前は自動)自動
お客様送信ボタンを押す手動(お客様)
エルメ連携シート「スタンプ回答」に回答日時・友だち名を記録し、完了画面を表示自動
GAS10分おきに連携シートを読み、スタンプ記録と顧客台帳を更新自動
GAS10個達成のお客様が出たら店主へメール自動
店主エルメの個別トークからクーポンを送る手動(月数回)

② スタンプフォームを作る

操作場所:エルメ管理画面 > フォーム > 新規作成

  1. フォーム名を「スタンプ」にする。
  2. 質問を1つだけ作る。質問名 購入したパン、形式は選択式(食パン/クロワッサン/惣菜パン/菓子パン/バゲット/その他)、任意回答にする。
  3. 送信後の完了画面に「🎴 スタンプを押しました! 10個で100円引きクーポンをお送りします。またのご来店をお待ちしています😊」と入れる(完了画面の表示はLINEに送らないので通数を消費しない)。
  4. 回答後の自動返信メッセージは設定しない(設定するとPushになり、来店のたびに1通消費する)。
  5. フォーム一覧の「スプレッドシート」からGoogleアカウントを連携し、書き出し先のシート名を スタンプ回答 にする。
  6. フォームのURLをコピーする(次の手順で使う)。
質問が1つもないフォームは作れないため、「購入したパン」を任意で置いています。お客様は何も選ばず送信ボタンを押すだけでスタンプが付きます。

③ QRコードを作って設置する

  1. Googleで「QRコード 生成」と検索し、コピーしたフォームのURLを入力してQR画像を作る。
  2. A4やカードサイズで「🎴 お会計後に読んでスタンプ!」の文言と一緒に印刷し、レジ横に置く。
  3. 自分のスマホで読み、フォームが開いて送信できること、「スタンプ回答」シートに1行増えることを確認する。
  4. 10分待って(またはGASの importStamps を手動実行して)、「スタンプ記録」と「顧客台帳」に自分の名前が入ることを確認する。

④ 1日1個のルール

同じお客様が同じ日に2回送信しても、GASは「来店日の数」を累計にするので、1日に増えるスタンプは1個です。スタンプ記録には2行とも残るので、履歴として確認できます。

⑤ 10個達成のクーポン

  1. 店主のメールに「【スタンプ10個達成】」が届く。
  2. エルメ管理画面 > 友だちリスト でそのお客様を開き、個別トークから下のテンプレを送る(Push 1通)。
  3. お客様が来店したら、トーク画面を見せてもらい100円引きにする。使ったら顧客台帳のD列はGASが更新済みなので、何もしなくてよい。
🎉 スタンプ10個達成、ありがとうございます! 次回のお会計で【100円引き】になります。 レジでこの画面をお見せください🎁 またのご来店をお待ちしています😊
(QRを読んでフォームを送信)
🎉 スタンプ10個達成、ありがとうございます!

次回のお会計で【100円引き】になります。
レジでこの画面をお見せください🎁
10個目のあと、店主が個別トークから送る
累計を自動で返信したい場合:エルメのフォームの完了画面や自動返信には、お客様ごとの累計数を差し込む機能がありません。累計はスプレッドシートの顧客台帳で管理し、お客様には「10個達成時に店主からクーポンが届く」形にしています。
◆ ◆ ◆

7. 毎日の運用手順(スタッフ向け)

焼き上がり通知の手順(1日の流れ)

  1. パンが焼き上がる5分前に、スマホでエルメの一斉配信一覧を開く。
  2. そのパンの下書き「焼き上がり_◯◯」を複製し、曜日タグを今日の曜日に変える。
  3. 本文の時刻と在庫数を書き換え、対象人数を確認して「今すぐ配信」。
  4. 「焼き上がり記録」シートに、日付・パン名・時刻・在庫数・配信人数を1行書く。

通知タイミングの目安

パン名通知時刻の目安
🍞 食パン9:25頃
🥐 クロワッサン10:55頃
🥙 惣菜パン11:25頃
🍩 菓子パン13:55頃
🥖 バゲット15:25頃

スタンプカードの運用

  1. レジ横にQRコードを印刷して設置する(章6参照)。お会計のとき「QRを読むとスタンプが付きます」と一言添える。
  2. 「【スタンプ10個達成】」のメールが届いたら、エルメの個別トークからクーポンを送る(章6のテンプレ)。
  3. 月1回、顧客台帳を開き、同姓同名で1人にまとまっている人がいないか確認する。

うまく動かないときの確認ポイント

症状確認すること
配信の対象人数が0人条件が「パン種別タグ かつ 曜日タグ」になっているか。曜日タグが今日の曜日か。お客様が章1・章3でタグを付けているか(エルメの友だち情報で確認)。
配信の対象が全員になる絞り込み条件が外れている。下書きを複製したときに条件が残っているか確認。
特定の人にだけ届かないその人が「パン種別タグ」と「今日の曜日タグ」の両方を持っているか、エルメの友だち情報で確認。片方だけでは届かない。
配信できない・エラーになるLINE公式アカウントの月の通数上限に達している可能性。LINE Official Account Managerで残通数を確認(章8)。
QRを読んでもスタンプが付かない「スタンプ回答」シートに行が増えているか。増えていなければフォームのシート連携を確認。増えているのに記録されないなら、GASのトリガー登録と SHEET_LINKED のシート名を確認。
店主にメールが届かないOWNER_MAIL の誤り、または初回の権限承認をしていない。importStamps を手動実行し直す。
来店日が1日ずれるGASのタイムゾーンが東京になっているか(章5参照)。
◆ ◆ ◆

8. 費用と無料枠の注意(通数の試算)

この仕組みでお金がかかるのは、LINE公式アカウントとエルメの2つです。スプレッドシートとGASは無料です。

LINE公式アカウントの料金プラン

プラン月額(税別)無料メッセージ通数追加メッセージ
コミュニケーション0円200通不可
ライト5,000円5,000通不可
スタンダード15,000円30,000通可(〜3円/通・税別)

通数のカウントはPushかReplyかで決まる

「1通」は1人に届いて1通です。エルメから送るメッセージは、LINE公式アカウント側で「Push(数える)」と「Reply(数えない)」に分かれます。

この記事のメッセージ種類通数
ウェルカムのステップ配信(章1)Push友だち1人につき3通(登録時だけ)
曜日ボタン・リッチメニューへの返信(章3・4)Reply数えない
焼き上がり通知の一斉配信(章2)Push届いた人数ぶん
スタンプフォームの完了画面(章6)画面表示(LINEに送らない)数えない
10個達成のクーポン(章6)個別トーク=Push1通
店主への通知(章5)GASからメール数えない

この設計で消費する通数(焼き上がり通知がほぼすべて)

友だち数1配信あたりの対象(目安)1日5配信×25日合うプラン
20人2〜4人250〜500通ライト(無料枠は超える)
50人5〜10人625〜1,250通ライト
200人20〜40人2,500〜5,000通ライト〜スタンダード

パン種別と曜日で絞っているので対象は友だち全員の1〜2割程度ですが、毎日5回も配信すると無料枠では足りません。無料枠で回すなら、配信を「売り切れやすい人気商品だけ」「午前の1回だけ」に絞るのが現実的です。章5の monthlyPushCheck が160通を超えたときにメールで知らせます。

エルメの料金プラン

プラン月額(税込)この設計での適合
フリー0円フォームは3つまで、リッチメニューは2つまで。この設計はフォーム1本・リッチメニュー1枚で収まる
スタンダード10,780円友だちが250人を超える場合など
プロ33,000円友だちが数万人規模になったら
料金・無料枠・機能の範囲は改定されます。導入前に必ず各サービスの公式ページで最新の内容をご確認ください。
◆ ◆ ◆

まとめ

受信・タグ付け・配信はエルメ、記録と集計はスプレッドシート+GAS。この分担を守れば、焼き上がりの通知を「そのパンが好きで、その曜日に受け取りたい人」にだけ届け、スタンプもQR1枚で自動記録できます。

最初にやる1手:章1のウェルカムのステップ配信とタグ設定です。タグが付き始めれば、章2の配信はいつでも始められます。

※ 本記事は架空のパン屋を想定したサンプルの構築例です。掲載コードはサンプルであり、ご利用は自己責任でお願いします。