如何在 Android 和 iOS 上衡量行動 App 的第 1 天與第 7 天留存率?第一週用戶留存率的計算方式,是將在指定里程碑記錄合格工作階段的活躍實體數量(
用戶留存率衡量的是已獲取的行動應用程式用戶群組中,在指定時間間隔內回訪並與應用程式進行活躍互動的比例。在行動分析中,第一週用戶留存率(
)為後續的客戶終身價值(LTV)分析提供了早期的行為輸入,用於評估新用戶是否能成功從初始安裝轉換為習慣性的產品使用。
| 名詞 | 定義 | 相關實體 | 搜尋意圖角色 |
|---|---|---|---|
| 用戶留存率 (User Retention) | 衡量跨指定時間間隔的重複用戶互動情況。 | 留存率 | 資訊型 / 商業型 |
| 留存率 (Retention Rate) | 初始群組在特定經過天數中保持活躍的數學百分比。 | App 分析 | 技術型 / 資訊型 |
| 群組分析 (Cohort Analysis) | 透過共同的時間或行為錨點將用戶分組,以追蹤隨時間變化的留存狀況。 | 用戶旅程 | 資訊型 |
為什麼第一週主導了行動 App 用戶留存生命週期
關鍵視窗:為什麼第一週是重要的早期留存觀察視窗
應用程式下載後的頭七天通常被用作早期的留存觀察視窗,因為許多團隊會在長期群組資料可用之前,先追蹤第 1 天、第 3 天和第 7 天的里程碑。早期流失的形態與陡峭程度會因產品節奏、變現模式和類別而有顯著差異。
第一週的留存率提供了群組行為的早期訊號,但它並不能獨立決定長期的留存結果。第 7 天提供了額外的早期留存檢查點,但它並不能決定後續第 30 天或第 90 天的結果。必須獨立衡量長期群組。追蹤早期的留存曲線可讓工程與成長團隊識別早期的惡化模式,並在擴大行銷支出之前,判斷是否需要調查引導流程、獲客品質、產品穩定性或其他因素。
定義活躍互動:區分有意義的工作階段與短暫的背景啟動
要準確衡量第一週的留存率,必須在客戶端遙測中建立明確的活躍狀態標準。將每一次原始的應用程式啟動或背景執行都計算為活躍留存事件,會導致衡量失真。
作業系統會執行背景工作——例如內容預先載取、推送權杖同步或定期的背景重新整理——這些會在沒有用戶實際參與的情況下初始化應用程式行程。同理,在幾秒鐘內被關閉的短暫意外開啟,也可能不符合產品定義的互動標準。
行動分析管線使用明確的多因素標準來定義活躍狀態資格:
- 最低前景持續時間 (Minimum Foreground Duration): 持續的前景 UI 活動需符合說明性的產品定義門檻(例如持續執行
)。 - 前景狀態驗證 (Foreground State Verification): 確認應用程式已轉換至可互動的 UI 狀態(在 Android 上為
ProcessLifecycleOwnerDefaultLifecycleObserver.onResume,或在 iOS 上為應用程式層級的活躍狀態)。 - 合格事件執行 (Qualifying Event Execution): 成功完成重要的應用程式內里程碑(例如執行搜尋查詢、串流內容或更新個人資料)。
第 1 天流失與第 7 天留存穩定性之間的關係
第 1 天留存率(
第 7 天留存率評估的是早期習慣養成。在第 1 天到第 7 天之間,最初的新鮮感消退,用戶留存開始取決於重複的實用性、通知相關性以及有機的產品工作流程。強勁的第 1 天表現若伴隨疲弱的第 7 天留存,則識別出早期至週中的惡化模式,但在將該模式歸因於引導品質或產品價值交付之前,仍需透過獲客管道、App 版本和功能互動進行額外的區隔分析。

如何制定與計算第 1 天到第 7 天的留存率
基準群組與活躍回訪集合的集合論定義
為了確保分析引擎和資料倉儲模型之間的數學精確性,早期留存指標是使用正式的集合符號來制定的。
令
其中
令
其中
計算第一週里程碑的經典精確日留存率
經典 N 天留存率嚴格評估相對於第 0 天特定日曆日邊界的互動情況。
確切的第
關鍵的第一週里程碑包括:
- 第 1 天留存率(
): 評估在剛好第 1 天( )活躍的群組比例:
- 第 3 天留存率(
): 評估在剛好第 3 天( )活躍的群組比例:
- 第 7 天留存率(
): 評估在剛好第 7 天( )活躍的群組比例:
在確切日模型中,在第 6 天和第 8 天活躍、但在第 7 天不活躍的用戶將被排除在

區分第 N 天未回訪與營運生命週期流失
在第一週分析中,區分單日未回訪佔比與營運生命週期流失至關重要。在確切日留存中,補數值(
營運生命週期流失的定義是透過持續的無活動門檻(例如在連續 14 或 30 天內記錄到零個合格工作階段)或明確的終端事件(例如帳戶刪除)。將第 1 天的未回訪視為永久流失,會導致不準確的生命週期建模以及過早的重新獲客支出。
在 Android 與 iOS SDK 間架構第一週遙測管線
為行程層級的工作階段狀態機進行埋設
建立準確的留存衡量管線,需要捕捉應用程式層級的前景轉換,同時在內部畫面導航期間避免產生人工的工作階段分割。
為了確保遙測完整性:
- 應用程式層級生命週期追蹤: 用戶端會監控整體的應用程式前景狀態,當用戶在個別檢視或 Activity 之間導航時,避免過早終止工作階段。行程層級的回呼適用於粗略的工作階段資格認定;需要高精度互動計時的產品應使用更細緻的前景計時來源。
- 獨立的活躍資格認定: 進入前景會記錄原始的生命週期時間戳記,但只有在工作階段持續時間達到產品門檻(持續執行
)或發生重要業務事件時,才會被標記為合格的活躍留存事件。 - 本地事件佇列: 遙測事件會儲存在持久的本地佇列中,並透過具等冪性的重試權杖以非同步方式發送,以防止網路中斷期間發生事件遺失。
開發人員可以參考 行動分析 SDK 套件來評估客戶端二進位檔與實作模組。
Android 實作:行程層級的生命週期觀察與參數擷取
在 Android 上,應用程式層級的前景追蹤是使用 androidx.lifecycle.ProcessLifecycleOwner(屬於 androidx.lifecycle:lifecycle-process 套件的一部分)來實作,以觀察複合行程狀態轉換。這能避免在不同 Activity 之間轉換時產生錯誤的工作階段分割。請注意,在多行程架構中,ProcessLifecycleOwner 僅會監控當前的應用程式行程。
以下 Kotlin 實作展示了行程層級的生命週期觀察,結合了針對 OpoInstall Android SDK 的延遲安裝參數擷取(請針對安裝的 SDK 版本驗證方法簽章)。為求簡潔,此處省略了生產環境的佇列持久性與重試傳輸機制:
```kotlin
// Android Kotlin 實作
package com.example.analytics.lifecycle
import android.app.Application
import android.os.SystemClock
import android.util.Log
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import com.opoinstall.api.OpoInstall
import com.opoinstall.api.OpoData
import com.opoinstall.api.OpoError
import com.opoinstall.api.ResultCallBack
// 注意:需要 androidx.lifecycle:lifecycle-process 套件。
// 注意:在多行程架構中,ProcessLifecycleOwner 僅追蹤目前行程。
class AnalyticsApplication : Application(), DefaultLifecycleObserver {
private var sessionStartElapsedMs: Long = 0
private var isCoreActionCompletedInSession: Boolean = false
override fun onCreate() {
super.onCreate()
// 註冊行程層級生命週期觀察者以捕捉全應用程式的前景轉換
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
// 初始化 OpoInstall 核心 SDK
OpoInstall.initialize(this)
// 在初始第 0 天啟動時檢索延遲安裝參數
fetchDeferredInstallationParameters()
}
private fun fetchDeferredInstallationParameters() {
OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
override fun onResult(opoData: OpoData?) {
opoData?.let { data ->
val customParams = data.data // 動態參數(例如 inviter_token、promo_code)
val channelCode = data.channelCode // 獲客管道識別碼
// 記錄已清理的後設資料,而非原始動態負載
val hasPayload = !customParams.isNullOrEmpty()
Log.i(TAG, "參數還原完成:payload_present=$hasPayload, channel=$channelCode")
// 將用戶直接引導至目標內容或預先填入推薦憑證
applyOnboardingContext(customParams, channelCode)
}
}
override fun onError(error: OpoError?) {
Log.w(TAG, "參數還原已略過或逾時:${error?.errorMsg}")
}
})
}
private fun applyOnboardingContext(customParams: String?, channelCode: String?) {
// 用於填入推薦碼並引導至指定工作區的商業邏輯
}
override fun onResume(owner: LifecycleOwner) {
// 應用程式在行程層級進入可互動的前景狀態
// 使用單調時鐘以防止牆鐘時間跳動導致失真
sessionStartElapsedMs = SystemClock.elapsedRealtime()
isCoreActionCompletedInSession = false
Log.d(TAG, "行程已進入可互動前景。工作階段計時器已啟動。")
}
override fun onPause(owner: LifecycleOwner) {
// 應用程式在行程層級離開可互動的前景狀態
val sessionDurationSeconds = (SystemClock.elapsedRealtime() - sessionStartElapsedMs) / 1000
// 評估活躍留存資格:持續時間 >= 10 秒或完成核心里程碑
val isQualifiedActiveSession = sessionDurationSeconds >= 10 || isCoreActionCompletedInSession
if (isQualifiedActiveSession) {
emitQualifiedRetentionSession(durationSeconds = sessionDurationSeconds)
} else {
Log.d(TAG, "短暫工作階段(<10 秒,無核心動作)已從活躍留存中排除。")
}
}
fun markCoreActionCompleted() {
isCoreActionCompletedInSession = true
}
private fun emitQualifiedRetentionSession(durationSeconds: Long) {
// 發送結構化遙測事件至分析接收中介軟體
Log.i(TAG, "記錄合格的活躍工作階段:duration=${durationSeconds}s")
}
companion object {
private const val TAG = "RetentionAnalytics"
}
}
iOS 實作:畫面生命週期追蹤與動態上下文檢索
在現代 iOS 架構(iOS 13+)中,UISceneDelegate 會管理特定畫面的生命週期事件與通用連結(Universal Links)路由。為了在多畫面或多視窗環境(例如 iPadOS)中準確追蹤全 App 的整體工作階段狀態,遙測層會監聽 UIApplication 生命週期通知(didBecomeActiveNotification、willResignActiveNotification 和 didEnterBackgroundNotification),以累積互動活躍區間,並在進入背景時完成工作階段資格認定。
以下 Swift 實作展示了畫面層級路由、通用連結處理以及針對 OpoInstall iOS SDK 的整體應用程式工作階段追蹤(請針對安裝的 SDK 版本驗證方法簽章)。為求簡潔,此處省略了生產環境的佇列持久性與重試傳輸機制:
// iOS Swift 實作
import UIKit
import libOpoInstallSDK
// 專用單例,用於協調跨畫面的整體應用程式層級工作階段遙測
final class AppSessionTracker {
static let shared = AppSessionTracker()
private var activeIntervalStartTime: Date?
private var accumulatedActiveDuration: TimeInterval = 0
private var isCoreActionCompletedInSession: Bool = false
private var isSessionInProgress: Bool = false
private init() {
// 監聽應用程式層級的活躍/非活躍以及前景/背景狀態邊界
NotificationCenter.default.addObserver(
self,
selector: #selector(handleAppDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(handleAppWillResignActive),
name: UIApplication.willResignActiveNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(handleAppDidEnterBackground),
name: UIApplication.didEnterBackgroundNotification,
object: nil
)
}
@objc private func handleAppDidBecomeActive() {
if !isSessionInProgress {
isSessionInProgress = true
accumulatedActiveDuration = 0
isCoreActionCompletedInSession = false
print("應用程式已進入前景。工作階段生命週期已啟動。")
}
activeIntervalStartTime = Date()
print("活躍區間已啟動。")
}
@objc private func handleAppWillResignActive() {
if let startTime = activeIntervalStartTime {
accumulatedActiveDuration += Date().timeIntervalSince(startTime)
activeIntervalStartTime = nil
print("活躍區間已暫停。累計活躍持續時間:\(accumulatedActiveDuration)s")
}
}
@objc private func handleAppDidEnterBackground() {
guard isSessionInProgress else { return }
// 確保累積任何進行中的活躍區間持續時間
if let startTime = activeIntervalStartTime {
accumulatedActiveDuration += Date().timeIntervalSince(startTime)
activeIntervalStartTime = nil
}
let totalActiveDuration = accumulatedActiveDuration
// 評估活躍留存資格:活躍持續時間 >= 10.0 秒或完成核心里程碑
let isQualifiedActiveSession = totalActiveDuration >= 10.0 || isCoreActionCompletedInSession
if isQualifiedActiveSession {
emitQualifiedRetentionSession(duration: totalActiveDuration)
} else {
print("短暫工作階段(活躍時間 <10 秒,無核心動作)已從活躍留存中排除。")
}
// 在進入背景時完成並重設工作階段狀態
isSessionInProgress = false
accumulatedActiveDuration = 0
activeIntervalStartTime = nil
isCoreActionCompletedInSession = false
}
func markCoreActionCompleted() {
isCoreActionCompletedInSession = true
}
private func emitQualifiedRetentionSession(duration: TimeInterval) {
// 發送結構化遙測事件至分析接收閘道
print("記錄合格的活躍工作階段:duration=\(duration)s")
}
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate, OpoInstallDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
// 初始化整體工作階段追蹤器
_ = AppSessionTracker.shared
// 初始化 OpoInstall 委派
OpoInstallSDK.initWith(self)
// 從終止狀態啟動時處理通用連結
for userActivity in connectionOptions.userActivities {
OpoInstallSDK.continue(userActivity)
}
// 在第 0 天檢索延遲安裝參數
fetchDeferredInstallationParameters()
}
private func fetchDeferredInstallationParameters() {
OpoInstallSDK.defaultManager()?.getInstallParmsCompleted({ [weak self] (appData: OpoinstallData?) in
guard let self = self, let data = appData else { return }
let customParams = data.data // 自訂動態參數字典
let channelCode = data.channelCode // 獲客管道識別碼
// 記錄已清理的後設資料,而非原始動態負載
let hasPayload = customParams != nil
print("已完成還原 iOS 參數:payload_present=\(hasPayload), channel=\(String(describing: channelCode))")
// 執行自動化引導路由與獎勵綁定
self.applyOnboardingContext(customParams: customParams, channelCode: channelCode)
})
}
private func applyOnboardingContext(customParams: [AnyHashable: Any]?, channelCode: String?) {
// 將回訪用戶直接引導至目標內容的商業邏輯
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
// 當應用程式從背景轉換至前景時處理通用連結
OpoInstallSDK.continue(userActivity)
}
// MARK: - OpoInstallDelegate 回呼
func getWakeUpParams(_ appData: OpoinstallData?) {
if let data = appData {
print("收到一鍵喚醒參數:channel=\(String(describing: data.channelCode))")
}
}
}
從活躍留存指標中排除背景系統喚醒與作業系統預先載入
作業系統通常會在沒有用戶參與的情況下在背景初始化應用程式。在 iOS 上,系統可能會在啟動前預先載入應用程式行程,呼叫 application(_:didFinishLaunchingWithOptions:) 而不觸發活躍的畫面轉換。在 Android 上,背景接收器和背景工作執行緒可以初始化 Application 類別。
遙測 SDK 會強制執行嚴格的過濾器,以確保這些背景執行不會汙染留存指標:
- 互動狀態閘道: 除非確認了互動式 UI 狀態(Android 上的
ProcessLifecycleOwner或 iOS 上的活躍應用程式狀態)且滿足產品定義的互動標準,否則行程初始化或背景執行不得計入活躍留存。 - 背景工作排除: 透過 Android Jetpack
WorkManager或 AppleBGTaskScheduler管理的背景工作執行,必須明確標記並從用戶活躍留存計算中排除。
參數化引導如何提升第一週活躍互動
第 0 天摩擦障礙:引導障礙與早期未回訪
引導摩擦是早期未回訪的潛在成因之一,特別是在用戶安裝後必須手動重建推薦或目的地上下文的情況下。在傳統的獲客流程中,點擊宣傳連結、推薦邀請或網紅活動的用戶會被引導至應用程式商店。開啟 App 時,他們會遇到需要手動輸入優惠碼或團隊 ID 的通用引導流程。
要求手動輸入表單會迫使 用戶在不同的應用程式之間切換以複製代碼,從而產生程序上的摩擦。當引導無法立即提供促使下載的上下文時,第 1 天的回訪率可能會受到影響。
動態上下文拼湊:在啟動時檢索推薦權杖與深度連結路由上下文
參數化引導透過在安裝障礙中以程式化方式保留和還原行銷上下文,減少了手動輸入的摩擦。
作為行動歸因與深度連結平台的 OpoInstall,透過在網頁到達網頁上捕捉 URL 查詢參數(例如 ?inviter_id=usr_9988&coupon=SAVE20)來實作延遲深度連結。當用戶第一次安裝並開啟應用程式時,原生行動 SDK 會查詢歸因後端以檢索快取的上下文。
工程師可以參考 參數還原文件,以取得在原生生命週期回呼中解析動態負載字典的技術規格。
自動化歡迎狀態:透過 OpoInstall SDK 交付個人化的初始體驗
在首次啟動時還原參數,可讓應用程式自動化帳戶設定並呈現個人化的歡迎狀態。應用程式不會呈現通用的註冊畫面,而是會解析還原的負載並自動套用推薦碼、加入指定的團隊工作區,或顯示來自初始網頁點擊的特定產品項目。
下圖說明瞭從初始推薦連結點擊到早期留存衡量的端到端資料管線:
[用戶點擊推薦連結] ──> [網頁 SDK 暫存上下文與權杖]
│ │
▼ ▼
[商店安裝與開啟] ──> [OpoInstall SDK 檢索負載]
│ │
▼ ▼
[零代碼參數綁定] ──> [直接路由至內容/獎勵]
│ │
▼ ▼
[第 0 天核心動作] ──> [衡量 D1 與 D7 留存對比控制組]
還原安裝前上下文減少瞭程式摩擦,使產品團隊能夠評估與未協助的控制組相比,順暢的第 0 天引導是否能改善第 1 天和第 7 天的活躍回訪率。

第一週留存衡量方法的比較評估
對比早期留存的經典 N 天、滾動式與區間式衡量模型
選擇適當的留存計算模型取決於產品類別、自然互動頻率以及生命週期特性。如需跨 30 至 90 天視窗的滾動式與區間式留存曲線的詳細數學公式,請參閱專門的生命週期留存文件。
下表對比主要的早期留存方法:
| 留存指標類型 | 計算基礎 | 常見使用情境 | 固有的診斷偏差 |
|---|---|---|---|
| 經典 N 天( |
高頻工具、社交 App、行動遊戲 | 懲罰使用習慣為不規則 2–3 天使用週期的用戶 | |
| 滾動式 / 無界限( |
在第 7 天或之後回訪 | 電子商務、旅遊預訂、間歇性公用程式 | 當用戶在後續幾週回訪時,會歷史性地回填資料 |
| 區間式視窗( |
在第 1–7 天內至少回訪一次 | B2B SaaS、生產力套件、金融工具 | 遮蔽了發生在 7 天區間內的多日沉寂 |
App 內重新互動觸發條件何時對早期留存有效
從產品節奏與用戶狀態選擇重新互動時機
自動化的重新互動機制(例如上下文推播通知、App 內提示與交易型電子郵件)在由明確的用戶行為觸發而非任意時間視窗觸發時,可以支援早期留存。觸發時機應源自預期的產品使用節奏與觀察到的不活躍狀態,而非僵化的通用排程。
重新互動訊息應傳遞功能性實用價值,例如提醒用戶有未讀訊息、突顯未完成的設定任務,或提供相關的產品指引。
上下文深度連結:透過直接路由至未完成的工作流程來重新互動沉寂用戶
將用戶啟動至預設首頁的通用重新互動通知會產生導航摩擦。有效的重新互動會使用上下文深度連結(iOS 上的通用連結、Android 上的 App 連結),將回訪用戶直接引導至能夠立即實現價值的特定介面。
例如,如果用戶在第 0 天建立了帳戶但未完成專案設定,重新互動通知應直接深度連結至專案設定畫面,並預先填入參數。
同意與許可邊界:遵守系統通知授權與退出機制
所有重新互動工作流程都必須嚴格遵守作業系統許可框架以及適用的通訊法律。在 iOS 上,應用程式必須在透過 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) 呈現用戶端警示、聲音或徽章之前請求授權。在 Android 13+ 上,應用程式必須取得 android.permission.POST_NOTIFICATIONS 執行階段許可。
此外,工程團隊必須維持持續的退出狀態管理與頻率上限,以防止通知疲勞。在沒有用戶同意的情況下發送高頻、無上下文的通知可能會造成通知疲勞,並可能導致解除互動或退出。相關要求也可能因管轄區與訊息類型而異;特定行銷活動應取得法律與合規審查。
適合與不適合的第一週留存最佳化介入措施
- 適合的介入措施: 動作觸發的重新互動提示、透過還原參數進行的個人化歡迎路由、動態 App 內引導協助,以及上下文豐富的深度連結。
- 不適合的介入措施: 高頻廣播訊息、在展示價值之前過早發出的許可請求,以及在初次啟動時強制要求手動驗證碼。
常見問題 (FAQ)
第 1 天與第 7 天行動 App 用戶留存率的典型基準為何?
為什麼第 1 天的留存率通常明顯高於第 7 天的留存率?
延遲深度連結如何影響第一週的用戶留存率?
總結與決策框架
衡量並改善第一週的用戶留存率需要結合精確的數學公式、具韌性的客戶端遙測以及無摩擦引導的統一方法。使用確切日、滾動式或區間式模型評估第 1 天到第 7 天的留存率,可讓工程與產品團隊在地化早期留存惡化的位置,並優先處理如引導摩擦或重複實用性不足等假設。
最佳化關鍵的第一週取決於建立明確的活躍狀態標準並消除程序障礙。透過善用輕量級 SDK 整合與上下文參數還原,類似 OpoInstall 的平台提供了支援衡量所需的基礎架構,並為新獲得的用戶提供更低摩擦的首次啟動體驗。
若要評估統一歸因與參數傳遞基礎架構如何支援您應用程式的第一週用戶留存率,請探索 行動歸因實作參考 或在 OpoInstall 開發者主控台 註冊。
相關資料
-
概念: 第一週用戶留存、N 天留存率、區間式留存、上下文參數還原
-
技術: 行動 App 分析、客戶端生命週期遙測、延遲深度連結、S2S Webhook
-
API 與資料介面: Android
ProcessLifecycleOwner(androidx.lifecycle:lifecycle-process)、iOSUIApplication生命週期通知與UIWindowSceneDelegate、OpoInstall SDKgetInstallParamAPI -
官方文件與參考資料:
Share this article



