LINE 綁定 + LINE Pay 每月捐款 — 狀態地圖

每個使用者只缺三樣東西中的某幾樣。找到缺口,補上它。

C
Contact ID
CRM 身份識別 — 知道你是誰
L
LINE User ID
通訊管道 — 能聯繫到你
$
LINE Pay 每月捐款
持續支持 — 每月自動捐款

狀態矩陣

每個狀態直接顯示缺口與行動方案。

沒有 LINE ID
有 LINE ID
沒有
Contact
什麼都沒有
S0
陌生人
缺 Contact 缺 LINE 缺捐款
有 LINE,可能已在 CRM 但未配對
S43-6 萬人
LINE 好友
可能有 Contact(未配對) LINE ✓ 缺捐款
有 Contact
未捐款
支持者,沒有 LINE
S1
支持者(連署/活動/Email)
Contact ✓ 缺 LINE 缺捐款
支持者,已綁定 LINE
S5
已綁定,未捐款
Contact ✓ LINE ✓ 缺捐款
有 Contact
有捐款
捐款人,沒有 LINE
S2
單次捐款人
Contact ✓ 缺 LINE 單次捐款
S3
每月捐款人(CC)
Contact ✓ 缺 LINE CC→需轉 LINE Pay
S3-LP差一步!
每月捐款人(LINE Pay),未綁 LINE
Contact ✓ 缺 LINE ← 只差這個 LINE Pay ✓
捐款人,已綁定 LINE
S6
已綁定 + 單次捐款
Contact ✓ LINE ✓ 單次→需轉月捐
S7
已綁定 + 每月捐款(CC)
Contact ✓ LINE ✓ CC→需轉 LINE Pay
S8 🎯目標
已綁定 + 每月捐款(LINE Pay)
Contact ✓ LINE ✓ LINE Pay 月捐 ✓

LINE 綁定方法總覽

9 種綁定方法 × 不同使用者狀態。每種方法的技術流程、觸發方式、適用對象一覽。

方法 流程 技術
可行性
使用者
摩擦力
開發
工作量
適用對象 注意事項
A 感謝頁 LINE 綁定按鈕 LINE 推普通 URL → 捐款 → 感謝頁 按鈕 → LIFF 取 LINE ID → 綁定
⚡ 同意畫面在捐款「之後」才出現
支持者、捐款人
月捐人、LINE好友
跟 B 的差別只是順序:
A = 先捐款,後問 LINE 同意
B = 先問 LINE 同意,再捐款
A 不需改捐款頁,工作量更低
B LINE 內直開捐款頁 ⭐ LINE 推 LIFF URL → 打開頁面立刻問 LINE 同意 → 取 LINE ID → 使用者捐款 → 送出時一起綁定
⚡ 同意畫面在捐款「之前」就出現
最低 所有從 LINE 進來的人 跟 A 的差別只是順序:
B = 先問 LINE 同意,再捐款
A = 先捐款,後問 LINE 同意
B 需改捐款頁前端加 LIFF SDK
非 LINE 環境自動跳過
C Email LINE 綁定連結 + QR Code Email 含 LINE 綁定按鈕 + QR Code
手機點連結 → LINE 開啟 LIFF → 綁定
桌機 → 掃 QR Code → 同上
支持者、捐款人
月捐人(CC/LP)
手機點 liff.line.me → LINE 自動開啟 ✅
桌機點 → 瀏覽器開,體驗差 → 需 QR 備援
URL 帶 contact_id 參數
⬇ 需使用者自己輸入資料比對 CRM(無 contact_id 的場景)
D LINE 內填表綁定 LINE 好友 → LIFF 表單 → 自動取 LINE ID → 使用者填 email/手機 → 比對 CRM → 綁定 需輸入 LINE 好友 核心綁定表單,其他方法都指向這裡
比對不到 → 建新 Contact
需個資同意聲明
E LINE 群發綁定請求 群發訊息含 LINE 綁定連結 → 使用者點擊 → 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:群發推播
3-6萬人群發會超額度 💰
建議分批 or Narrowcast
F Rich Menu 常駐按鈕 LINE 底部選單永久放「我的帳號」→ 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:常駐按鈕
零成本 · 24/7 · 使用者主動
G 加好友歡迎訊息 加好友 → 自動推歡迎訊息含 LINE 綁定連結 → 進入 D 填表綁定 需輸入 LINE 新好友 觸發方式:加好友自動
只有一次機會,搭配 F 後備
I 推播文章文末 CTA 推播內容文章 → 文末 CTA → 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:文章內嵌
不需額外成本,每篇都帶
⬇ 客服輔助綁定
H 電話客服 → SMS+Email 使用者來電 → 客服問 email/手機 → 查 CRM 找到 contact_id → 發 SMS + Email 含 LINE 綁定連結(帶 cid)→ 使用者點開 → LINE 開啟 → 一鍵綁定 任何來電且在 CRM
的使用者
走有 cid 路徑(零輸入)
SMS + Email 雙管道確保送達
需 SMS 發送能力

