Bản phát hành

Thay đổi bản v1.0.15

Bản này rút gọn flow từ lúc mở app tới màn hình chính — bỏ 3 vị trí ads và toàn bộ paywall khỏi onboarding, bỏ mọi chỗ khoá màn hình để chờ ads. Kèm theo: toàn bộ tên event funnel đã đổi, và một carousel promo mới trên màn hình chính thay dần dialog mời đặt làm launcher mặc định.

Mục lục trang

1 Bản này đổi gì

Đọc 30 giây là đủ nắm. Chi tiết từng phần ở các mục dưới.

Flow ngắn hơn

Từ lúc mở app tới màn hình chính: 6 vị trí ads + 1 paywall3 vị trí ads, không paywall. Bỏ mọi chỗ khoá màn hình để chờ ads.

Kỳ vọng: vào được màn hình chính 64,0% → 72–78%

Event funnel đổi tên hết

Lần mở đầu tiên: 17 step còn 9. Các lần mở sau: 5 step còn 4. Tên cũ ngừng bắn hoàn toàn.

Phải dựng lại báo cáo funnel trước ngày phát hành

Carousel promo trên Home

Một dialog vuốt được, xoay 6 card giới thiệu tính năng. Thay dần dialog default_launcher_prompt cũ.

Thêm 1 công tắc cấu hình từ xa mới — xem mục 6

⚠️ Toàn bộ đã vào code — nhưng chưa phát hành, chưa có số thật
Cả 3 nhóm (flow + event + carousel promo) đều đã vào code. Chưa lên store nên chưa có số thật nào — mô tả ở đây để BA/QA/Marketing chuẩn bị dashboard trước.
Luật của carousel đã đổi so với bản mô tả đầu tiên: cách đếm lượt, nhịp lặp, limit, và hành vi khi lượt carousel bị chặn. Ai đọc bản trước phải đọc lại mục 5.
Nhóm thay đổiTrạng tháiĐọc ở mục
Flow mở app → màn hình chính ngắn hơn✅ Đã vào code (v1.0.15)2 · 3
Bộ event funnel đổi tên + rút step✅ Đã vào code (v1.0.15)4
Carousel promo + card set_default✅ Đã vào code, chưa phát hành5 · 6
Param source trên mini_app_open — mở mini app từ chỗ nào✅ Đã vào code, chưa phát hành5
Dọn các vị trí native ads show rate thấp✅ Đã vào code (đợt sau v1.0.15)7

2 Flow mở app → màn hình chính: trước và sau

Cùng số màn hình, chỉ bớt thứ chen vào giữa. Chữ đỏ là phần đã bỏ, chữ xanh là phần mới.

Trước — 6 vị trí ads + 1 paywall

Splash        native ads + full-screen ads
              chờ tối thiểu ~4 giây
   │
Intro 5 trang native ads
              khoá vuốt + khoá nút Next 8 giâySub (paywall)  → đóng lại thì ra inter ads
   │
Language      native ads #1 + native ads #2
              khoá cả danh sách ngôn ngữ 8 giây
   │
ChooseWallpaper
   │
Hello
   │
Màn hình chính

Bấm nút back ở Language / ChooseWallpaper / Hello = thoát app

Sau — 3 vị trí ads, không paywall

Splash        full-screen ads
              giao diện mới, không có ads trong màn
   │
Intro 5 trang native ads
              vuốt / bấm được ngay từ giây đầu
   │
Language      native ads #1
              danh sách bấm được ngay
              chọn xong → hiện "Applying language…" ~3 giây
   │
ChooseWallpaper
   │
Hello
   │
Màn hình chính

Bấm nút back trong cả chuỗi = không làm gì, không thoát app nữa

Từng màn đổi gì

