← 全部 app

VocaStory 故事魔法

vocastory · flutter · 實作規格版本 0.2.0

有:新手引導、帳號註冊、付費

沒有:小遊戲、廣告(報表中看不到這些步驟是正常的,不是流失)

建議漏斗

GA4 → 探索 → 開始新的探索 → 漏斗探索。按「步驟」旁的編輯,依下方順序「加入步驟」:每一步選事件,有寫條件的就在那個事件加上參數條件。要按某個代號拆開看,把它放進「細分維度」(GA4 依使用者進入漏斗那一步的值分組)。每個 app 在自己的 GA4 資源各建一次,存好之後數字會自動更新。以 first_open 開頭的漏斗只算報表期間內新安裝的人;升級上來的舊用戶不會出現在裡面。

新手引導完成率:首次啟動引導
每一步還剩多少人,看在哪一步流失最多。
  1. first_open
  2. cfd_onboarding_step,條件 flow_id = first_runstep_id = voice_clone_introaction = viewed
  3. cfd_onboarding_step,條件 flow_id = first_runstep_id = story_creation_introaction = viewed
  4. cfd_onboarding_step,條件 flow_id = first_runstep_id = immersive_introaction = viewed
  5. cfd_onboarding_step,條件 flow_id = first_runstep_id = immersive_introaction = completed
註冊轉換
安裝後有多少人完成註冊。
  1. first_open
  2. sign_up
付費轉換
看到付費牆的人有多少付款;用細分維度看是哪個付費牆。
  1. cfd_paywall_view
  2. purchase
細分維度:paywall_id
purchase 要等 RevenueCat → Firebase 串接開好(或 app 自己送)才會有。
功能使用
各功能用了多少:報表 → 參與 → 事件,點 cfd_feature_enter,依 feature_id 拆分。這個不適合做成漏斗:漏斗的細分看第一步,而 first_open 沒有 feature_id。

功能

在報表中用 feature_id/item_id 篩選

快速創作
create_quick
經典創作
create_classic
畫畫變故事
create_drawing
故事卡牌
create_cards
AI 故事導演
create_director
說故事
create_voice
經典改編
create_adaptation
角色連載
create_series
雙人接力繪本
create_co_creation
互動冒險
create_adventure

畫面

在報表中用 screen_name 篩選

首頁
home
動態牆
feed
好友
friends
我的
profile
新手引導
onboarding
登入
login
註冊
register
創作中心
creation_hub
快速創作
create_quick
經典創作
create_classic
畫畫變故事
create_drawing
故事卡牌
create_cards
AI 故事導演
create_director
說故事
create_voice
經典改編
create_adaptation
角色連載
create_series
雙人接力繪本
create_co_creation
互動冒險設定
adventure_setup
互動冒險
adventure_play
分鏡大綱
storyboard_outline
分鏡渲染
storyboard_render
故事詳情
story_detail
故事播放器
story_player
全螢幕繪本播放
fullscreen_player
作品播放
works_player
經典故事庫
standard_library
收藏
favorites
聲音檔案
voice_profiles
錄製聲音
voice_recording
家庭成員
children
故事角色
story_characters
家長控制
parental_control
訂閱方案
subscription
點數商店
credit_shop
設定
settings
隱私設定
privacy_settings
通知
notifications
劇本
scripts

新手引導流程

在報表中用 flow_id 篩選

首次啟動引導
first_run
步驟:voice_clone_intro → story_creation_intro → immersive_intro

付費牆

在報表中用 paywall_id 篩選

聲音克隆付費牆
voice_clone
AI 生成付費牆
story_generation
點數不足付費牆
quota_exceeded
孩子數上限付費牆
child_limit
會員模板付費牆
premium_template
會員故事付費牆
library_story
故事儲存上限付費牆
storage_limit
訂閱方案頁
subscription_page
點數商店
credit_shop

此 app 專屬事件

首頁沒有列的事件都在這裡;名稱以 voca_ 開頭