綁定方法 × 使用者狀態 適用矩陣

● = 主要方法 · ○ = 可用但非首選 · — = 不適用

方法 \ 適用對象 陌生人 支持者
連署/活動/Email
單次
捐款人
每月
捐款人
(CC)
每月
捐款人
LINE Pay
LINE
好友
A 感謝頁 LINE 綁定按鈕
主動捐/簽
B LINE 內直開 ⭐
C Email LINE 綁定連結
如也在CRM
D LINE 內填表
E LINE 群發
F Rich Menu 按鈕
G 歡迎訊息
I 文章文末 CTA
H 電話→SMS+Email
如也在CRM
核心觀察
有 Contact 沒 LINE 的人 (S1/S2/S3/S3-LP):用方法 A (感謝頁) 和 C (Email) — 因為你有他們的 contact_id 可帶入 LIFF URL
有 LINE 的人 (S4):可能同時在 CRM!如果在 → 用 A/C/J(零輸入);如果不在 → 用 D/E/F/G/H/I(填表比對)
什麼都沒有的人 (S0):方法 B (LINE 內直開) 是唯一能一步完成的 — 黃金路徑
所有方法共用同一個 LIFF 綁定頁 — BJ 只需要做一個頁面 + 一個後端 API,差別只在入口和帶的參數不同

綁定流程圖 — 根據「已知什麼」決定流程

核心原則:已知 contact_id 的場景 → 使用者零輸入,一鍵確認。只有 S4 才需要填表。

流程 1:方法 A — 感謝頁 跳轉綁定(+ 方法 C Email 同理) 捐款/連署完成後,在 感謝頁 引導使用者綁定 LINE。方法 C (Email) 同理。 1. 使用者完成捐款/連署 產生 contact_id 2. 感謝頁 顯示綁定按鈕 「加入 LINE 好友,獲得個人化服務」 按鈕連結 = LIFF URL 帶 contact_id 使用者點擊 3. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 4. LIFF 綁定頁 — 確認畫面 LINE 頭像 ↔ CRM 姓名(模糊化) 零輸入,按「確認綁定」即可 5. 綁定完成 ✓ 方法 C (Email) 同樣流程 差別只是入口:Email 裡的 LINE 綁定按鈕 + QR Code 同樣帶 contact_id → 同樣零輸入確認 流程 2:方法 B — LINE 內直開捐款頁 ⭐ 從 LINE 推播直接用 LIFF URL 開啟捐款頁。先問 LINE 同意,再捐款,最後確認綁定。 1. LINE 推播 LIFF URL 捐款連結 使用者在 LINE 內點擊 2. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 3. 顯示捐款表單 使用者填表完成捐款(LINE ID 已在背景取得) 4. 感謝頁 — 確認綁定 「要用這個 LINE 帳號接收通知嗎?」 顯示 LINE 頭像 + 名稱,使用者按確認 5. 綁定完成 ✓ A 與 B 的差別 A = 先捐款 → 後問 LINE 同意 → 確認綁定 B = 先問 LINE 同意 → 再捐款 → 確認綁定 B 需改捐款頁前端加 LIFF SDK 非 LINE 環境自動跳過,不影響一般使用者 流程 3:方法 H — 電話/訊息客服 → SMS + Email 綁定 使用者來電或傳訊息,內部人員查 CRM 後發綁定連結。不需拿到 LINE ID。 1. 使用者來電/傳訊息 提供 email 或手機 2. 內部人員查 CRM 用 email/手機找到 contact_id 3. 發送 SMS + Email 內含 LINE 綁定連結(帶 contact_id) 雙管道確保送達 4. 使用者點連結 → LINE 開啟 同意畫面(僅第一次)→ 確認綁定 5. 綁定完成 ✓ 方法 H 的關鍵優勢 不需在 MAAC 搜 LINE 好友(搜不到),不需知道 LINE ID LINE 綁定連結帶 contact_id → 使用者點開後自動配對 → 零輸入綁定 流程 4:方法 D / E / F / G / I — LINE 內填表綁定 使用者在 LINE 內,我們不知道他是 CRM 裡的誰,需要使用者填 email 或手機比對 D 填表 E 群發 F Rich Menu G 歡迎訊息 I 文章文末 ← 全部導向同一個 LIFF 綁定頁 ↓ 1. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 2. LIFF 綁定頁 — 填寫資料 LINE 頭像已自動取得 使用者輸入 email 或手機(只需一個欄位) CRM 比對 找到 3a.「是 陳O明 嗎?」 顯示姓名模糊化 → 使用者按確認 4. 綁定完成 ✓ 找不到 3b. 建新 Contact + 自動綁定 LINE ID 多筆 3c. 二次驗證 姓名末字確認 → 綁定

LIFF 綁定頁 — 完整決策流程圖

單頁漸進式 · Greenpeace 品牌 · 手機優先 · 預設用手機號碼搜尋