MànTrướcSauVì sao
Splash
(màn logo lúc mở app)
Dùng chung giao diện với màn "đang tải ads": có ô native ads 250dp, có icon app, và phải giữ màn tối thiểu ~4 giây cho ads kịp hiện. Giao diện riêng theo design mới: ảnh nền + tên app + thanh tiến trình. Không còn ô native ads. Chỉ còn mức giữ màn tối thiểu 3 giây theo cấu hình từ xa. Bỏ mức chờ 4 giây của ô native → splash ngắn hơn ~4 giây ở lượt có ads. Full-screen ads vẫn giữ nguyên (AOA hoặc inter ads, tuỳ cấu hình).
Intro
(5 trang giới thiệu)
Vào màn là khoá vuốt và khoá nút Next 8 giây để chờ native ads về. Vuốt và bấm được ngay. Native ads ghim đáy màn vẫn giữ, về lúc nào hiện lúc đó. Native ads về trung bình sau 4,9–6,4 giây mà màn khoá 8 giây — người dùng tưởng app treo rồi bỏ. Riêng màn này mất −148 người ở bản trước.
Sub
(màn mời mua gói)
Chen giữa Intro và Language. Đóng màn này lại thì ra thêm một inter ads. Bỏ khỏi onboarding. Intro xong đi thẳng sang Language. Inter ads ở đây có tỉ lệ bấm 45,6% (410 show → 187 click → chỉ 112 người quay lại) — gần như toàn bộ là bấm nhầm, kèm rủi ro bị Google đánh dấu invalid traffic. Màn mua gói không bị xoá khỏi app, vẫn vào được từ Cài đặt.
Language
(chọn ngôn ngữ)
Khoá cả danh sách 8 giây. Có 2 vị trí native ads: một lúc vào màn, một sau khi chọn ngôn ngữ. Nút Continue chỉ bật khi ads thứ hai đã về. Danh sách bấm được ngay, còn 1 vị trí native ads. Lần chọn ngôn ngữ đầu tiên hiện lớp phủ "Applying language…" ~3 giây rồi tự đóng, vẫn ở màn Language với nút Continue đã bật. Ads nào sẵn sàng đúng lúc lớp phủ đang chạy thì nút bấm của ads đổi sang màu xanh. Màn này mất −142 người ở bản trước. Nút Continue giờ không phụ thuộc ads nữa. Lớp phủ 3 giây giữ lại một khoảng người dùng nhìn màn, thay cho việc khoá 8 giây.
Cả chuỗi
(nút back của máy)
Splash + Intro bấm back thì không làm gì, nhưng Language / ChooseWallpaper / Hello bấm back là thoát app. Bấm back ở mọi màn trong chuỗi đều không làm gì. Đây là một phần trong số người mất ở màn Language: bấm back cho đỡ chờ thì mất app luôn.
📊 Đánh đổi đã chốt
Được: người vào được màn hình chính kỳ vọng 64,0% → 72–78%.
Mất: khoảng 2.500–3.000 impression / 4 ngày (native ads ở Splash + native ads thứ hai ở Language + inter ads sau paywall).
Số show rate cũ của 2 vị trí bị bỏ (99,3% và 81%) không phải thành tích — nó cao vì người dùng bị màn hình khoá lại, không đi đâu được.

3 Bỏ gì, xoá gì

Danh sách đủ. Cột cuối cho biết việc bỏ đó ảnh hưởng số liệu ra sao.

Bỏ khỏi flow

Bỏ gìỞ đâuVì saoẢnh hưởng số liệu
Native ads ở màn Splash Chỉ màn Splash lúc mở app từ đầu Người dùng phải chờ thêm ~4 giây chỉ để ô ads kịp hiện, ngay ở giây đầu tiên dùng app Mất 1 step funnel. Native ads ở màn đang tải của các app trong app (Clock, Gallery…), Theme Store và Chat AI giữ nguyên, không đụng tới
Màn mời mua gói (paywall) Giữa Intro và Language Chen một màn bán hàng vào lúc người dùng chưa biết app làm được gì Mất 1 step. Màn này vẫn còn trong app, vào từ Cài đặt
Inter ads sau khi đóng paywall Ngay sau màn mua gói Tỉ lệ bấm 45,6% = bấm nhầm; rủi ro invalid traffic Mất 1 step
Native ads thứ hai ở Language Màn chọn ngôn ngữ Nó là lý do nút Continue bị khoá. Show rate 99,3% chỉ vì người dùng không đi đâu được Mất 1 step
Khoá màn để chờ ads (8 giây) Intro + Language Ads về sau 4,9–6,4 giây, khoá 8 giây là chờ vô ích Show rate của native ads ở Intro sẽ giảm — đó là số thật, không phải hỏng. Lý do "không hiện" giờ hay là người dùng bấm đi tiếp trước khi ads về
Chờ tối thiểu 4 giây của ô native ở Splash Màn Splash Không còn ô native ads thì không có gì phải chờ Splash ngắn hơn ~4 giây; vẫn giữ mức 3 giây đổi được từ xa để có nhịp branding
Icon app ở màn đang tải ads Màn chờ inter ads · màn "Welcome back" · màn mở app trong app · Theme Store · Chat AI Icon phải vẽ lại mỗi lần, không đem lại gì Không ảnh hưởng event nào. Giữ lại: chữ, dòng ghi chú ads, thanh tiến trình, ô native ads

Xoá khỏi bộ event

