智解家(All-Pass AI)GA4 埋點規格書
版本:v4.8
日期:2026-04-01
GA4 Property:G-YNYMSRYLP3(已部署)
Google Ads ID:18007549282(已部署)
GTM Container:GTM-MS9F9PVG(已部署)
API Base:api.all-pass.ai/api/v1/
Frontend Repo:allstars-rocks/lawsome-frontend
1. 命名規範
| 規則 | 說明 |
|---|
| GA4 標準事件 | 優先使用 GA4 推薦事件名稱(sign_up, login, purchase, begin_checkout, add_payment_info) |
| 自訂配對事件 | {object}_{start/complete},如 sign_up_start / practice_session_complete |
| 自訂單次事件 | {object}_{action},如 question_select、filter_apply |
| 錯誤事件 | {object}_error,如 signup_error、checkout_error |
| 參數名 | snake_case,如 course_name、button_text |
| 長度限制 | 事件名 ≤ 40 字元、參數名 ≤ 40 字元、參數值 ≤ 100 字元 |
| Boolean 值 | 統一使用字串 "true" / "false"(GA4 無原生 boolean type,避免 BigQuery 不一致) |
2. User Identity 策略
user_id(唯一的 User Property)
設計決策:User Properties 只保留 user_id,不追蹤 subscription_status。
- GA4 User Properties 不是 state machine,沒有 ordered updates 或 conflict resolution。訂閱狀態以 server DB 為 authoritative source。
- 需要按訂閱狀態分析?透過 BigQuery export join server DB,比 User Property 更可靠。
- 需要 Google Ads remarketing Audience?用 event-based Audience(例如「30 天內觸發
purchase 且未觸發 subscription_cancel 的用戶」),比 property-based 更準確。
user_id 設定時機
| 時機 | 做什麼 |
|---|
| App mount(已登入) | gtag('set', 'user_id', user.id) — 在任何事件 fire 之前 |
| 註冊成功 | API 回傳 user data → gtag('set', 'user_id', user.id) |
| 登入成功 | API 回傳 user data → gtag('set', 'user_id', user.id) |
| 登出 | gtag('set', 'user_id', null) |
SPA 注意:gtag('set') 在 SPA page lifecycle 內持續有效(包含 route navigation),但 hard refresh 或新分頁會重置,必須在 App mount 時重新設定。
GA4 Identity 擷取(供 Measurement Protocol 使用)
Server-side 事件需要以下欄位才能正確 stitch 到 client session。前端在註冊/登入時擷取,透過 API 送到 backend 存入 user table。
| 欄位 | 用途 |
|---|
client_id | 識別瀏覽器/裝置(MP 必填) |
session_id | Session 歸因(不傳則 source/medium 為 (not set)) |
session_number | Session 序號 |
client_id vs user_id:
client_id = GA4 自動產生,每個瀏覽器/裝置一個,匿名訪客就有。是 GA4 的主要身份軸。
user_id = 應用程式的用戶 ID,註冊/登入後才有。是在 client_id 之上的 overlay,讓 GA4 能 stitch 不同裝置的 session。
- 兩者不可互相取代。MP 必須提供
client_id,user_id 用於跨裝置合併。
Ad blocker fallback:若 gtag 被擋導致無法取得 client_id,server 可生成 synthetic UUID(格式:<random>.<timestamp>)。GA4 接受任意字串,但會失去與匿名瀏覽 session 的 stitch。
GA4 Property 設定:Admin → Identity → Reporting Identity 必須設為 Blended(推薦)或 Observed,否則 user_id 會被收集但在報表中被忽略。
3. 埋點架構:Client-side vs Server-side
Client-side(dataLayer.push)
UI 互動事件與即時回饋事件,透過 GTM dataLayer 實作。
Server-side(GA4 Measurement Protocol v2)
Subscription lifecycle 與部分練習事件由 server 觸發,確保資料正確性:
| 事件 | 原因 |
|---|
sign_up | 註冊是否成功由 server 決定 |
subtopic_complete | Backend 判定小題完成 |
chat_message_send | Server 收到聊天訊息 |
hint_request | Server 收到 hint 請求 |
purchase | TapPay 3D Secure webhook 是唯一可靠的付款確認 |
trial_start | Trial 建立由 server 處理 |
trial_cancel | 取消邏輯由 server 處理 |
trial_converted | 試用轉付費由 server 處理 |
前端配合
Frontend 在呼叫 registration / login / subscription API 時,一併傳送 GA Identity 欄位(client_id, session_id, session_number),讓 server 的 MP 呼叫能正確歸因到 client session。
Measurement Protocol 注意事項
| 項目 | 說明 |
|---|
| API Secret | GA4 Admin → Data Streams → Measurement Protocol API secrets(不是 Measurement ID) |
| 必要欄位 | client_id(必填)、user_id(建議)、session_id + session_number(歸因用) |
engagement_time_msec | 每個事件至少設為 1(否則不被計入 active session) |
timestamp_micros | 設為實際事件發生時間(超過 72 小時會被 GA4 靜默丟棄) |
DB Schema 擴充
User table 需新增以下欄位以支援 Measurement Protocol:
| 欄位 | 型別 | 說明 |
|---|
ga_client_id | string | GA4 client_id,註冊/登入時更新 |
ga_session_id | string | GA4 session_id,每次登入更新 |
ga_session_number | integer | GA4 session_number,每次登入更新 |
4. 事件總覽
核心漏斗(P1)— 21 個事件
Mermaid 原始碼
flowchart TD
CTA["cta_click"] --> SS["sign_up_start"]
SS --> SU["sign_up"]:::server
SU --> EV["email_verify_complete"]
LI["login"] -.->|回訪| EV
EV -->|做題| PS["practice_session_start"]
EV -->|購買| PW["paywall_impression"]
EV -->|試用| TI["trial_impression"]
PS --> SC["subtopic_complete ×N"]:::server
SC --> TI
PW --> AP["add_payment_info"]
TI --> AP
AP -->|直接購買| BC["begin_checkout"]
BC --> PU["purchase"]:::server
AP -->|免費試用| TS["trial_start"]:::server
TS --> TC["trial_cancel"]:::server
TS --> TCONV["trial_converted"]:::server
TCONV --> PU
PU -->|續訂| PU
PU --> SKC["subscription_cancel"]:::server
SKC --> SKE["subscription_expire"]:::server
classDef server fill:#e8f5e9,stroke:#2e7d32
綠色 = Server-side(Measurement Protocol),紫色 = Client-side
Client-side 事件(13 個)
| # | 階段 | 事件 | 觸發條件 | 類型 |
|---|
| 1 | Landing | cta_click | 點擊 Landing Page CTA | 自訂(GTM) |
| 2 | 註冊 | sign_up_start | 點擊註冊按鈕 / Modal 出現 | 自訂 |
| 3 | 回訪 | login | 登入成功(API 回傳 200 後) | GA4 標準 |
| 4 | 驗證 | email_verify_complete | Email 驗證成功 | 自訂 |
| 5 | 瀏覽 | question_bank_page_view | 進入題庫頁面 | 自訂 |
| 6 | 瀏覽 | teacher_page_view | 進入老師專區頁面 | 自訂 |
| 7 | 做題 | practice_session_start | 進入練習頁,題目載入完成 | 自訂 |
| 8 | 結帳 | begin_checkout | 進入結帳最終步(billing step) | GA4 標準電商 |
| 9 | 綁卡 | add_payment_info | 綁定信用卡成功 | GA4 標準電商 |
| 10 | 付費牆 | paywall_impression | 訂閱方案曝光(直接購買路徑) | 自訂 |
| 11 | 試用 | trial_impression | 免費試用邀請曝光(試用路徑) | 自訂 |
| 12 | 模考 | exam_page_view | 進入模考頁面 | 自訂 |
| 13 | 帳號 | profile_page_view | 進入個人檔案頁面 | 自訂 |
Server-side 事件(8 個,Measurement Protocol)
| # | 階段 | 事件 | 觸發條件 | 類型 |
|---|
| 14 | 註冊 | sign_up | 註冊 API 成功(server confirmed) | GA4 標準 |
| 15 | 完成 | subtopic_complete | 小題總結完成(Backend 判定) | 自訂 |
| 16 | 試用 | trial_start | Trial 建立成功 | 自訂 |
| 17 | 試用 | trial_cancel | 試用取消或到期未轉換 | 自訂 |
| 18 | 試用 | trial_converted | 試用轉為付費訂閱 | 自訂 |
| 19 | 營收 | purchase | 付費成功(TapPay webhook 確認) | GA4 標準電商 |
| 20 | 訂閱 | subscription_cancel | 付費用戶主動取消續訂 | 自訂 |
| 21 | 訂閱 | subscription_expire | 付費訂閱到期未續訂 | 自訂 |
低優先(P2)— 13 個事件
| # | 事件 | 觸發條件 | 觸發端 |
|---|
| 22 | landing_scroll | Landing Page 滾動至特定 Section | Client |
| 23 | signup_error | 註冊 API 回傳錯誤 | Client |
| 24 | login_error | 登入失敗 | Client |
| 25 | dashboard_cta_click | 點擊 Dashboard CTA | Client |
| 26 | course_view | 進入課程頁(帶 course_id) | Client |
| 27 | course_button_click | 點擊課程按鈕(查看題目/訂閱方案/進入課程) | Client |
| 28 | filter_apply | 使用篩選器 | Client |
| 29 | hint_request | 「老師怎麼想」觸發 AI hint | Server |
| 30 | chat_message_send | 作答模式送出訊息 | Server |
| 31 | exam_answer_submit | 模考提交答案 | Client |
| 32 | checkout_error | 付款提交失敗 | Client |
| 33 | profile_edit | 編輯個人資料 | Client |
| 34 | logout | 點擊登出 | Client |
5. 事件詳細規格
A. Landing Page(all-pass.ai)