故事插圖渲染完成
voca_story_render_complete
All scene images finished rendering for a newly created story. Carries no feature_id: the client no longer holds the creation mode by then (neither the draft nor the progress entity carries it), and a guessed one would credit one mode's render cost to another. The same session's voca_story_create_submit has it.
參數 scene_count:integer, number of scenes rendered
參數 render_ms:integer, wall-clock time of the whole render (server-side generation, deliberately NOT duration_ms - that one means active play time in the shared table)
送出聲音克隆
voca_voice_clone_start
A recording sample is submitted for cloning (not on entering the page, which is opened and abandoned constantly). No voice_role and never the voice's name: the name is user-typed and routinely a real family member's, and the role is not exposed on the client since voices became named.
參數 language:zh_TW | zh_CN | en_US | ja_JP | ko_KR
聲音克隆完成
voca_voice_clone_complete
The cloned voice becomes usable for narration, or the upload failed. A voice still processing is NOT a completion - counting it would put the success rate at 100% by definition.
參數 language:zh_TW | zh_CN | en_US | ja_JP | ko_KR
參數 outcome(與共用表同義):completed | failed
送出故事生成
voca_story_create_submit
The generation request is accepted by the server - the real moment a creation attempt begins, distinct from entering the creation mode
參數 feature_id(與共用表同義)
參數 child_id_present:true | false - whether a child profile was attached
新增家庭成員
voca_child_add
A child profile is created and confirmed by the server. Activation signal - personalisation is impossible before this.
參數 ordinal:integer, 1 for the first child profile on this account
開始互動冒險
voca_adventure_start
The first chapter of a branching adventure is playable
參數 play_id:random id shared with the matching voca_adventure_end; BigQuery only, never register
參數 setting:the chosen adventure setting id; omitted when none was chosen
互動冒險結束
voca_adventure_end
An ending chapter is reached, for a run whose voca_adventure_start was reported. Leaving mid-run is NOT reported - a crash sends nothing either, so a start with no end is unknown drop-off (same rule as story playback).
參數 play_id
參數 outcome(與共用表同義):completed (the only value emitted today)
參數 depth:integer, how many chapters deep the run got
設定家長密碼
voca_parental_pin_setup
A parental PIN is created and stored for the first time. Signals that the adult actually finished setting the guard up, not just opened it.
參數 entry_point(與共用表同義):menu (from the parental-control menu) | other (sent by a gate that needed a PIN first - social features, purchases, the parental gate, enabling social settings)
驗證家長密碼
voca_parental_pin_verify
A PIN entry attempt resolves. Fires on every attempt, so a high failed rate means adults are locked out of their own settings.
參數 outcome(與共用表同義):completed | failed | quit
參數 gate_context:parental_control | social_feature
發佈作品
voca_story_publish
The server confirms a story is published to the community. Never on tapping publish - the social gate or the server can still refuse. No allow_remix: publishing does not set it (remix is a separate endpoint the author toggles afterwards), so at this moment the value is a server default the client never sees.
參數 item_id(與共用表同義)
喜愛作品
voca_story_like
A publication is liked (not on unlike)
參數 item_id(與共用表同義)
發表留言
voca_comment_post
A comment is accepted by the server (passes the content filter)
參數 item_id(與共用表同義)
追蹤創作者
voca_creator_follow
A creator is followed (not on unfollow)
經典改編選擇
voca_adaptation_pick
The three adaptation dimensions are confirmed and the generation is submitted. Shows which retellings children actually want.
參數 source_tale:skeleton slug of the classic being retold, e.g. cinderella
參數 protagonist:original | robot | astronaut | dinosaur | wizard | animal | detective
參數 setting:original | space | undersea | future_city | dinosaur_age | magic_school | snow
參數 ending:original | befriend | self_reliant | happy_all | twist | open
點擊購買
voca_purchase_tap
The store purchase flow is launched for a product - the last moment the app controls. What happens next (cancel, decline, success) is the store's, and only a success comes back as RevenueCat's purchase event.
參數 product_id:store product id, e.g. com.gcdm.vocastory.credits.pack1
參數 product_kind:subscription | credit_pack
參數 placement(與共用表同義):onboarding | feature_gate | game_gate | settings | promo | other
收藏故事
voca_story_favorite
A story is added to favourites (not on removal)
參數 item_id(與共用表同義)
參數 source:own | library | published
開始播放故事
voca_story_play_start
Audio actually starts for a story (not on tap, not on page open - a feed card autoplays when it scrolls into view, so opening is not a play). Reported from all four players: the story player, both feed cards (original and classic) and the library fallback player.
參數 item_id(與共用表同義):the story id; for a library story always the LIBRARY id (the player's per-user shadow row id would split one tale into many items)
參數 source:own | library | published
參數 play_id:random id shared with the matching voca_story_play_complete; BigQuery only, never register as a dimension (high cardinality)
故事聽完
voca_story_play_complete
North Star (WSPC). The story reached its end AND more than half of it was actually heard. "Heard" counts forward progress only - dragging the scrubber to the end, or a chapter change, adds nothing. The end is a stop at the end of the last chapter (story player, fallback player) or a wrap back to the start (feed cards, which loop). A start with no complete is unknown drop-off; nothing reports a quit.
參數 item_id(與共用表同義)
參數 source:own | library | published
參數 play_id:matches the voca_story_play_start of this playback
參數 duration_ms(與共用表同義):integer, active listening time (same meaning as the shared table's duration_ms)
切換朗讀聲音
voca_voice_swap
The backend accepted a change of narrating voice on a story (from cache or by starting a render). official | family only - the client cannot tell a mother's voice from a father's, and guessing from the typed voice name would be both a guess and personal data.
參數 item_id(與共用表同義)
參數 voice_role:official | family