7 event bị xoá vì trùng thời điểm với event ngay trước nó. "Màn A xong" và "màn B hiện" là cùng một giây, cùng một đoạn code, không có chỗ nào người dùng bỏ được ở giữa — hai dòng số luôn bằng nhau, đọc chậm mà không thêm thông tin nào.

Event bị xoá (tên cũ)Trùng với
gdpr_start — bắt đầu hỏi consentapp_open
splash_done — Splash xongon03_splash_end
intro_p1 — thấy trang 1 của Introon03_splash_end
intro_done — Intro xongon05_intro_end
lang_show — thấy màn Languageon05_intro_end
wall_show — thấy màn ChooseWallpaperon06_lang_done
hello_show — thấy màn Helloon07_wall_done

Toàn bộ tên event bộ cũ đã xoá hẳn khỏi appob01ob17 (lần mở đầu tiên) và rt01rt05 (các lần mở sau). Không có bản chạy song song hai bộ tên: từ ngày phát hành, tên cũ tụt về 0.

🛑 QA lưu ý — một thứ đã bị bỏ rồi trả lại
Lúc bỏ paywall khỏi onboarding, inter ads khi đóng màn mua gói từ Cài đặt / Theme Store cũng bị bỏ theo (cùng một chỗ xử lý). Việc này đã sửa lại ở bản sau — đóng màn mua gói từ Cài đặt / Theme Store vẫn ra inter ads như trước.
Nếu đang test bản giữa mà thấy không ra ads ở chỗ này thì không phải bug mới, kiểm tra lại là bản nào trước khi báo.

4 Event funnel hiện tại còn gì

Trang chính để đọc funnel vẫn là Flow mở app → Home. Mục này chỉ chốt lại: sau khi cắt, còn đúng những event nào và tên cũ tương ứng là gì.

Lần cài xong mở đầu tiên — 9 step

StepEventNghĩaParam kèm theo
01on01_app_openMở app, vào màn Splash
02on02_gdpr_doneForm consent của Google trả kết quả (ngoài vùng GDPR thì qua luôn)ms · can_ads · error_code
03on03_splash_endRời màn Splash. Cũng là mốc đóng vị trí full-screen ads của màn nàyreason (normal/timeout) · dur_ms
04on04_intro_p2_p5Thấy trang 2 → 5 của Intro, mỗi trang một event. Trang 1 không có event riêng (trùng step 03)
05on05_intro_endRời màn Intro (bấm nút ở trang cuối). Cũng là mốc đóng vị trí native ads đáy Intro
06on06_lang_doneBấm Continue rời màn Languagelang
07on07_wall_doneRời màn ChooseWallpaperaction (chọn hình nền / bỏ qua)
08on08_hello_readyNút "Let's Start" ở màn Hello hiện rams
09on09_homeĐích — vào màn hình chínhdur_ms · ad_clicks · had_ad

Một event phụ ở màn Language: on06_lang_select (kèm lang) bắn mọi lần người dùng đổi ý chọn ngôn ngữ khác — cố ý không chống trùng, để đếm số lần đổi ý. Không phải step funnel, đừng kéo vào báo cáo.

Các lần mở app sau — 4 step

StepEventNghĩa
01rn01_app_openMở app
02rn02_gdpr_doneConsent trả kết quả — lượt mở nào cũng chạy
03rn03_splash_endRời màn Splash + mốc đóng vị trí full-screen ads
04rn04_homeĐích — vào màn hình chính

Còn đúng 2 vị trí ads có event riêng

Mỗi vị trí có 4 event con cùng tiền tố với step của nó — on03_splash… (hoặc rn03_splash…) và on05_intro…:

Hậu tốNghĩa
_ad_showAds hiện ra trước mắt người dùng
_ad_not_showAds không hiện, kèm reason cho biết vì sao
_ad_clickBấm vào ads (rời app)
_ad_backQuay lại app sau khi bấm ads, kèm away_ms. Dưới 700 ms không tính (khoá màn / hộp thoại quyền chớp nhoáng)

Các giá trị của reason khi ads không hiện: rc_off (cấu hình từ xa tắt) · premium (đã mua gói) · not_init (bộ ads chưa khởi tạo kịp) · no_consent (consent không cho) · no_fill (không có ads để trả) · timeout (hết giờ chờ) · loaded_no_show (có ads nhưng không show được) · capped (chặn vì quá gần lần trước) · no_ad.