A-1. page_view(GA4 自動)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入 all-pass.ai Landing Page |
| 類型 | GA4 Enhanced Measurement(自動收集) |
| 參數 | 型別 | 說明 |
|---|
page_title | string | 自動 |
page_location | string | 自動 |
SPA 注意:需確認 GA4 Enhanced Measurement 的 History Change 偵測已開啟。若 SPA 內頁面切換不觸發 page_view,需補 manual firing。
A-2. landing_scroll(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | Landing Page 滾動至特定區塊 |
| 類型 | GA4 Enhanced Measurement + GTM 自訂擴展 |
| 優先級 | P2 |
| 參數 | 型別 | 值 | 說明 |
|---|
section_visible | string | hero / demo / features / modes / teachers / testimonials | 用戶滑動到的最下方 Section |
以 Section 為追蹤單位,可透過 GTM Scroll Depth trigger 實作。
A-3. cta_click(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 點擊 Landing Page 任一 CTA 按鈕 |
| 類型 | 自訂事件 |
| 優先級 | P1(GTM 實作) |
| 參數 | 型別 | 範例值 | 說明 |
|---|
button_text | string | 立刻體驗 / 掌握申論備考秘技 | 按鈕文字(唯一識別 CTA) |
button_text 較 button_id 適合:Landing Page CTA 無固定 ID 屬性,且文字在報表中可讀性更高。可透過 GTM Click trigger 實作。
B. 帳號流程(app.all-pass.ai/login)

B-1. sign_up_start(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 點擊「立即註冊」,Modal 出現 |
| 優先級 | P1 |
| 參數 | 型別 | 範例值 | 說明 |
|---|
method | string | email / google | 註冊方式(如可判斷) |
用途:搭配 sign_up 計算註冊轉換率(start → complete),識別表單 UX 摩擦點。
B-2. sign_up(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 註冊成功(API 回傳 200) |
| 類型 | GA4 推薦事件(啟用 GA4 User Acquisition 內建報表) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
method | string | email / google(GA4 標準參數) |
Google OAuth:與登入走同一 API,需後端回傳 is_new_user flag 區分。
B-3. signup_error(Client-side)
| 參數 | 型別 | 說明 |
|---|
method | string | email / google |
error_type | string | email_exists / invalid_password / network_error |
B-4. login(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 登入成功(API 回傳 200 後) |
| 類型 | GA4 推薦事件 |
| 優先級 | P1 |
(無額外參數)
登入成功後需同時設定 user_id 並擷取 GA Identity 存入 backend(見 Section 2)。
B-5. login_error(Client-side)
| 參數 | 型別 | 說明 |
|---|
error_type | string | wrong_password / user_not_found / network_error |
B-6. email_verify_complete(Client-side)
(無額外參數,僅在驗證成功時 fire,不含 error 情境)
C. Dashboard(/dashboard)

C-1. dashboard_cta_click(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 點擊 Dashboard「立即練習一題」按鈕 |
| 優先級 | P2 |
(無額外參數)
D. 題庫(/question-bank)
D-0. question_bank_page_view(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入題庫頁面(頁面載入完成) |
| 優先級 | P1 |
(無額外參數)
用途:追蹤題庫頁面造訪量,搭配 filter_apply 和 practice_session_start 可計算「瀏覽 → 篩選 → 開始做題」的轉換率。
D-1. filter_apply(Client-side)
| 參數 | 型別 | 範例值 | 說明 |
|---|
filter_type | string | category / tag / answer_status / teacher | 篩選器類型 |
filter_value | string | 所選值 | 篩選值 |
E. 課程與老師專區
E-0. teacher_page_view(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入老師專區頁面(頁面載入完成) |
| 優先級 | P1 |
(無額外參數)
用途:追蹤老師專區造訪量。搭配 course_view 和 paywall_impression(source: teacher_view_plan)可分析老師專區的付費轉換路徑。
E-1. course_view(Client-side)
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
E-2. course_button_click(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 點擊課程頁面上任何與課程互動相關的按鈕(包含查看題目、查看訂閱方案、進入課程等) |
| 優先級 | P2 |
| 參數 | 型別 | 範例值 | 說明 |
|---|
course_id | string | UUID | 課程 ID |
button_type | string | view_questions / view_plan / enter_course | 按鈕類型 |
用途:追蹤「未購買但對這門課有興趣」的用戶行為。button_type 區分不同意圖:view_questions(查看題目)、view_plan(查看訂閱方案)、enter_course(嘗試進入課程)。
E-3. paywall_impression(Client-side)

| 欄位 | 值 |
|---|
| 觸發條件 | 付費牆或訂閱方案 Modal 出現(包含鎖定內容覆蓋層、課程頁按鈕、老師專區「查看訂閱方案」等所有入口) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 相關課程(可為 null) |
source | string | 紀錄從哪個入口觸發 paywall(見下方來源列表) |
Paywall 觸發來源(source 參數值):
locked_content — 課程內的鎖定內容覆蓋層(未購買用戶看到的鎖定內容)
course_practice_button — 題目頁的「開始練習」按鈕
course_view_plan — 課程頁面「查看訂閱方案」按鈕
teacher_view_plan — 老師專區「查看訂閱方案」按鈕
E-4. trial_impression(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 免費試用邀請出現(尚未試用過的用戶看到試用 CTA 或 Modal) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 相關課程(可為 null) |
source | string | 觸發來源(同 paywall_impression) |
與 paywall_impression 的區別:paywall_impression 是訂閱方案的曝光(直接購買路徑),trial_impression 是免費試用邀請的曝光(試用路徑)。兩者在漏斗中處於同一層級,由用戶的試用資格決定顯示哪一個。
用途:搭配 trial_start 計算試用轉換率(impression → start)。與 paywall_impression 分開追蹤,可比較兩條路徑的轉換效率。
F. 練習做題(/practice-session/{id}/chat-session/{id})
架構說明:每個 practice session 對應一題,包含 N 個 sub-questions,每個 sub-question 對應一個 chat session。用戶在「講解」(explanation) 和「作答」(qa) 模式間切換。
F-1. practice_session_start(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入練習頁,session 資料載入完成 |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
session_id | string | 練習 session ID |
question_id | string | 題目 ID |
course_id | string | 課程 ID |
entry_source | string | dashboard_cta / question_bank / random / course |
注意:需防止頁面 re-render 重複觸發。question_title, category, teacher 等 metadata 不帶在事件上,可透過 question_id join 後端資料庫取得。
F-2. subtopic_complete(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 小題完成(Backend 判定 session_status: completed) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
session_id | string | 練習 session ID |
question_id | string | 題目 ID |
subtopic_index | integer | 當前小題序號(0-based) |
每小題只 fire 一次。這是練習漏斗的最小追蹤單位,可看到「做了幾題就放棄」的分佈。
F-4. chat_message_send(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 作答模式送出聊天訊息(Server 收到 chat API 請求時) |
| 優先級 | P2 |
| 參數 | 型別 | 說明 |
|---|
session_id | string | 練習 session ID |
question_id | string | 題目 ID |
subtopic_index | integer | 當前小題序號 |
F-5. hint_request(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 「老師怎麼想」觸發 AI hint(Server 收到 hint API 請求時) |
| 優先級 | P2 |
| 參數 | 型別 | 說明 |
|---|
session_id | string | 練習 session ID |
question_id | string | 題目 ID |
subtopic_index | integer | 當前小題序號 |
AI 生成的提示(非靜態內容),由 Server 端 hint API 觸發。
G. 模考(/exam/{examSessionId})
架構說明:模考與練習是獨立流程。從 PracticeSession 的「開始模考批改」進入,建立 exam session 後跳轉到模考頁面。提交後 AI 批改耗時 20-40 秒。
G-0. exam_page_view(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入模考頁面(頁面載入完成) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
question_id | string | 題目 ID |
session_id | string | 練習 session ID(來源) |
用途:追蹤有多少用戶從練習進入模考。搭配 exam_answer_submit 可計算模考完成率。
G-1. exam_answer_submit(Client-side)
| 參數 | 型別 | 說明 |
|---|
exam_session_id | string | 模考 session ID |
question_id | string | 題目 ID |
answer_length | integer | 作答字數 |
exam_mode | string | simple / realistic |
duration_seconds | integer | 作答耗時(秒) |
exam_mode 和 duration_seconds 為前端 UI 狀態。
H. 訂閱/付款流程
架構說明:
- 付款模式:選方案 + coupon → 選卡/綁卡 → 填寫帳單 → 送出付款
- 試用模式:試用邀請 → 選卡/綁卡 → 填寫帳單 → 送出
- 付款整合:TapPay(台灣),支援 3D Secure(全頁重定向)
- 發票:台灣電子發票(手機條碼/自然人憑證/愛心碼)
Trial vs Purchase 分離設計:Trial 開始為獨立的 trial_start 事件,不進 GA4 電商漏斗。purchase 事件只在真實付費時觸發(value > 0),避免 $0 trial 拉低 AOV。
Trial 生命週期:trial_start → trial_converted(轉為付費)或 trial_cancel(取消/未轉換)。不再有獨立的 expire 事件。
H-1. trial_start(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | Trial 建立成功 |
| 類型 | 自訂事件(Measurement Protocol) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
plan_id | string | 方案 ID |
H-2. trial_cancel(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 試用取消或到期未轉換(用戶主動取消,或試用期滿未轉為付費) |
| 類型 | 自訂事件(Measurement Protocol) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
days_remaining | integer | 取消時剩餘試用天數(0 = 到期未轉換,>0 = 主動取消) |
分析用途:days_remaining = 0 表示被動流失(試用到期未轉換),days_remaining > 0 表示主動取消。搭配 trial_converted 可計算 Trial-to-Paid 轉換率。
H-3. trial_converted(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 試用轉為付費訂閱(試用期結束後成功扣款) |
| 類型 | 自訂事件(Measurement Protocol) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
Trial 完整生命週期:
trial_start → trial_converted + purchase — 試用轉付費
trial_start → trial_cancel (days_remaining > 0) — 主動取消
trial_start → trial_cancel (days_remaining = 0) — 到期未轉換
H-4. add_payment_info(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 綁定新信用卡成功 |
| 類型 | GA4 推薦電商事件 |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
payment_flow | string | trial / subscription(判斷用戶走試用還是直接訂閱) |
GA4 items 陣列:GA4 電商報表需要 items 參數。由於本產品每次只購買一門課程,items 固定為 [{item_id: course_id, item_name: "課程名稱", quantity: 1}],實作時自動帶入即可,不列為獨立參數。
H-5. begin_checkout(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入結帳最終步(從選卡進入填寫帳單) |
| 類型 | GA4 推薦電商事件 |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
payment_flow | string | trial / subscription |
注意:begin_checkout 不帶 value 參數。GA4 會將帶 value + currency 的事件自動計入 Revenue,造成雙重計算。Revenue 只在 purchase 事件計算。
GA4 items 陣列:同 H-4,自動帶入 [{item_id: course_id, ...}]。
H-6. purchase(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 付費成功(僅真實付費,trial 不觸發此事件) |
| 類型 | GA4 推薦電商事件(啟用 GA4 Monetization 報表 + BigQuery ecommerce 欄位) |
| 優先級 | P1 |
| 參數 | 型別 | 範例值 | 說明 |
|---|
transaction_id | string | sub_abc123 | 訂閱 ID(GA4 必要,用於去重) |
value | number | 990 | 付費金額(GA4 必要,計入 Revenue) |
currency | string | TWD | 幣別(GA4 必要) |
course_id | string | UUID | 課程 ID |
coupon | string | SAVE20(可為 null) | GA4 標準 coupon 參數 |
purchase_type | string | new / trial_converted / renewal | 訂單類型(新訂閱 / 試用轉付費 / 續訂) |
Trial 不觸發 purchase:Trial 走 trial_start(自訂事件),避免 $0 transaction 拉低 Average Order Value。
GA4 items 陣列:同 H-4,自動帶入 [{item_id: course_id, item_name: "課程名稱", price, quantity: 1}]。GA4 Monetization 報表需要此欄位才能顯示 Item-level 數據。
H-7. checkout_error(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 付款提交失敗(API / TapPay / Network error) |
| 優先級 | P2 |
| 參數 | 型別 | 說明 |
|---|
error_message | string | 錯誤訊息(截斷 100 字元) |
course_id | string | 課程 ID |
H-8. subscription_cancel(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 付費用戶主動取消續訂(取消後訂閱仍有效至到期日) |
| 類型 | 自訂事件(Measurement Protocol) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
plan_type | string | monthly / quarterly / yearly |
days_remaining | integer | 取消時剩餘訂閱天數(挽回窗口分析) |
lifetime_value | number | 該用戶累計付費金額(TWD) |
分析用途:days_remaining 可建構「取消時機分佈」。Day 1 取消 = 產品問題,接近續訂日取消 = 價格敏感。
H-9. subscription_expire(Server-side MP)
| 欄位 | 值 |
|---|
| 觸發條件 | 付費訂閱到期且未續訂(churn confirmed) |
| 類型 | 自訂事件(Measurement Protocol) |
| 優先級 | P1 |
| 參數 | 型別 | 說明 |
|---|
course_id | string | 課程 ID |
plan_type | string | monthly / quarterly / yearly |
total_periods | integer | 完成的計費週期數 |
注意:此事件只在訂閱真正結束時觸發(未續訂)。成功續訂 = 再一次 purchase(帶 purchase_type: "renewal"),不觸發 subscription_expire。
付費訂閱完整生命週期:
purchase → purchase (purchase_type: "renewal") → ... → 持續付費
purchase → subscription_cancel → subscription_expire(churn)
I. 個人檔案(/user-profile)
I-0. profile_page_view(Client-side)
| 欄位 | 值 |
|---|
| 觸發條件 | 進入個人檔案頁面(頁面載入完成) |
| 優先級 | P1 |
(無額外參數)
用途:追蹤個人檔案頁造訪量。搭配 profile_edit 可計算「查看 → 編輯」的比例,了解用戶對 profile 功能的使用程度。
I-1. profile_edit(Client-side)
| 參數 | 型別 | 說明 |
|---|
field | string | name / password |
I-2. logout(Client-side)
登出後清除 user_id(見 Section 2)。
6. 漏斗設計
設計原則
- 事件是原子化的、path-agnostic 的。不在事件名稱中編碼路徑資訊(例如不建
trial_then_purchase),只 fire purchase。路徑從事件序列重建。
- GA4 Funnel Exploration 支援 Open Funnel(用戶可從任意步驟進入),足以處理分支路徑。
- 複雜路徑分析走 BigQuery SQL(GA4 Explore 上限 10 步、segment 能力有限)。
典型用戶路徑
Mermaid 原始碼
flowchart TD
SS["sign_up_start"] --> SU["sign_up"]:::server
SU --> EV["email_verify_complete"]
EV -->|直接購買| PW["paywall_impression"]
EV -->|先做題| PS["practice_session_start"]
EV -->|試用| TI["trial_impression"]
PS --> SC["subtopic_complete ×N"]:::server
SC --> TI
PW --> AP["add_payment_info(綁卡)"]
TI --> AP
AP -->|直接購買| BC["begin_checkout"]
AP -->|免費試用| TS["trial_start"]:::server
BC --> PU["purchase"]:::server
TS --> TCONV["trial_converted"]:::server
TS --> TC["trial_cancel"]:::server
TCONV --> PU
classDef server fill:#e8f5e9,stroke:#2e7d32
建議 GA4 Funnel 配置
| Funnel | Steps | 模式 |
|---|
| 註冊漏斗 | sign_up_start → sign_up → email_verify_complete | Closed |
| 直接購買 | paywall_impression → add_payment_info → begin_checkout → purchase | Open |
| Trial 轉換 | trial_impression → add_payment_info → trial_start → trial_converted | Open |
| 做題後 Trial | practice_session_start → subtopic_complete → trial_impression → add_payment_info → trial_start | Open |
| Trial 生命週期 | trial_start → trial_converted 或 trial_cancel | Closed |
| 付費訂閱留存 | purchase → subscription_cancel → subscription_expire | Open |
| 練習投入度 | practice_session_start → subtopic_complete (×N) | Open |
7. 前置設定
| 項目 | 說明 |
|---|
| GA4 Reporting Identity | Admin → Identity → 設為 Blended |
| MP API Secret | GA4 Admin → Data Streams → Measurement Protocol API secrets → 建立 |
| DB Schema | User table 新增 ga_client_id, ga_session_id, ga_session_number 欄位(見 Section 3) |
| Custom Dimensions | 見下方註冊清單 |
| Enhanced Measurement | 確認 History Change 偵測已開啟(SPA page_view) |
GA4 Custom Dimensions 註冊清單
GA4 Free 上限:50 event-scoped custom dimensions + 50 custom metrics。
| 參數名 | Scope | 用途 |
|---|
session_id | Event | 練習 session 追蹤 |
question_id | Event | 題目關聯分析 |
course_id | Event | 課程 / 訂閱關聯分析 |
entry_source | Event | 練習進入方式分析 |
method | Event | 註冊方式(sign_up) |
button_text | Event | Landing CTA 分析 |
subtopic_index | Event | 小題進度 |
button_type | Event | 課程按鈕類型(view_questions / view_plan / enter_course) |
source | Event | paywall 觸發來源 |
payment_flow | Event | 付款流程類型(trial / subscription) |
purchase_type | Event | 訂單類型(new / trial_converted / renewal) |
days_remaining | Event | 取消時機分析(trial + subscription) |
plan_type | Event | 方案類型分析 |
lifetime_value | Event | 累計付費金額 |
8. 截圖索引
| 截圖檔案 | 頁面 | 對應事件 |
|---|
A-landing.png | Landing Page(viewport) | A-3 cta_click |
B-entry.png | 登入/註冊入口 | B-1 sign_up_start |
C-dashboard.png | Dashboard | C-1 dashboard_cta_click |
E-paywall.png | 訂閱方案 Modal | E-3 paywall_impression |
9. 修訂記錄
| 版本 | 日期 | 變更 |
|---|
| v1.0 | 2026-04-01 | 初版:基於 Playwright 探索的 39 事件規格 |
| v2.0 | 2026-04-01 | 命名規範統一、優先級重排、截圖索引 |
| v3.0 | 2026-04-01 | 基於前端程式碼 + Server API 分析全面重構(38 事件) |
| v3.1 | 2026-04-01 | 三方 Expert Review:GA4 標準事件名、Trial 獨立、begin_checkout 移除 value、Boolean 統一字串 |
| v4.0 | 2026-04-01 | User Properties 僅 user_id、Server-side MP v1、sign_up_start + sign_up server-side、trial_cancel、多路徑漏斗、移除 Week 分期 |
| v4.1 | 2026-04-01 | (1) 移除 practice_session_complete(以 subtopic_complete 為最小追蹤單位)(2) 新增 subscription_cancel + subscription_expire(P1 server-side,付費訂閱生命週期)(3) purchase 新增 is_renewal + billing_period_number 參數 (4) paywall_impression 提升至 P1 (5) scroll → landing_scroll (6) course_tab_switch → course_view(P2,帶 course_id)(7) question_select 降至 P3 (8) 移除 ai_feedback_receive、exam_feedback_view、coupon_apply(coupon 已在 purchase/begin_checkout 參數中)(9) checkout_error 明確標記為 client-side (10) 新增付費訂閱留存 Funnel |
| v4.2 | 2026-04-01 | 全事件截圖標註:每個事件在截圖上以紅框/色標標記觸發位置。新增 H-checkout 付費流程示意圖。截圖命名統一為 Section 字母編碼。 |
| v4.3 | 2026-04-01 | 參數精簡 + 截圖優化:filter_apply 移除 result_count、course_view 精簡、course_card_click → course_button_click(帶 button_type)、新增 paywall_impression 截圖、F-section params 統一、新增 exam_page_view(P1) |
| v4.4 | 2026-04-01 | (1) trial_expire → trial_converted(試用轉付費)(2) subtopic_complete/chat_message_send/hint_request 移至 Server-side MP (3) 所有事件標題加 Client/Server label (4) 移除 login method 參數 (5) paywall_impression 精簡為 course_id + source (6) add_payment_info/begin_checkout 精簡為 course_id + payment_flow (7) purchase 新增 purchase_type(new/trial_converted/renewal)取代 is_renewal (8) 移除多餘截圖標註(僅保留 client-side UI element 標註)(9) H-checkout 示意圖移除,保留 Mermaid funnel 圖 |
| v4.5 | 2026-04-01 | 移除所有截圖標註(改為純截圖);移除實作工程細節(檔案路徑、code snippets、實作流程、實作備註),僅保留事件規格與分析用途 |
| v4.6 | 2026-04-01 | 新增 3 個 P1 Navigation Page View 事件:question_bank_page_view、teacher_page_view、profile_page_view(P1 事件 17→20) |
| v4.7 | 2026-04-01 | 移除 preview_empty paywall source;修正典型用戶路徑:paywall_impression 為付費/試用共同入口,add_payment_info 在 begin_checkout 之前;新增 Trial 轉換漏斗 |
| v4.8 | 2026-04-01 | 新增 trial_impression(P1):免費試用邀請曝光,與 paywall_impression 平行。做題路徑(subtopic_complete)→ trial_impression → add_payment_info → trial_start。漏斗圖與配置全面區分直購/試用雙路徑 |