flowchart TD Start(["使用者點擊 LINE 綁定連結"]) Start --> S1 subgraph INIT ["入口 + 授權"] S1["① LINE 同意授權\n(僅第一次)"] end S1 --> HasCID{URL 帶\ncontact_id?} subgraph PATH_A ["路徑 A:有 contact_id(零輸入)"] S2["② 確認綁定\nLINE 頭像 ↔ CRM 姓名"] end subgraph PATH_B ["路徑 B:沒有 contact_id(需輸入)"] S3["③ 填寫手機號碼\n(可切換 email)"] S3 -->|送出| Match{CRM\n比對結果} Match -->|1 筆| S4["④ 確認身份\n是 陳O明 嗎?"] Match -->|0 筆| S6["⑥ 建立新帳號"] Match -->|多筆| S5["⑤ 輸入姓氏"] S5 -->|縮到 1 筆| S4 S5 -->|仍多筆/0筆| Choose{選擇} Choose -->|建立新帳號| S6 Choose -->|📞 致電客服| End1(["客服處理"]) end HasCID -->|有| S2 HasCID -->|沒有| S3 S2 -->|確認| Success S2 -.->|不是我| S3 S4 -->|是我| Success S4 -.->|不是我| S5 S4 -.->|重新輸入| S3 S6 -->|送出| Success Success(["✅ 綁定成功"]) Success --> IsDonor{有捐款\n紀錄?} IsDonor -->|有| S7a["⑦a 成功\n+ 推月捐"] IsDonor -->|沒有| S7b["⑦b 成功\n感謝綁定"] style Start fill:#1a1a2e,stroke:#1a1a2e,color:#fff style Success fill:#16a34a,stroke:#16a34a,color:#fff style End1 fill:#666,stroke:#666,color:#fff style S1 fill:#f0fdf4,stroke:#22c55e,color:#111 style S2 fill:#f0fdf4,stroke:#22c55e,color:#111 style S3 fill:#fce7f3,stroke:#ec4899,color:#111 style S4 fill:#f0fdf4,stroke:#22c55e,color:#111 style S5 fill:#fef3c7,stroke:#f59e0b,color:#111 style S6 fill:#fef3c7,stroke:#f59e0b,color:#111 style S7a fill:#f0fdf4,stroke:#66cc00,color:#111 style S7b fill:#eff6ff,stroke:#3b82f6,color:#111 style INIT fill:#f8fafc,stroke:#94a3b8,color:#111 style PATH_A fill:#f0fdf4,stroke:#86efac,color:#111 style PATH_B fill:#fdf2f8,stroke:#f9a8d4,color:#111

錯誤 & 衝突流程

觸發來源 條件 顯示畫面 使用者出路
① LINE 同意授權 LIFF init 失敗 ⑧ 錯誤提示:「請從 LINE 內開啟」+ QR Code 掃 QR 加好友 / 致電客服
② 確認綁定 綁定衝突 ⑨ 衝突提示:帳號已綁其他 LINE 📞 撥打客服 / 重新開始
④ 確認身份 綁定衝突 ⑨ 衝突提示:LINE 已綁其他帳號 📞 撥打客服 / 重新開始
🟢 零輸入(有 contact_id)
🩷 需使用者輸入
🟡 比對/建帳號
🔴 錯誤/衝突
導航規則:每個畫面都有「上一步」可回退 · 「不是我」回到填表重新輸入 · 找不到時提供建立新帳號 + 客服電話 · 全程只有電話客服

畫面 ① LINE 同意授權 僅第一次

9:41LINE
GP
Greenpeace Taiwan
想要存取你的
LINE 個人資料
包含:顯示名稱、大頭貼照
取消
允許

LINE 原生授權畫面

LINE 平台控制無法自訂

LINE 原生畫面,第一次開啟 LIFF 才出現。允許後 SDK 取得 LINE User ID + 顯示名稱。第二次以後不再顯示。

按「取消」→ 顯示提示需要授權 + 重試按鈕。

畫面 ② 確認綁定 零輸入

9:41LINE

綁定 LINE 帳號

確認以下資訊是否正確

😊
陳小明
你的 LINE 帳號
👤
陳O明
ch***@gmail.com · 會員資料
我同意個人資料蒐集與利用聲明,將 LINE 帳號與會員資料綁定。
確認綁定
不是我的帳號
需要協助?致電 02-2361-2025

確認綁定(零輸入)

有 contact_id方法 A / C / H

從 Email、感謝頁、SMS 進來。URL 帶 contact_id,後端查 CRM 回傳模糊化資料。使用者只按「確認」。

「不是我」→ 進入畫面 ③ 用手機重新比對。

畫面 ③ 填寫手機號碼 需輸入

9:41LINE

綁定 LINE 帳號

讓我們找到你的會員資料

步驟 1 / 2
← 上一步
😊
陳小明
LINE 帳號(已自動偵測)
手機號碼
Email
手機號碼
0912-345-678
請輸入你註冊時使用的手機號碼
我同意個人資料蒐集與利用聲明
查詢並綁定
需要協助?致電 02-2361-2025

填寫手機號碼(預設)

方法 D / E / F / G / I「不是我」回退