🧮 Ba luật đọc số, không được phá
1. _ad_show + _ad_not_show = _end — luôn đúng, dùng để kiểm số có sai lệch không.
2. Show rate của vị trí ads = _ad_show ÷ _end.
3. Step trong báo cáo funnel phải kéo _end, không kéo _ad_show. Kéo _ad_show thì mọi lượt không có ads (đã mua gói, tắt cấu hình, không có ads để trả…) bị tính là bỏ giữa đường và mất luôn ở mọi step sau.
⚠️ Ba lượt mở app KHÔNG bắn event nào
App biết trước ba lượt này cố ý không có ads nên im hoàn toàn, kể cả rn01_app_open:
  • Vừa đặt iOS Launcher làm launcher mặc định xong, quay lại app
  • Bấm phím Home khi app đã là launcher mặc định (hệ điều hành đã thu hồi bộ nhớ)
  • Vừa đóng một app trong app (Clock, Gallery, Chat AI…)
Đếm chúng vào chỉ phồng mẫu số bằng những lượt không bao giờ có ads.

Dò tên cũ ↔ tên mới

StepTên mới (v1.0.15)Tên cũ (v1.0.14)
01on01_app_openob01_app_open
02on02_gdpr_doneob02_gdpr_done
03on03_splash_endob04_aoa_splash_end + ob05_splash_done (gộp 2 thành 1)
on03_splash_ad_show / _ad_click / _ad_back / _ad_not_showob04_aoa_splash_*
04on04_intro_p2_p5ob06_intro_p2..p5
05on05_intro_endob07_nt_intro_end + ob08_intro_done (gộp)
on05_intro_ad_show / _ad_click / _ad_back / _ad_not_showob07_nt_intro_*
06on06_lang_doneob14_lang_done
on06_lang_selectob11_lang_select
07on07_wall_doneob15_wall_done
08on08_hello_readyob16_hello_ready
09on09_homeob17_home
01rn01_app_openrt01_app_open
02rn02_gdpr_donert02_gdpr_done
03rn03_splash_endrt04_aoa_splash_end
04rn04_homert05_home

Vị trí native ads ở màn Language vẫn chạy nhưng không có step funnel nào. Nó sống suốt màn nên không có mốc "rời vị trí" để đo. Đếm impression của nó bằng event ad_displayed với param placement = native_language_1 — xem trang Events.

🛑 Việc phải làm TRƯỚC ngày phát hành
Dựng lại Funnel exploration trên Firebase theo bộ tên mới (on01on09rn01rn04). Báo cáo cũ giữ nguyên để tra dữ liệu từ v1.0.14 trở về trước.
Dashboard hoặc cảnh báo nào đang treo vào tên cũ sẽ tụt về 0 ngay sau ngày phát hành — đó là đổi tên có chủ ý, không phải mất tracking.
Mốc so được giữa hai bộ chỉ có một: tỉ lệ vào màn hình chính. ob17_home ÷ ob01_app_open = 64,0%on09_home ÷ on01_app_open, mục tiêu 72–78%. Đo theo Users, không theo số lần bắn event.

5 Card set_default + carousel promo

Một dialog duy nhất, chạy ở 2 mode. Mode nào chạy khi nào, chặn bởi gì, bấm vào thì đi đâu.

🔤 Ba từ dùng xuyên suốt mục này
  • dialog — hộp nổi lên giữa màn hình chính. Chỉ có một dialog, chạy ở một trong hai mode dưới.
  • mode FULL — carousel đầy đủ, vuốt ngang qua nhiều card.
  • mode SET_DEFAULT_ONLY — chỉ hiện đúng card set_default, không vuốt được. Đó là card mời người dùng đặt iOS Launcher làm launcher mặc định.
full / set_default_onlygiá trị thật của param mode trên event — mở Firebase thấy đúng hai chữ này.
ModeHình dạngKhi nào chạy
mode FULL
carousel đầy đủ
Dialog vuốt ngang qua nhiều card, thấy hé card hai bên, có dấu chấm chỉ trang Đúng "lượt của nó" — mặc định lượt thứ 1, 6, 11, 16… và còn suất trong ngày
mode SET_DEFAULT_ONLY
một card set_default
Đúng 1 card, không vuốt được Mọi lượt còn lại, và cả lượt của carousel bị chặn — miễn là app chưa là launcher mặc định. Không có limit

"Lượt" tính thế nào

Một lượt = một lần quay lại màn hình chính. Không còn điều kiện "ở nền quá 10 phút" như thiết kế ban đầu — bỏ đi vì carousel đã bị chặn ở phía sau bằng maxShowsPerDay + minMinutesBetweenShows rồi, và lượt chạy nhanh chính là cái làm card set_default xuất hiện đều đặn.

