ブライダルのLINE公式アカウント:来館前・来館後・成約後でリッチメニューを切り替える設計
結婚
この
ブライダルの
株式会社bundlyzeでは、
式場とお二人の関係は、来館から挙式後まで続く
フィットネスや
その
状態を絞り、きっかけと記録する人を決める
最初に、
| 状態 | 変わる |
記録するのは | メニューの |
|---|---|---|---|
| 来館前 | 友だち追加 | 自動 |
フェアの |
| 来館の |
予約の確定 | 予約の |
当日の |
| 来館後・検討中 | 来館の受付 | 受付の |
見積もりの |
| 成約後 | 契約の記録 | 担当の |
打ち合わせの |
| 挙式後 | 挙式日を |
自動 |
写真や |
決めて
- 「来館前」は
ユーザー単位の 友だち追加したメニューを 使わない。 直後の 人には、 デフォルトの メニューを 出せば 足ります。 ユーザー単位で 結びつけるのは、 状態が 進んだ 人だけに します - 見送りに
なった 結びつけをお二人は、 デフォルトに 戻す。 解除すると、 デフォルトの メニューが 代わりに 表示されます - メニューは
人ごとではなく、 1つの状態ごとに 作る。 チャネルで 作れる リッチメニューは 最大1000件です。 お二人ごとに 名前入りの 画像を 作るような 設計は、 上限にも 運用にも 合いません
2人で1組:ユーザーIDを組にひも付ける
式場の
create table couples (
id text primary key,
stage text not null, -- before_visit / visit_booked / visited / contracted / after_wedding / closed
wedding_date date
);
create table couple_line_users (
couple_id text not null references couples(id),
line_user_id text not null unique, -- Webhook の source.userId
added_at timestamp not null,
primary key (couple_id, line_user_id)
);2人目を
切り替えは「計算して合わせる」処理を1つだけ持つ
状態が
const MENU_BY_STAGE: Record<string, string[] | null> = {
before_visit: null, // デフォルトのメニューに任せる
visit_booked: ['richmenu-visit-booked'],
visited: ['richmenu-visited'],
contracted: ['richmenu-prep', 'richmenu-contact'], // タブで切り替える2枚
after_wedding: ['richmenu-after'],
closed: null,
};
async function syncRichMenu(coupleId: string) {
const couple = await db.getCouple(coupleId);
const wanted = MENU_BY_STAGE[couple.stage];
for (const userId of await db.lineUsersOf(coupleId)) {
const current = await line.getUserRichMenuId(userId); // GET /v2/bot/user/{userId}/richmenu
if (wanted === null) {
if (current) await line.unlinkRichMenu(userId); // DELETE /v2/bot/user/{userId}/richmenu
continue;
}
// 同じ状態のタブのどれかが出ていれば、合っているとみなす
if (current && wanted.map(menuIdOf).includes(current)) continue;
await line.linkRichMenu(userId, menuIdOf(wanted[0])); // POST /v2/bot/user/{userId}/richmenu/{richMenuId}
}
}この
- 状態が
変わった :予約のとき 確定、 来館の 受付、 契約の 記録の 直後 - フォローイベントが
届いた :友だち追加と、とき ブロック解除の 両方 - 毎晩:挙式日を
過ぎた 組を 「挙式後」に 進めたうえで、 全組を 見直す
ユーザー単位で
ブロック中の人と、タブの扱いでつまずかない
運用に
ブロックしているfollow.isUnblocked が
タブで
まとめて替える場面では、APIを使い分ける
1組ずつ
| 場面 | 使うもの | 注意する |
|---|---|---|
| 1組の |
POST /v2/bot/user/{userId}/richmenu/{richMenuId} |
すぐに |
| 毎晩、 |
POST /v2/bot/richmenu/bulk/link |
1回で |
| 季節に |
POST /v2/bot/richmenu/batch(type: link で |
1時間にresumeRequestKey を |
季節の
メニューの画像には、お二人の情報を入れない
状態ごとの
個別の
出典(LINEの公式資料)
記載は
- ユーザー単位で
出すメニュー (即時の(LINE Developers の 解説) 反映、 解除すると デフォルトが 表示される) - メニューの
表示の (表示の優先順位と 反映 (LINE Developers の 解説) 優先順位、 反映される タイミング) - エイリアスを
使った (エイリアスとタブ (LINE Developers の 解説) 切り 替えの アクション) - Messaging API の
仕様一覧 (作成の(LINE Developers の リファレンス) 上限1000件、 複数人への 結び つけは 最大500人で 非同期、 一括 操作は 1時間に 3回・ resumeRequestKeyは14日、 ブロック中の 人の 扱い、 follow.isUnblocked) - LIFF で
利用者を (IDトークンを確かめる (LINE Developers の 解説) 送り、 受け取った 側で 検証する) - 管理画面での
メニューの (管理画面で作り方 (LINEヤフーの 事業者向けマニュアル) 作る メニュー)
よくある質問
お二人のうち片方しか友だち追加していない場合、メニューはどうなりますか?
友だち追加していない
来館したかどうかは、どうやってシステムに伝えればいいですか?
受付の
メニューの画像を季節ごとに替えたいときは、全員を結びつけ直す必要がありますか?
ありません。