預設手機號碼(大家通常用同一組),可 Tab 切換到 email。

· 步驟指示「1/2」· 說明原因 · 只需一個欄位 · 上一步可回退

畫面 ④ 確認身份 1 筆   ⑤ 輸入姓氏 多筆

9:41LINE

確認你的帳號

我們找到一筆符合的資料

步驟 2 / 2
← 重新輸入手機 / email
陳O明
091*****78 · ch***@gmail.com
😊
陳小明
你的 LINE 帳號
是我,確認綁定
不是我
需要協助?致電 02-2361-2025
9:41LINE

需要更多資訊

請輸入姓氏幫助我們找到你

← 重新輸入手機 / email
你的姓氏
例如:陳、林、王
查詢
找不到你的帳號?
建立新帳號
或致電客服 02-2361-2025

畫面 ⑥ 建立新帳號 CRM 找不到

9:41LINE

建立新帳號

填寫資料完成綁定

← 上一步
😊
陳小明
你的 LINE 帳號
*
*
小明
Email *
chen@gmail.com
手機號碼 *
0912-345-678
出生年月 *
1990-03
格式:YYYY-MM
我同意個人資料蒐集與利用聲明,授權綠色和平蒐集、處理及利用我的個人資料。
建立帳號並綁定 LINE
需要協助?致電 02-2361-2025

建立新帳號

欄位順序:姓 → 名 → Email → 手機 → 出生年月

預填:畫面 ③ 的手機/email、畫面 ⑤ 的姓氏自動帶入。

個資同意:必勾才能送出。

畫面 ⑦a 成功 + 月捐   ⑦b 成功

9:41LINE
綁定成功!
LINE 已與會員帳號連結
捐款通知 · 電子收據 · 活動資訊
🌍 每月定期捐款,守護地球
使用 LINE Pay 每月自動捐款
了解每月捐款 →
9:41LINE
綁定成功!
LINE 已與會員帳號連結
議題進展 · 活動通知 · 專屬資訊
關注更多議題
回到 LINE 查看最新消息

⑦a 捐款人版(左)· ⑦b 支持者版(右)

⑦a:有捐款紀錄 → LINE Pay 月捐 CTA。串聯策略,動力最高。

⑦b:沒有捐款紀錄 → 不推月捐。引導回 LINE。

畫面 ⑧ 錯誤   ⑨ 衝突

9:41Safari

請從 LINE 開啟

📱
此頁面需要從 LINE 內開啟
請用手機開啟 LINE App
搜尋「綠色和平」加入好友
QR Code
致電 02-2361-2025
9:41LINE

需要客服協助

此帳號已綁定其他 LINE
如需更換綁定,請聯繫客服。
客服電話
02-2361-2025
週一至週五 10:00-18:00
📞 撥打電話
重新開始

⑧ 錯誤(左)· ⑨ 衝突(右)

⑧:非 LINE 環境,提供 QR Code + 引導 + 客服電話

⑨:綁定衝突,「📞 撥打電話」按鈕直接撥號 + 重新開始

綁定技術流程 — 完整時間線

使用者按下按鈕到綁定完成,每一秒發生什麼事。

時間
系統發生什麼
使用者看到什麼
0s
使用者按 感謝頁 / Email / SMS 裡的 LINE 綁定按鈕
按鈕
0.5s
瀏覽器跳轉到 liff.line.me/xxx?cid=token
LINE 平台接手處理 redirect
短暫白畫面 / LINE loading
1s
LINE 檢查是否已授權過此 LIFF app
僅第一次:LINE 同意畫面
「允許存取你的個人資料?」
使用者按「允許」
1.5s
LINE redirect 到 Endpoint URL
LIFF SDK 開始載入,執行 liff.init()
LIFF 綁定頁開始載入
2s
liff.getProfile() 取得 LINE ID + 名稱 + 大頭照
同時用 URL 裡的 cid 呼叫後端 API 查 CRM
載入中 spinner
2.5s
兩邊資料都拿到了
前端組合顯示確認畫面
看到 LINE 頭像 + CRM 姓名
「確認綁定?」
3s
使用者按「確認綁定」
前端 POST /api/bindline
按下確認按鈕
3.5s
後端解密 token → 取得 contact_id
呼叫 HubSpot API 更新 Contact 寫入 LINE ID
短暫載入
4s
HubSpot 回傳成功
後端回傳 { success: true }
「綁定完成!」
+ 每月捐款(LINE Pay) CTA
整個流程 4 秒,使用者只做了一個動作:按「確認綁定」。

模擬畫面

使用者在 LINE 裡看到的實際畫面。左 = 手機模擬,右 = 技術說明。

場景 1:有 contact_id(方法 A / C / J)— 零輸入

Greenpeace Taiwan
LINE 帳號綁定
綁定你的 LINE 帳號
😊
陳小明
你的 LINE 帳號
👤
陳O明
ch***@gmail.com · 會員資料
確認將這兩個帳號綁定?
✓ 確認綁定
綁定後可透過 LINE 收取個人化訊息與捐款通知

技術說明