Hành độngCộng lượt?Đếm bằng đường nào
Quay lại app từ một app khác✅ CóTiến trình vừa từ nền trở lại → tín hiệu ON_START của hệ thống
Quay lại sau hộp thoại hệ thống (chọn launcher mặc định, xin quyền)✅ CóCũng là ON_START — hộp thoại hệ thống cũng đẩy app xuống nền
Đóng bất kỳ app trong app về Home — Cài đặt · Theme Store · Control center · Chat AI · Clock · Gallery · Weather · Calculator✅ CóCả 8 app này mở dưới dạng task riêng cùng tiến trình, nên hệ thống không báo "về nền". Phải đếm bằng đường riêng lúc Home sống lại
🧭 Nói ngắn: quay lại Home kiểu nào cũng là 1 lượt
Hai đường đếm ở trên phủ hết mọi cách về màn hình chính, và có khoá chống đếm đôi: đi lạc sang app khác trong lúc đang mở một app trong app rồi quay về thì chỉ tính 1 lượt, không phải 2.
Thứ không cộng lượt: những thao tác chưa từng rời màn hình chính — kéo mở control center / notification center, vuốt sang App Library, vào Spotlight, giữ icon để sắp xếp.

Số lượt cộng dồn từ lúc cài, không bao giờ reset. mode FULL rơi vào lượt 1, rồi cứ mỗi 5 lượt một lần → 1, 6, 11, 16… Con số 5 đổi được từ xa.

Quyết định — 4 nhánh, xét theo đúng thứ tự này

🔀
Lượt này hiện cái gì
nhánh nào khớp trước thì dừng ở đó
1 · Tắt
enabled = false hoặc chưa có lượt nào → không hiện gì.
2 · Lượt 1
Lượt đầu tiên mà chưa là launcher mặc địnhcard set_default, không phải carousel. Lần chạm mặt đầu tiên không nên là dialog 6 trang.
3 · Lượt của carousel
Đúng nhịp lượt còn suất trong ngày đủ giãn cách chưa hiện carousel trong lần chạy này → mode FULL.
4 · Còn lại
Chưa là launcher mặc định → card set_default. Đã là mặc định → không hiện gì.
🔁 Đổi so với thiết kế ban đầu: lượt carousel bị chặn không im hẳn nữa
Trước: đúng lượt carousel mà hết suất ngày / chưa đủ giãn cách → im hẳn lượt đó. Hậu quả là người chưa đặt launcher mặc định mất luôn card set_default ở đúng những lượt đó.
Giờ nhánh 3 hỏng thì rơi xuống nhánh 4 → vẫn hiện card set_default. Đó là cách card set_default hành xử giống hệt dialog cũ.

Limit — chỉ mode FULL mới có

 mode FULLmode SET_DEFAULT_ONLY
Max mỗi ngày3 lầnKhông limit
Cách nhau tối thiểu5 phútKhông có sàn
Trong một lần chạy appTối đa 1 lầnMỗi lần về màn hình chính đều hiện lại
Bộ đếmCó — tự reset sang ngày mớiKhông có bộ đếm nào
🧭 Vì sao card set_default bỏ hẳn limit riêng
Thiết kế ban đầu cấp cho card set_default một bộ limit riêng (setDefaultNudgeMaxPerDay / setDefaultNudgeMinMinutes). Hai param đó đã xoá khỏi cấu hình: card set_default giờ chỉ là nhánh mặc định cho ai chưa đặt launcher mặc định, nên không cần suất riêng. Blob JSON cũ còn mang hai khoá đó vẫn parse được, app bỏ qua chúng.
Ngày reset tính theo mốc 24 giờ kể từ lúc cài, không phải theo nửa đêm.

Khi nào KHÔNG hiện

Áp cho cả hai chế độ. Xét trước khi trừ suất, nên lượt bị chặn không tiêu mất suất của ngày.

  • Đang không ở màn hình chính (Cài đặt, Theme Store, một app trong app…)
  • Đang mở control center hoặc notification center
  • Hỏi quyền thông báo chưa xong — hộp thoại hệ thống phải đóng trước
  • Đang ở chế độ rung icon để sắp xếp, đang mở menu giữ-icon, hoặc đang mở picker
  • Đang có full-screen ads hiện hoặc đang tải — không bao giờ đè dialog lên ads
  • Dialog đang mở sẵn (chặn đánh giá lại lần hai)
  • Không còn trang nào đủ điều kiện — đã là mặc định + đã mua gói thì carousel rỗng

Sau khi ads mở-app lúc quay lại app chạy xong, cờ "lần chạy này đã hiện carousel" được mở lại — carousel có thể hiện thêm một lần nữa nếu vẫn còn suất ngày và đủ giãn cách.

6 trang trong carousel

TrangHiện với aiBấm vào thì đi đâu
Đặt làm mặc địnhChỉ khi app chưa là launcher mặc địnhBung hộp thoại của hệ điều hành để chọn Home app (máy cũ thì mở Cài đặt → Ứng dụng mặc định)
ThemeTất cảMở kho theme / hình nền
Cài đặtTất cảMở Cài đặt
Control centerTất cảMở màn thiết lập control center (không phải màn tuỳ biến giao diện — hiện chưa có đường vào thẳng màn đó)
Chat AITất cảMở Chat AI
Mua góiChỉ khi chưa mua góiMở màn mua gói

Thứ tự trang vừa xoay vòng vừa ưu tiên theo mức dùng: trang của app người dùng ít mở được đẩy lên trước. Xếp theo 4 nhóm mức dùng — 0 lần · 1–3 · 4–10 · trên 10 — trong cùng nhóm thì giữ nguyên thứ tự xoay vòng. Thứ tự được nhớ lại giữa các lần mở app, kể cả trang đang không đủ điều kiện hiện vẫn giữ chỗ trong hàng. Ưu tiên theo mức dùng luôn bật, không còn công tắc tắt nó nữa.

Bấm vào một trang thì gì xảy ra

👆
Bấm nút trên trang đang ở giữa
bấm vào card đang hé bên cạnh thì nó chỉ trượt vào giữa, không kích hành động
1 · Ghi nhận
Bắn event kèm tên trang, lượt thứ mấy, trang đó đang ở vị trí thứ mấy trong hàng.
2 · Xoay thứ tự
Trang vừa chọn bị đẩy xuống cuối hàng và nhớ lại. Lần carousel sau mở đầu bằng trang khác.
3 · Đóng dialog
Dialog đóng trước, rồi mới mở đích.
4 · Mở đích
Theo bảng 6 trang ở trên. Riêng Đặt làm mặc định: trước khi bung hộp thoại hệ thống, app tự tắt ads mở-app 1 lần — vì màn chọn Home app đưa app xuống nền, không tắt thì lúc quay lại ăn ads ngay giữa flow đang đặt launcher.

Đóng bằng cách khác: bấm ra ngoài card hoặc bấm nút back → đóng và ghi nhận là bỏ qua, không xoay thứ tự. Vuốt qua trang khác hoặc bấm dấu chấm → chỉ đổi trang.

🧠 Hai điểm dễ hiểu sai
1. Suất bị trừ lúc carousel HIỆN, không phải lúc chọn — và chỉ mode FULL mới trừ. Xem rồi bỏ qua vẫn tiêu 1 trong 3 suất của ngày; trừ sau khi chọn thì người bỏ qua sẽ bị hiện lại liên tục. Card set_default không trừ gì cả.
2. Chọn một trang thì lần sau trang đó tụt hạng gấp đôi. Vừa bị đẩy xuống cuối hàng, vừa bị tính là "app này đã mở rồi" nên mất ưu tiên của nhóm ít-mở. Đúng ý định: đừng nhắc lại thứ người dùng vừa xem.

Event mới

EventBắn khi nàoParam
promo_carousel_shownDialog hiện ramode (full / set_default_only) · turn (lượt thứ mấy)
promo_carousel_page_pickedBấm CTA trên card đang ở giữapromo_page · turn · position (card đó đứng thứ mấy trong hàng, tính từ 0)
promo_carousel_dismissedBấm ra ngoài card hoặc bấm backmode · turn

Param source mới trên mini_app_open

Không phải event mới — mini_app_open đã chạy từ trước. Đợt này nó được gắn thêm param source: mở mini app đó từ chỗ nào.