LINE 資料(自動取得,綠色卡片):
liff.getProfile() 回傳 userId, displayName, pictureUrl
使用者不需操作,LIFF SDK 自動取得。

CRM 資料(後端查詢,藍色卡片):
前端從 URL 取得 ?cid=encrypted_token
呼叫 GET /api/contact-preview?token=xxx
後端解密 → 查 HubSpot → 回傳模糊化姓名 + email

為什麼要模糊化?
安全性 — 如果有人拿到別人的 LIFF URL,看到的也只是「陳O明」和「ch***@gmail」,無法確認是否正確,不會按確認。

API Request — 按確認後

POST /api/bindline { "token": "aGVsbG8...", // 加密的 contact_id "lineUserId": "Uab3c4d5e...", // LIFF SDK 取得 "source": "thankyou_page" // 追蹤來源 }

後端處理

// 1. 解密 token → contact_id = 12345 // 2. 呼叫 HubSpot API PUT /crm/v3/objects/contacts/12345 { "properties": { "line_user_id": "Uab3c4d5e..." } } // 3. 回傳 { success: true }

場景 2:沒有 contact_id(方法 D / E / F / G)— 填一個欄位

🔒 資料保護原則(貫穿所有情境)
絕不回傳完整個資 — 前端只顯示遮罩資料(g****e@gmail.com09xx-xxx-456
後端做比對,前端做確認 — 前端只拿到 match_count + 遮罩提示,永遠不拿到原始值
API 不回傳 contact_id — 使用者確認後,後端直接用 session 內比對結果完成綁定
Rate limit — 同一 LINE ID 每小時最多查 5 次,防暴力列舉。超過顯示「嘗試次數過多,請稍後再試」

Step 0:填表入口

Greenpeace Taiwan
會員帳號綁定
綁定你的會員帳號
😊
陳小明
你的 LINE 帳號(已自動偵測)
Email
chen@gmail.com
手機號碼
0912345678
查詢並綁定

技術說明

LINE 資料(自動取得):同場景 1,liff.getProfile()

CRM 資料(使用者填寫比對):
URL 沒有 cid 參數 → 前端切換到「填表模式」
使用者只需填 email 或手機(二選一),不需填姓名。

API Request — 查詢

POST /api/bindline/lookup { "matchBy": "email", "matchValue": "chen@gmail.com", "lineUserId": "Uab3c4d5e...", "source": "richmenu" }

API Response 分流

// match_count = 1 → 情境 A { "match_count": 1, "masked_hint": "g****e@gmail.com", "session_token": "abc123..." } // match_count >= 2 → 情境 B { "match_count": 3 } // match_count = 0 → 情境 C { "match_count": 0 }

情境 A:查到 1 筆 Contact ✓(最常見 happy path)

Greenpeace Taiwan
確認身份
🔍
找到你的帳號
😊
陳小明
LINE 帳號
📧
g****e@gmail.com
會員帳號(遮罩顯示)
確認是我,完成綁定
不是你的帳號?重新輸入

流程

後端查到恰好 1 筆 → 回傳遮罩後的 email/手機讓使用者確認 → 按「確認」→ 綁定。

注意:前端只拿到 masked_hint,不知道完整 email 或 contact_id。

API — 確認綁定

POST /api/bindline/confirm { "session_token": "abc123...", "lineUserId": "Uab3c4d5e..." } // 後端用 session_token 找到之前的比對結果 // 直接寫入 LINE ID → Contact,前端不經手 CRM ID
情境 A — Edge Cases
Greenpeace Taiwan
⚠️
此帳號已綁定另一個 LINE
如需變更綁定,請聯繫客服協助處理。
聯繫 LINE 客服
Edge A-1:Contact 已綁另一個 LINE ID
後端偵測 Contact 的 LINE ID 欄位已有值且不同。
不自動覆蓋,避免帳號搶奪。引導聯繫客服人工處理。
Greenpeace Taiwan
⚠️
你的 LINE 已綁定另一帳號
目前綁定:x****z@gmail.com
如需變更,請聯繫客服。
聯繫 LINE 客服
Edge A-2:LINE ID 已綁另一個 Contact
後端偵測此 LINE ID 已存在於另一筆 Contact。
顯示已綁定的遮罩 email 供使用者辨識。
同樣不自動覆蓋,防止一 LINE 亂綁多人。
Greenpeace Taiwan
🔄
綁定時發生錯誤
請稍後再試一次。
重試
Edge A-3:API 逾時 / 失敗
顯示重試按鈕。
後端需做冪等處理:重複送出同一對 (LINE ID, contact_id) 不報錯、無副作用。

情境 B:查到 2+ 筆 Contact(需進一步驗證)

Greenpeace Taiwan
身份驗證
🔐
需要更多資訊驗證身份
為保護你的帳號安全,
請提供額外資訊完成驗證。
✓ 已收到你的 Email
手機號碼(追加驗證)
0912345678
驗證身份
跳過,直接建立新帳號

流程

不顯示任何比對結果清單。攻擊者可輸入猜測的 email,利用清單確認某人是否為 GP 支持者 — 這本身就是資料洩漏。

引導使用者填入第二個欄位縮小範圍:

• 第一欄填 email → 追問手機
• 第一欄填手機 → 追問 email

二次比對結果分流

→ 縮到 1 筆 → 走情境 A(確認綁定)
→ 仍 2+ 筆 → 引導客服
→ 變 0 筆 → 提供建立新帳號

為什麼不讓使用者從清單選?

顯示多筆遮罩資料(姓名首字、捐款紀錄)= 洩漏「這些人都用這個 email」。即使遮罩也能拼湊出身份資訊。

前端完全不顯示多筆結果的任何細節,只引導到「提供更多資訊」或「聯繫客服」。
情境 B — Edge Cases
Greenpeace Taiwan
💬
仍無法確認身份
請聯繫客服,我們將協助你完成綁定。
聯繫 LINE 客服
直接建立新帳號
Edge B-1:二次比對仍 2+ 筆
兩個欄位交叉比對後仍無法鎖定唯一 Contact → 引導客服。
同時提供「直接建立新帳號」選項,未來由客服在 CRM 端合併。
Edge B-2:使用者不願提供第二欄位
提供「跳過,直接建立新帳號」選項。
後端建新 Contact(只有 email/手機 + LINE ID),未來可合併。
重點:不能讓使用者卡住。任何情況都必須有出路。

情境 C:查到 0 筆 Contact(新使用者)

Greenpeace Taiwan
建立帳號
👋
歡迎加入!
沒有找到既有帳號,
我們將為你建立新帳號並完成 LINE 綁定。
😊
陳小明
LINE 帳號
📧
chen@gmail.com
將作為你的會員 Email
⚡ 確認 email 正確嗎?輸入錯誤可能導致無法收到後續通知。
確認建立帳號並綁定
重新輸入

流程

CRM 裡沒有這個 email/手機 → 建立全新 Contact(只有 email/手機 + LINE ID),其他欄位待後續互動補齊。

這是 S4 → S5a 的典型路徑。

Edge Cases

C-1:使用者打錯 email/手機
提供「重新輸入」連結 + 黃色提示確認 email 正確。避免建立錯誤 Contact 後無法收通知。
C-2:使用者有 CRM 帳號但用了不同 email(假的 0 筆)
後端建新 Contact → CRM 出現重複記錄。這是可接受的
(1) 不能為防重複而阻止綁定;(2) CRM 可事後用 de-duplicate 工具合併,LINE ID 直接移到主記錄。
C-3:純路人加 LINE 好友(完全沒有 CRM 帳號)
與 happy path 相同,建全新 Contact。這是最常見的 S4→S5a 路徑。

情境 D:系統 / 網路異常

CRM API 無回應 / 500
「系統忙碌中,請稍後再試。」
+ 重試按鈕
+ 倒數 30 秒自動重試一次
LIFF init 失敗
「無法取得你的 LINE 資訊,請確認從 LINE App 內開啟此頁面。」
LINE 外開啟 LIFF URL
導向提示頁「請在 LINE 中開啟」
+ LINE 深度連結按鈕
格式不合法
即時前端驗證,不送 API。
「請輸入有效的 email」
「請輸入 09 開頭的手機號碼」
Rate Limit 觸發
同一 LINE ID 每小時 > 5 次查詢
「嘗試次數過多,請稍後再試。」
隱藏輸入欄位,只顯示等待提示
LINE ID 已綁定(進入填表前)
LIFF init 後先檢查 LINE ID 是否已綁定
→ 已綁定:跳過填表,直接顯示「你已完成綁定」
場景 2 — 完整決策流程圖
使用者開啟 LINE 綁定頁 LINE 同意畫面(僅第一次)→ 取得 LINE ID LINE ID 已綁定? 已綁定 顯示「你已完成綁定」 未綁定 使用者填 email 或手機 → 送出 CRM 比對結果 找到 1 筆 「是 陳O明 嗎?」 使用者按確認 → 綁定成功 ✓ 衝突:Contact 已綁另一 LINE 或 LINE 已綁另一 Contact → 轉客服 找到 0 筆 建立新 Contact + 綁定 LINE ID ✓ 找到多筆 追問第二欄位(手機或姓名末字) 結果 縮到 1 走確認流程 ✓ 仍多筆/跳過 建立新 Contact + 綁定 API 錯誤 → 重試

場景 3:綁定成功 → 順推 每月捐款(LINE Pay)

Greenpeace Taiwan
綁定成功!
你的 LINE 已與會員帳號連結。
未來會透過 LINE 收到:
· 捐款進度通知
· 電子收據
· 專屬活動資訊

🌍 每月 $100 起,守護地球

成為每月捐款人 →

P3-PG2:動力最高的轉換點

使用者剛完成綁定,心理動力最高。此頁面同時做兩件事:

1. 確認綁定成功 — 告訴使用者綁定帶來的好處
2. 順推 每月捐款(LINE Pay) — 串聯策略,不是並列

這個頁面是整個轉換漏斗中轉換率最高的位置,因為使用者剛做完一個「同意」的動作,延續這個動力推月捐,接受度最高。

點「成為每月捐款人」後

導向 每月捐款(LINE Pay)頁面。技術方案取決於建廠的 API:

方案說明
LIFF 內完成在 LIFF 頁面直接完成 LINE Pay 簽約(需建廠確認 Q5)
導到外部頁面跳轉到捐款頁,預選 LINE Pay + 月捐

安全性設計

防止 URL 竄改、重複綁定、API 濫用。

風險處理方式實作
URL 裡的 contact_id 被竄改 用加密 token,不是裸的 ID cid = encrypt(contact_id + timestamp + secret)
後端解密驗證
token 被截取重複使用 設 30 分鐘過期 + 一次性使用 token 含時間戳,使用後標記為已用
用自己的 LINE 綁到別人帳號 顯示模糊化資訊讓使用者確認 「陳O明 · ch***@gmail」— 不對的人不會按確認
API 被自動化攻擊 Rate limiting 每 LINE ID 每小時最多 5 次請求
個資法合規 綁定頁加同意勾選 「我同意個資蒐集與利用聲明」+ 連結

LIFF URL 結構 — 各場景的 URL 長怎樣

場景LIFF URLcid 來源
A 感謝頁 按鈕 liff.line.me/xxx?cid={token} 感謝頁 後端動態產生 token
B LIFF 捐款頁 liff.line.me/xxx/donate 不需要 — 表單送出時一起建立
C Email liff.line.me/xxx?cid={token} HubSpot template: {{contact.token}}
D/E/F/G LINE 內 liff.line.me/xxx 沒有 cid — 切換到填表模式
J SMS liff.line.me/xxx?cid={token} 客服觸發系統產生 token

LIFF 綁定頁判斷邏輯

liff.init({ liffId: 'xxx' }).then(async () => { const profile = await liff.getProfile(); const cid = new URLSearchParams(location.search).get('cid'); if (cid) { // 有 cid → 查 CRM → 顯示確認畫面(場景 1) const contact = await fetch(`/api/contact-preview?token=${cid}`); showConfirmScreen(profile, contact); } else { // 沒有 cid → 顯示填表畫面(場景 2) showInputScreen(profile); } });

後端 API 規格

BJ 需要開發的 API endpoints。

1. GET /api/contact-preview

用加密 token 查 CRM,回傳模糊化資料供前端顯示。

參數說明
token加密的 contact_id,30 分鐘過期
// Response { "maskedName": "陳O明", "maskedEmail": "ch***@gmail.com", "valid": true }

2. POST /api/bindline

執行綁定。兩種模式:有 token(直接綁)或 比對模式(查 email/phone)。

// 模式 1:有 token { "token": "xxx", "lineUserId": "Uabc...", "source": "thankyou_page" } // 模式 2:比對 { "matchBy": "email", "matchValue": "chen@gmail.com", "lineUserId": "Uabc...", "source": "richmenu" }
// Response { "success": true, "matched": true, // 比對模式才有 "maskedName": "陳O明", // 比對模式:讓前端確認 "needConfirm": true, // 比對模式:需使用者再按確認 "multipleResults": false // 是否有多筆結果 }

3. POST /api/generate-bind-token

客服 / 系統用,產生加密的一次性綁定 token(用於方法 J SMS 場景)。

// Request { "contactId": "12345" } // Response { "token": "aGVsbG8...", "liffUrl": "https://liff.line.me/xxx?cid=aGVsbG8...", "expiresAt": "2026-03-23T12:30:00Z" }

設計研究依據

基於 2026-03 業界研究,涵蓋訂閱管理 UX best practices。

狀態卡片 + 功能列表
78% 的 mobile SaaS 採用 stacked card 佈局。Apple/Netflix/Spotify/LINE 設定頁面均採用此模式。列表模式擴展性好,新增功能只加一行入口。
暫停優先的取消流程
25% 的取消者會改為暫停(Recurly 研究)。34% 表示簡單折扣就能留住、34% 表示更低價格(UX Magazine)。取消流程依序:暫停 → 降金額 → 確認取消。
透明計費建立信任
清楚顯示扣款歷史、下次扣款日、金額。簡單的取消流程反而提高回訂率 — 隱藏取消會破壞信任。失敗付款的 dunning management 可恢復 15-40%。
影響力回饋 + 連結感
NGO 特有策略:讓捐款人看到「你的捐款幫助了什麼」顯著提高續捐率。暫停/取消流程嵌入影響力回顧增加決策摩擦力。

主頁面 — 狀態卡片 + 功能列表

入口:Rich Menu →「我的帳號」→ LIFF 會員中心。LIFF 自動取 LINE ID → 後端查 Contact → 顯示訂閱資料。

扣款中(正常狀態)

我的月捐
LINE Pay 每月捐款
NT$500
扣款中
上次請款
03/15
NT$500 ✓
下次請款
04/15
22 天後
累計捐款
NT$6,000
12 次
📋
請款紀錄
查看近期扣款明細
✏️
修改捐款金額
調整每月捐款金額
⏸️
暫停月捐
暫停 1-3 個月,到期自動恢復
取消月捐
停止所有定期扣款
需要協助?聯繫客服

已暫停狀態

我的月捐
LINE Pay 每月捐款
NT$500
⏸ 已暫停
06/15 自動恢復扣款
暫停期間 04/15 - 06/15
上次請款
03/15
恢復日期
06/15
累計捐款
NT$6,000
立即恢復月捐
不等到 06/15,現在就恢復
📋
請款紀錄
✏️
修改捐款金額
恢復時以新金額扣款
取消月捐
需要協助?聯繫客服

狀態卡片顏色對照

狀態背景色邊框色Badge
● 扣款中#f0fae6#c2eb99扣款中
● 已暫停#fff2cc#f0af23已暫停
● 扣款失敗#ffa9a9#ff3333扣款失敗
● 已取消#f5f7f8#ececec已取消

功能列表隨狀態切換

狀態顯示的列表項目
扣款中📋 請款紀錄 · ✏️ 修改捐款金額 · ⏸️ 暫停月捐 · ❌ 取消月捐
已暫停▶️ 立即恢復月捐(綠色突出)· 📋 請款紀錄 · ✏️ 修改捐款金額 · ❌ 取消月捐
扣款失敗🔄 更新付款方式(紅色突出)· 📋 請款紀錄 · ❌ 取消月捐
已取消🔄 重新訂閱(綠色 CTA)· 📋 請款紀錄

子流程 — 請款紀錄 & 修改金額

📋 請款紀錄

請款紀錄
累計捐款 NT$6,000
共 12 次
2026/03/15
NT$500
✓ 成功
2026/02/15
NT$500
✓ 成功
2026/01/15
NT$500
✗ 失敗
2025/12/15
NT$500
✓ 成功
2025/11/15
NT$300
✓ 成功
2025/10/15
NT$300
✓ 成功
顯示最近 12 筆,更多請聯繫客服

✏️ 修改捐款金額

修改捐款金額
目前金額
NT$500/月
調整金額
NT$550
NT$625
NT$750
NT$1,000
其他金額
NT$
輸入金額
最低 NT$100,最高 NT$50,000
ℹ️
新金額將於下次請款日(04/15)起生效。本月已完成的扣款不受影響。
預設金額邏輯:以目前金額為基準,動態計算 +10% / +25% / +50% / +100%。前端只顯示金額數字。

子流程 — 暫停月捐 & 取消月捐

⏸️ 暫停月捐

暫停月捐
暫停期間不會扣款,到期後自動恢復。你的捐款紀錄和累計金額都會保留。
選擇暫停時間
暫停 1 個月
05/15 自動恢復扣款
暫停 2 個月
06/15 自動恢復扣款
暫停 3 個月
07/15 自動恢復扣款
🌿 你知道嗎?
你過去 12 個月的捐款,幫助我們在台灣推動了 3 項環保倡議。每一份支持都很重要!

❌ 取消月捐(暫停優先流程)

取消月捐
你已經持續支持了
12 個月
累計捐款 NT$6,000
💡 考慮暫停?
暫停 1-3 個月後會自動恢復,不需要重新設定。你的捐款紀錄都會保留。
📉 降低金額?
如果是費用考量,你可以降低每月金額,持續守護環境。
仍然要取消?
取消後,已排定的下次扣款(04/15)將不會執行。
你隨時可以重新訂閱。
視覺層級:暫停建議(綠色 CTA 最醒目)→ 降金額(次要按鈕)→ 確認取消(紅框,視覺最弱)。尊重使用者意願,不阻擋。

訂閱管理 API

建廠 / BJ 需要開發的 API endpoints。

1. GET /api/subscription/status

查詢使用者訂閱狀態,主頁面載入時呼叫。

// Request: line_id from LIFF GET /api/subscription/status?line_id=Uabc123 // Response { "status": "active", // active | paused | failed | cancelled | none "amount": 500, "currency": "TWD", "lastCharge": { "date": "2026-03-15", "amount": 500, "success": true }, "nextCharge": "2026-04-15", "totalDonated": 6000, "totalCount": 12, "pauseResumeDate": null // 暫停時有值 }

2. GET /api/subscription/history

請款紀錄,近 12 筆。

// Response { "records": [ { "date": "2026-03-15", "amount": 500, "success": true }, { "date": "2026-02-15", "amount": 500, "success": true }, { "date": "2026-01-15", "amount": 500, "success": false } ] }

3. POST /api/subscription/update-amount

修改捐款金額,下次請款日生效。

{ "line_id": "Uabc123", "newAmount": 625 }

4. POST /api/subscription/pause

暫停月捐,1-3 個月後自動恢復。

{ "line_id": "Uabc123", "months": 2 }

5. POST /api/subscription/resume

提前恢復月捐(暫停中點「立即恢復」)。

6. POST /api/subscription/cancel

取消月捐,下次請款不執行。