🎯 Đây là chỗ đo carousel có đáng giữ không
mini_app_open{app} một mình chỉ trả lời "mini app nào được mở nhiều nhất". Thêm source trả lời "và mở từ đâu" — đó mới là số quyết định một surface (carousel promo · DailyOpen · App Library) có đáng giữ hay không.
Đọc phần đóng góp của carousel: lọc source = promo_carousel.
Giá trị sourceMở mini app từ đâu
promo_carouselCTA trên card của dialog promo — số cần theo dõi của đợt này
homeIcon trên một trang màn hình chính
dockIcon dưới dock
folderIcon bên trong một thư mục đang mở
daily_openTrang DailyOpen — widget shortcut + hàng app vừa dùng
app_libraryApp Library, cả danh sách nhóm lẫn kết quả tìm
spotlightÔ tìm Spotlight
settingsCài đặt — danh sách Functions, các dòng mini app, deep-link
control_centerTile hoặc shortcut trong control center
widgetChạm widget trên màn hình chính (weather / clock / photos)
theme_storeCTA trong Theme Store (vd sheet Add-Widget → "Get widgets")
inhouse_appMột mini app mở mini app khác
notificationNotification báo thức / icon alarm trên status bar → Clock. Không phải surface của launcher
unknownThiếu thông tin nguồn — hệ điều hành dựng lại task, hoặc một chỗ gọi quên gắn. Số này lên cao là bug, không phải hành vi người dùng
⚠️ Hai điều phải nhớ khi dựng báo cáo
1. Khai source là Custom definition (Dimension) — chưa khai thì không lọc được, và không hồi tố: chỉ có dữ liệu từ lúc khai trở đi.
2. Đừng đổi tên giá trị sau khi phát hành. Đổi promo_carousel thành tên khác là cắt đôi dữ liệu lịch sử của surface đó trên GA4.
Mở lại mini app khi task của nó còn sống (về Home rồi chạm icon lần nữa) cũng tính một mini_app_open, và source đọc theo lần chạm mới — mở lại từ chỗ khác thì ra giá trị khác.
🛑 Bật carousel là funnel đặt launcher mặc định cũ chết
Dialog cũ (default_launcher_prompt) và carousel không chạy cùng lúc — chỉ một trong hai sống, quyết bởi công tắc ở mục 6. Bật carousel thì default_launcher_prompt ngừng bắn hoàn toàn.
Báo cáo nào đang đo tỉ lệ đặt launcher mặc định phải chuyển sang: promo_carousel_shown với mode = set_default_onlypromo_carousel_page_picked với promo_page = SET_DEFAULT. Chuyển trước khi bật, không thì đọc ra như funnel chết.

🧪 Demo thử tại chỗ

Mô phỏng đúng 4 nhánh quyết định ở trên — cùng cách đếm lượt, cùng limit, cùng cách xếp thứ tự trang. Đổi cấu hình rồi bấm các nút hành động để xem chế độ nào chạy, hoặc vì sao không hiện gì.

ℹ️ Demo này khác app thật ở đâu
Không có ảnh minh hoạ trong card (ô xám thay chỗ) · không mô phỏng ads chặn dialog · thời gian là giờ giả lập, bấm nút mới trôi. Nút Đánh giá lại tại chỗcủa riêng demo — app thật không có đường nào về màn hình chính mà không cộng lượt. Mọi thứ còn lại chạy đúng như app.

Cấu hình từ xa

Trạng thái người dùng

Hành động

Bộ đếm hiện tại

Giờ giả lập
Số lượt0
Lượt này của carousel?
Carousel hôm nay0
Carousel lần cuốichưa
Lần chạy app này đã hiện carousel?chưa

Thứ tự trang đang nhớ

Màn hình chính

Bấm nút xanh = chọn trang đó · bấm Bỏ qua = bấm ra ngoài card

Event bắn ra

✅ 4 tình huống nên thử
  • Lượt 1 ra card set_default, không ra carousel. Reset, bấm Quay lại app từ app khác 1 lần → hiện card set_default dù lượt 1 đúng nhịp carousel. Giờ tick Đã là launcher mặc định rồi Reset + bấm lại → lần này ra mode FULL.
  • Card set_default không có limit. Giữ cấu hình mặc định, bấm Đóng app trong app về Home nhiều lần liên tiếp → trừ lượt trúng nhịp carousel, lần nào cũng ra card set_default, không bao giờ im. Đó là điều kiện để tỉ lệ đặt launcher mặc định không tụt.
  • Lượt carousel bị chặn thì RƠI XUỐNG card set_default. Reset, đặt maxShowsPerDay = 1, tick Đã là launcher mặc định, bấm Quay lại app từ app khác → carousel hiện, tiêu hết suất ngày. Bỏ tick mặc định rồi bấm tiếp tới lượt 6 → hết suất nên không ra carousel, nhưng vẫn ra card set_default chứ không im hẳn.
  • Chọn 1 trang thì lần sau trang đó tụt hạng gấp đôi. Ở lượt carousel, vuốt tới trang Theme rồi bấm nút xanh. Xem hàng chip bên trái: Theme xuống cuối hàng và số # của nó tụt xuống hạng chót vì đã tính là "app này đã mở rồi".
⚠️ Trạng thái phần này
Đã vào code, chưa phát hành. Hai trang Cài đặtChat AI còn ảnh tạm, chờ design. Bốn trang còn lại (đặt mặc định · theme · control center · mua gói) đã có giao diện thật.

6 Cấu hình từ xa mới

Đúng 1 khoá mới trong cả bản này. Các công tắc còn lại không đổi — xem trang Remote Config.

Khoá: promo_carousel_config. Kiểu JSON chứ không phải một dãy công tắc rời, vì bên trong có một danh sách thứ tự trang — dạng công tắc số/bật-tắt không diễn tả được danh sách. Không set gì thì app dùng toàn bộ giá trị mặc định ở bảng dưới.

ParamMặc địnhNghĩaChỉnh khi nào
enabledtrue Bật carousel promo Đặt false = quay về dialog đặt launcher mặc định cũ. Đây là đường lùi không cần phát hành bản mới
recurrenceEveryTurns5 Sau lượt 1, cứ mỗi bao nhiêu lượt lại hiện mode FULL → mặc định ra lượt 1, 6, 11, 16… Nâng lên để giãn tần suất
maxShowsPerDay3 Max số lần hiện mode FULL trong một ngày. 0 = không limit Hạ xuống nếu người dùng phản hồi thấy dialog nhiều
minMinutesBetweenShows5 Số phút tối thiểu giữa hai lần mode FULL. 0 = không sàn Nâng lên để giãn thêm trong ngày
pageOrder6 tên trang Vừa là thứ tự mặc định vừa là danh sách cho phép — trang không có tên trong đây thì không bao giờ hiện Bỏ một trang khỏi vòng xoay = xoá tên nó khỏi danh sách này
🗑️ 5 khoá của thiết kế ban đầu đã bỏ
resumeDebounceMinutes · firstShowTurn · setDefaultNudgeMaxPerDay · setDefaultNudgeMinMinutes · perAppWeightEnabled.
Lượt giờ đếm mọi lần quay lại Home (không debounce) · lượt đầu tiên cố định là 1 · card set_default không còn suất riêng · ưu tiên app ít mở luôn bật. Blob JSON cũ còn mang các khoá này vẫn parse được — app bỏ qua chúng, không cần dọn gấp.

Giá trị mẫu — dán được thẳng vào Firebase

{
  "enabled": true,
  "recurrenceEveryTurns": 5,
  "maxShowsPerDay": 3,
  "minMinutesBetweenShows": 5,
  "pageOrder": ["SET_DEFAULT", "THEME", "SETTINGS", "CONTROL_CENTER", "CHAT_AI", "SUB"]
}

Ba kịch bản chỉnh nhanh

🎛️
Việc hay phải làm
sửa 1 param, không cần phát hành bản mới
Tắt hẳn carousel
enabledfalse. App quay về dialog đặt launcher mặc định cũ. Nhớ chuyển báo cáo về event cũ, xem cảnh báo ở mục 5.
Giảm tần suất
recurrenceEveryTurns 5 → 8 (giãn theo lượt) hoặc maxShowsPerDay 3 → 1 (giãn theo ngày). Đừng đổi cả hai một lúc, không tách được nguyên nhân. Giảm carousel không làm card set_default thưa đi — nó không có limit.
Bỏ 1 trang
Xoá tên trang khỏi pageOrder. Ví dụ tạm bỏ trang mua gói: để lại 5 tên, không có "SUB". Các trang còn lại tự dồn lên.

7 Thay đổi ads khác trong cùng đợt

Không thuộc flow mở app, nhưng nằm cùng khoảng thời gian này — ghi ở đây để không ai tưởng chúng rơi khỏi tài liệu.

  • Bỏ hẳn 3 vị trí native ads có show rate dưới 35%: trong tab Alarm của Clock (29%) · trong album ảnh của Gallery (32%) · trong thùng rác ảnh của Gallery (30%). Cả ba đều nằm dưới màn hình đầu ở những màn người dùng rời rất nhanh — số request bỏ ra không thu lại được impression tương ứng. Ba tab còn lại của Clock giữ nguyên. Không thêm lại nếu chưa đổi được vị trí đặt slot.
  • Native ads ở 2 trang màn hình chính: giờ chỉ bắt đầu load khi trang đã dừng hẳn (trước đây trang bên cạnh được dựng sẵn nên load cả ads của trang người dùng chưa xem). Đồng thời giữ lại ads chưa ai xem thay vì huỷ đi rồi load lại.
  • Trả lại inter ads khi đóng màn mua gói từ Cài đặt / Theme Store — xem mục 3.
📎 Đọc chi tiết ads ở đâu
Danh sách đủ các vị trí ads, luật cache và các trường hợp fallback vẫn ở trang Ads. Mục này chỉ liệt kê phần đổi trong đợt này.