วิธีวัดผลและปรับปรุงอัตราการคงอยู่ของผู้ใช้แอป (User Retention) ในสัปดาห์แรก

opoinstall
2026-09-01
5 min read

คุณจะวัดอัตราการคงอยู่ของผู้ใช้งานแอปมือถือ (Mobile App Retention) ในวันที่ 1 และวันที่ 7 บน Android และ iOS ได้อย่างไร? การคงอยู่ของผู้ใช้ในสัปดาห์แรกคำนวณได้จากการหารจำนวนเอนทิตีที่ใช้งาน (active entities) ซึ่งบันทึกเซสชันที่ผ่านเกณฑ์ ณ จุดไมล์สโตนที่กำหนด (At|A_t|) ด้วยขนาดกลุ่มผู้ใช้เริ่มต้น (baseline cohort size) (U0|U_0|): R(t)=AtU0×100%R(t) = \frac{|A_t|}{|U_0|} \times 100\%.

การคงอยู่ของผู้ใช้ (User retention) วัดสัดส่วนของกลุ่มผู้ใช้มือถือที่ได้มา ซึ่งกลับมาและมีส่วนร่วมอย่าง active กับแอปพลิเคชันในช่วงเวลาที่กำหนด ในด้านการวิเคราะห์แอปพลิเคชัน การคงอยู่ของผู้ใช้ในสัปดาห์แรก (D0D7D_0 \to D_7) เป็นข้อมูลพฤติกรรมเบื้องต้นสำหรับการวิเคราะห์มูลค่าตลอดชีพของลูกค้า (customer-lifetime-value) ในภายหลัง โดยประเมินว่าผู้ใช้ใหม่เปลี่ยนผ่านจากการติดตั้งครั้งแรกไปสู่การใช้งานผลิตภัณฑ์เป็นประจำได้อย่างสำเร็จหรือไม่

คำศัพท์ คำจำกัดความ เอนทิตีที่เกี่ยวข้อง บทบาทความตั้งใจในการค้นหา
User Retention (การคงอยู่ของผู้ใช้) การวัดการมีส่วนร่วมของผู้ใช้ที่เกิดขึ้นซ้ำในช่วงเวลาที่กำหนด อัตราการคงอยู่ (Retention Rate) เชิงข้อมูล / เชิงพาณิชย์
Retention Rate (อัตราการคงอยู่) เปอร์เซ็นต์ทางคณิตศาสตร์ของกลุ่มผู้ใช้เริ่มต้นที่ใช้งานอยู่ในวันที่ผ่านไปเฉพาะเจาะจง การวิเคราะห์แอป (App Analytics) เชิงเทคนิค / เชิงข้อมูล
Cohort Analysis (การวิเคราะห์กลุ่มผู้ใช้) การจัดกลุ่มผู้ใช้ตามจุดยึดทางเวลาหรือพฤติกรรมร่วมกัน เพื่อติดตามการคงอยู่ตามกาลเวลา เส้นทางผู้ใช้งาน (User Journey) เชิงข้อมูล

ทำไมสัปดาห์แรกจึงควบคุมวงจรการคงอยู่ของผู้ใช้แอปมือถือ

หน้าต่างสำคัญ: ทำไมสัปดาห์แรกจึงเป็นหน้าต่างสังเกตการณ์การคงอยู่ช่วงต้นที่สำคัญ

เจ็ดวันแรกหลังจากการดาวน์โหลดแอปพลิเคชันมักถูกใช้เป็นหน้าต่างสังเกตการณ์การคงอยู่ช่วงต้น เนื่องจากหลายทีมติดตามไมล์สโตนในวันที่ 1, วันที่ 3 และวันที่ 7 ก่อนที่ข้อมูลกลุ่มผู้ใช้ในระยะยาวจะพร้อมใช้งาน รูปร่างและความชันของการลดลงในช่วงต้นจะแตกต่างกันอย่างมากตามจังหวะของผลิตภัณฑ์ รูปแบบการสร้างรายได้ และหมวดหมู่

การคงอยู่ในสัปดาห์แรกให้สัญญาณเริ่มต้นของพฤติกรรมกลุ่มผู้ใช้ แต่ไม่ได้เป็นตัวกำหนดผลลัพธ์การคงอยู่ในระยะยาวโดยอิสระ วันที่ 7 เป็นจุดตรวจสอบการคงอยู่ช่วงต้นเพิ่มเติม แต่ไม่ได้กำหนดผลลัพธ์ในวันที่ 30 หรือวันที่ 90 ต่อมา กลุ่มผู้ใช้ในระยะยาวต้องได้รับการวัดผลอย่างเป็นอิสระ การติดตามเส้นโค้งการคงอยู่ช่วงต้นช่วยให้ทีมวิศวกรรมและการเติบโตสามารถระบุรูปแบบการเสื่อมถอยในช่วงแรก และพิจารณาว่ากระบวนการต้อนรับผู้ใช้ (onboarding) คุณภาพการได้มาซึ่งผู้ใช้ ความเสถียรของผลิตภัณฑ์ หรือปัจจัยอื่น ๆ จำเป็นต้องมีการตรวจสอบก่อนที่จะเพิ่มงบประมาณ

การกำหนดการมีส่วนร่วมแบบ Active: แยกแยะเซสชันที่มีความหมายออกจากการเปิดแอปในเบื้องหลังชั่วคราว

การวัดการคงอยู่ของสัปดาห์ใหม่อย่างแม่นยำจำเป็นต้องมีการกำหนดเกณฑ์สถานะ active ที่ชัดเจนภายใน telemetry ฝั่งไคลเอนต์ การนับทุกการเปิดแอปพลิเคชันดิบหรือการทำงานในเบื้องหลังเป็นเหตุการณ์การคงอยู่แบบ active จะทำให้เกิดความบิดเบือนในการวัด

ระบบปฏิบัติตำแหน่งจะรันงานในเบื้องหลัง เช่น การดึงเนื้อหาล่วงหน้า การซิงโครไนซ์ push token หรือการรีเฟรชเบื้องหลังเป็นระยะ ซึ่งเริ่มต้นกระบวนการแอปพลิเคชันโดยไม่มีผู้ใช้ใช้งานอยู่จริง ในทำนองเดียวกัน การเปิดแอปสั้น ๆ โดยไม่ได้ตั้งใจและปิดไปภายในไม่กี่วินเกณฑ์การมีส่วนร่วมที่ผลิตภัณฑ์กำหนดไว้

ไปปeline การวิเคราะห์มือถือจะกำหนดคุณสมบัติสถานะ active โดยใช้เกณฑ์หลายปัจจัยที่ชัดเจน:

  • ระยะเวลาการแสดงผลเบื้องหน้าขั้นต่ำ (Minimum Foreground Duration): กิจกรรม UI ในเบื้องหน้าอย่างต่อเนื่องที่ตรงตามเกณฑ์ที่ผลิตภัณฑ์กำหนด (เช่น 10 seconds\ge 10\text{ seconds} ของการทำงานต่อเนื่อง)
  • การยืนยันสถานะเบื้องหน้า (Foreground State Verification): การยืนยันว่าแอปพลิเคชันเปลี่ยนเข้าสู่สถานะ UI แบบอินเทอร์แอกทีฟ (ProcessLifecycleOwner \to DefaultLifecycleObserver.onResume บน Android หรือสถานะ active ระดับแอปพลิเคชันบน iOS)
  • การดำเนินการเหตุการณ์ตามเกณฑ์ (Qualifying Event Execution): ความสำเร็จในการทำไมล์สโตนในแอปที่จำเป็น (เช่น การดำเนินการค้นหา การสตรีมเนื้อหา หรือการอัปเดตโปรไฟล์)

ความสัมพันธ์ระหว่างการหลุดออกในวันที่ 1 และความเสถียรของการคงอยู่ ในวันที่ 7

การคงอยู่ในวันที่ 1 (D1D_1) และการคงอยู่ในวันที่ 7 (D7D_7) บันทึกขั้นตอนที่แตกต่างกันของวงจรชีวิตผู้ใช้ช่วงต้น การคงอยู่ในวันที่ 1 วัดพฤติกรรมการกลับมาใช้งานทันทีหลังการติดตั้ง และสามารถวิเคราะห์ร่วมกับ telemetry ของกระบวนการต้อนรับเพื่อประเมินความต่อเนื่องหลังวันที่ 0

การคงอยู่ในวันที่ 7 ประเมินความคุ้นเคยในช่วงต้น ระหว่างวันที่ 1 และวันที่ 7 ความแปลกใหม่เริ่มต้นจะลดลง และการคงอยู่ของผู้ใช้จะขึ้นอยู่กับประโยชน์ใช้สอยที่เกิดขึ้นซ้ำ ความเกี่ยวข้องของการแจ้งเตือน และเวิร์กฟลอว์ผลิตภัณฑ์แบบออร์แกนิก ผลลัพธ์ในวันที่ 1 ที่แข็งแกร่งตามด้วยการคงอยู่ในวันที่ 7 ที่อ่อนแอ จะระบุรูปแบบการเสื่อมถอยในช่วงต้นถึงกลางสัปดาห์ แต่จำเป็นต้องมีการแบ่งกลุ่มเพิ่มเติมตามช่องทางการได้มา เวอร์ชันของแอป และการมีส่วนร่วมกับฟีเจอร์ ก่อนที่จะระบุสาเหตุว่าเป็นคุณภาพของกระบวนการต้อนรับหรือการส่งมอบมูลค่าของผลิตภัณฑ์

การคงอยู่ของผู้ใช้มือถือในสัปดาห์แรกตั้งแต่ D0 ถึง D7

วิธีสร้างสูตรและคำนวณอัตราการคงอยู่จากวันที่หนึ่งถึงวันที่เจ็ด

คำจำกัดความตามทฤษฎีเซตของกลุ่มผู้ใช้เริ่มต้นและชุดการกลับมาใช้งาน

เพื่อให้แน่ใจว่ามีความแม่นยำทางคณิตศาสตร์ในเครื่องมือวิเคราะห์และโมเดลดาต้าแวร์เฮาส์ เมตริกการคงอยู่ช่วงต้นจึงถูกกำหนดสูตรขึ้นโดยใช้สัญกรณ์เซตอย่างเป็นทางการ

ให้ U0U_0 แทนชุดกลุ่มผู้ใช้เริ่มต้นของเอนทิตีที่มีคุณสมบัติครบถ้วน (เช่น อินสแตนซ์แอปที่ไม่ซ้ำกันหรือโปรไฟล์ผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว) ที่สร้างขึ้นในวันที่ตามปฏิทินที่เป็นจุดยึด D0D_0:

U0={u:CohortAnchorEvent(u)=D0}U_0 = \{u : \text{CohortAnchorEvent}(u) = D_0\}

โดยที่ U0|U_0| แทนขนาดกลุ่มผู้ใช้เริ่มต้นทั้งหมด

ให้ AtA_t แทนกลุ่มย่อยของ U0U_0 ที่บันทึกเซสชัน active ที่มีคุณสมบัติครบถ้วนอย่างน้อยหนึ่งเซสชันในวันที่ผ่านไปที่แน่นอน tt โดยที่ t{1,2,3,,7}t \in \{1, 2, 3, \dots, 7\}:

At={uU0:HasQualifyingSession(u,D0+t)=True}A_t = \{u \in U_0 : \text{HasQualifyingSession}(u, D_0 + t) = \text{True}\}

โดยที่ At|A_t| แทนจำนวนเอนทิตี active ที่ไม่ซ้ำกันในวันที่ผ่านไป tt

การคำนวณอัตราการคงอยู่แบบระบุวันเป๊ะ ๆ (Classic Exact-Day Retention) สำหรับไมล์สโตนในสัปดาห์แรก

การคงอยู่แบบ N-Day ดั้งเดิมประเมินการมีส่วนร่วมอย่างเคร่งครัดตามขอบเขตวันในปฏิทินที่สัมพันธ์กับวันที่ 0

อัตราการคงอยู่ของวันที่ tt ที่แน่นอน R(t)R(t) ถูกกำหนดเป็น:

R(t)=AtU0×100%R(t) = \frac{|A_t|}{|U_0|} \times 100\%

ไมล์สโตนสำคัญในสัปดาห์แรกประกอบด้วย:

  • อัตราการคงอยู่ของวันที่ 1 (R1R_1): ประเมินสัดส่วนของกลุ่มผู้ใช้ที่ใช้งานในวันที่ 1 พอดี (D0+1 dayD_0 + 1\text{ day}):
R1=A1U0×100%R_1 = \frac{|A_1|}{|U_0|} \times 100\%
  • อัตราการคงอยู่ของวันที่ 3 (R3R_3): ประเมินสัดส่วนของกลุ่มผู้ใช้ที่ใช้งานในวันที่ 3 พอดี (D0+3 daysD_0 + 3\text{ days}):
R3=A3U0×100%R_3 = \frac{|A_3|}{|U_0|} \times 100\%
  • อัตราการคงอยู่ของวันที่ 7 (R7R_7): ประเมินสัดส่วนของกลุ่มผู้ใช้ที่ใช้งานในวันที่ 7 พอดี (D0+7 daysD_0 + 7\text{ days}):
R7=A7U0×100%R_7 = \frac{|A_7|}{|U_0|} \times 100\%

ในการสร้างแบบจำลองแบบระบุวันเป๊ะ ๆ ผู้ใช้ที่ใช้งานในวันที่ 6 และวันที่ 8 แต่ไม่ใช้งานในวันที่ 7 จะถูกยกเว้นจาก A7A_7 สิ่งนี้ให้ความแม่นยำทางเวลาที่เข้มงวดสำหรับแอปพลิเคชันที่มีความถี่สูง

ชุดข้อมูลการคงอยู่แบบระบุวันเป๊ะสำหรับ D1 D3 และ D7

การแยกแยะระหว่างการไม่กลับมาใช้งานในวันที่ N กับการเลิกใช้งานในวัฏจักรการดำเนินงาน (Churn)

ในการวิเคราะห์สัปดาห์แรก เป็นสิ่งสำคัญที่จะต้องแยกแยะระหว่างสัดส่วนการไม่กลับมาใช้งานในวันเดียวกับการเลิกใช้งานตามวัฏจักรการดำเนินงาน ในการคงอยู่แบบระบุวันเป๊ะ ๆ ค่าส่วนเติมเต็ม (1.0Rt1.0 - R_t) จะแทนสัดส่วนการไม่กลับมาใช้งานสำหรับวันในปฏิทินนั้น ๆ โดยเฉพาะ มันไม่ได้บ่งชี้ว่าผู้ใช้ละทิ้งผลิตภัณฑ์ไปอย่างถาวร เนื่องจากการไม่กลับมาของผู้ใช้ในวันที่ 1 มักจะมีการบันทึกเซสชันที่มีคุณสมบัติในวันที่ 3 หรือวันที่ 7 บ่อยครั้ง

การเลิกใช้งานตามวัฏจักรการดำเนินงานถูกกำหนดผ่านเกณฑ์การไม่มีความเคลื่อนไหวต่อเนื่อง (เช่น การบันทึกเซสชันที่มีคุณสมบัติเป็นศูนย์ตลอด 14 หรือ 30 วันติดต่อกัน) หรือเหตุการณ์สิ้นสุดที่ชัดเจน (เช่น การลบบัญชี) การปฏิบัติว่าการไม่กลับมาในวันที่ 1 เป็นการเลิกใช้งานถาวรจะนำไปสู่การสร้างโมเดลวงจรชีวิตที่ไม่ถูกต้องและการใช้จ่ายเพื่อดึงดูดผู้ใช้กลับมาก่อนเวลาอันควร

การสร้างสถาปัตยกรรมไปپeline Telemetry ในสัปดาห์แรกข้าม SDK ของ Android และ iOS

การติดตั้งเครื่องมือสำหรับเครื่องมือสถานะเซสชันระดับกระบวนการ (Process-Level Session State Machines)

การสร้างไปpeline การวัดการคงหน้าที่แม่นยำจำเป็นต้องมีการจับภาพการเปลี่ยนผ่านเบื้องหน้าในระดับแอปพลิเคชันโดยไม่ทำให้เกิดการแบ่งเซสชันเทียมระหว่างการนำทางหน้าจอภายใน

เพื่อให้แน่ใจว่ามีความสมบูรณ์ของ telemetry:

  1. การติดตามวงจรระดับแอปพลิเคชัน (Application-Level Lifecycle Tracking): ไคลเอนต์จะตรวจสอบสถานะเบื้องหน้าของแอปพลิเคชันโดยรวม โดยหลีกเลี่ยงการยุติเซสชันก่อนกำหนดเมื่อผู้ใช้นำทางระหว่างมุมมองหรือกิจกรรมแต่ละรายการ การเรียกกลับระดับกระบวนการเหมาะสมสำหรับการคัดเลือกเซสชันหยาบ ๆ ส่วนผลิตภัณฑ์ที่ต้องการจังหวะเวลาการมีส่วนร่วมความแม่นยำสูงควรใช้แหล่งเวลาเบื้องหน้าที่มีความละเอียดยิ่งขึ้น
  2. การคัดเลือก Active แบบแยกส่วน (Decoupled Active Qualification): การเข้าสู่เบื้องหน้าจะบันทึกประทับเวลาวงจรดิบ แต่เหตุการณ์การคงอยู่แบบ active จะถูกทำเครื่องหมายว่ามีคุณสมบัติก็ต่อเมื่อระยะเวลาของเซสชันตรงตามเกณฑ์ของผลิตภัณฑ์ (10 seconds\ge 10\text{ seconds}) หรือเมื่อเกิดเหตุการณ์ทางธุรกิจที่จำเป็น
  3. การจัดคิวเหตุการณ์ในเครื่อง (Local Event Queuing): เหตุการณ์ telemetry จะถูกจัดเก็บไว้ในคิวท้องถิ่นที่ทนทานและถูกส่งแบบอะซิงโครนัสพร้อมโทเค็นการลองใหม่แบบ idempotent เพื่อป้องกันการสูญหายของเหตุการณ์ในระหว่างที่เครือข่ายขัดข้อง

นักพัฒนาสามารถอ้างอิง แพ็กเกจ SDK การวิเคราะห์บนมือถือ เพื่อประเมินไบนารีของไคลเอนต์และโมดูลการใช้งาน

การใช้งานบน Android: การสังเกตการณ์วงจรระดับกระบวนการและการนำเข้าพารามิเตอร์

บน Android การติดตามเบื้องหน้าในระดับแอปพลิเคชันจะถูกนำมาใช้โดยใช้ androidx.lifecycle.ProcessLifecycleOwner (ซึ่งเป็นส่วนหนึ่งของอาร์ทิแฟกต์ androidx.lifecycle:lifecycle-process) เพื่อสังเกตการเปลี่ยนผ่านสถานะกระบวนการคอมโพสิต สิ่งนี้ช่วยหลีกเลี่ยงการแยกเซสชันที่ผิดพลาดเมื่อทำการเปลี่ยนผ่านระหว่างกิจกรรม (Activities) ที่แยกจากกัน โปรดทราบว่า ProcessLifecycleOwner จะตรวจสอบเฉพาะกระบวนการแอปพลิเคชันปัจจุบันในสถาปัตยกรรมแบบหลายกระบวนการเท่านั้น

การใช้งาน Kotlin ด้านล่างแสดงการสังเกตการณ์วงจรระดับกระบวนการร่วมกับการดึงพารามิเตอร์การติดตั้งแบบ deferred โดยกำหนดเป้าหมายไปที่ OpoInstall Android SDK (โปรดตรวจสอบลายเซ็นของเมธอดเทียบกับเวอร์ชัน SDK ที่ติดตั้งไว้) โปรดทราบว่าการคงอยู่ของคิวการผลิตและการขนส่งการลองใหม่ถูกละไว้เพื่อความกระชับ:


```kotlin
// Android Kotlin Implementation
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

// Note: Requires androidx.lifecycle:lifecycle-process artifact.
// Note: In multi-process architectures, ProcessLifecycleOwner tracks only the current process.
class AnalyticsApplication : Application(), DefaultLifecycleObserver {

    private var sessionStartElapsedMs: Long = 0
    private var isCoreActionCompletedInSession: Boolean = false

    override fun onCreate() {
        super.onCreate()
        
        // Register process-level lifecycle observer to capture application-wide foreground transitions
        ProcessLifecycleOwner.get().lifecycle.addObserver(this)
        
        // Initialize OpoInstall core SDK
        OpoInstall.initialize(this)
        
        // Retrieve deferred installation parameters on initial Day 0 launch
        fetchDeferredInstallationParameters()
    }

    private fun fetchDeferredInstallationParameters() {
        OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
            override fun onResult(opoData: OpoData?) {
                opoData?.let { data ->
                    val customParams = data.data // Dynamic parameters (e.g., inviter_token, promo_code)
                    val channelCode = data.channelCode // Acquisition channel identifier
                    
                    // Log sanitized metadata rather than raw dynamic payload
                    val hasPayload = !customParams.isNullOrEmpty()
                    Log.i(TAG, "Parameter restoration complete: payload_present=$hasPayload, channel=$channelCode")
                    
                    // Route user directly to intended content or pre-fill referral credentials
                    applyOnboardingContext(customParams, channelCode)
                }
            }

            override fun onError(error: OpoError?) {
                Log.w(TAG, "Parameter restoration bypassed or timed out: ${error?.errorMsg}")
            }
        })
    }

    private fun applyOnboardingContext(customParams: String?, channelCode: String?) {
        // Business logic to populate referral codes and route to designated workspace
    }

    override fun onResume(owner: LifecycleOwner) {
        // Application entered interactive foreground state at process level
        // Use monotonic clock to prevent wall-clock time jump distortion
        sessionStartElapsedMs = SystemClock.elapsedRealtime()
        isCoreActionCompletedInSession = false
        Log.d(TAG, "Process entered interactive foreground. Session timer started.")
    }

    override fun onPause(owner: LifecycleOwner) {
        // Application exited interactive foreground state at process level
        val sessionDurationSeconds = (SystemClock.elapsedRealtime() - sessionStartElapsedMs) / 1000
        
        // Evaluate active retention qualification: duration >= 10s OR core milestone execution
        val isQualifiedActiveSession = sessionDurationSeconds >= 10 || isCoreActionCompletedInSession
        
        if (isQualifiedActiveSession) {
            emitQualifiedRetentionSession(durationSeconds = sessionDurationSeconds)
        } else {
            Log.d(TAG, "Transient session (<10s, no core action) excluded from active retention.")
        }
    }

    fun markCoreActionCompleted() {
        isCoreActionCompletedInSession = true
    }

    private fun emitQualifiedRetentionSession(durationSeconds: Long) {
        // Dispatch structured telemetry event to analytics ingestion broker
        Log.i(TAG, "Logging qualified active session: duration=${durationSeconds}s")
    }

    companion object {
        private const val TAG = "RetentionAnalytics"
    }
}

การใช้งานบน iOS: การติดตามวงจรของ Scene และการดึงข้อมูลบริบทแบบไดนามิก

บนสถาปัตยกรรม iOS สมัยใหม่ (iOS 13+) UISceneDelegate จะจัดการเหตุการณ์วงจรชีวิตเฉพาะของ scene และการกำหนดเส้นทาง Universal Link เพื่อติดตามสถานะเซสชันรวมของแอปทั้งหมดได้อย่างแม่นยำข้ามสภาพแวดล้อมแบบหลาย scene หรือหลายหน้าต่าง (เช่น iPadOS) เลเยอร์ telemetry จะฟังการแจ้งเตือนวงจรชีวิตของ UIApplication (didBecomeActiveNotification, willResignActiveNotification และ didEnterBackgroundNotification) เพื่อสะสมช่วงเวลา active แบบอินเทอร์แอกทีฟและสรุปคุณสมบัติของเซสชันเมื่อเข้าสู่เบื้องหลัง

การใช้งาน Swift ด้านล่างแสดงการกำหนดเส้นทางระดับ scene การจัดการ Universal Link และการติดตามเซสชันแอปพลิเคชันรวม โดยกำหนดเป้าหมายไปที่ OpoInstall iOS SDK (โปรดตรวจสอบลายเซ็นของเมธอดเทียบกับเวอร์ชัน SDK ที่ติดตั้งไว้) โปรดทราบว่าการคงอยู่ของคิวการผลิตและการขนส่งการลองใหม่ถูกละไว้เพื่อความกระชับ:

// iOS Swift Implementation
import UIKit
import libOpoInstallSDK

// Dedicated singleton to coordinate aggregate application-level session telemetry across scenes
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() {
        // Observe application-level active/inactive and foreground/background state boundaries
        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("Application entered foreground. Session lifecycle started.")
        }
        activeIntervalStartTime = Date()
        print("Active interval started.")
    }

    @objc private func handleAppWillResignActive() {
        if let startTime = activeIntervalStartTime {
            accumulatedActiveDuration += Date().timeIntervalSince(startTime)
            activeIntervalStartTime = nil
            print("Active interval paused. Accumulated active duration: \(accumulatedActiveDuration)s")
        }
    }

    @objc private func handleAppDidEnterBackground() {
        guard isSessionInProgress else { return }
        
        // Ensure any ongoing active interval duration is accumulated
        if let startTime = activeIntervalStartTime {
            accumulatedActiveDuration += Date().timeIntervalSince(startTime)
            activeIntervalStartTime = nil
        }
        
        let totalActiveDuration = accumulatedActiveDuration
        
        // Evaluate active retention qualification: active duration >= 10s OR core milestone execution
        let isQualifiedActiveSession = totalActiveDuration >= 10.0 || isCoreActionCompletedInSession
        
        if isQualifiedActiveSession {
            emitQualifiedRetentionSession(duration: totalActiveDuration)
        } else {
            print("Transient session (<10s active, no core action) excluded from active retention.")
        }
        
        // Finalize and reset session state upon backgrounding
        isSessionInProgress = false
        accumulatedActiveDuration = 0
        activeIntervalStartTime = nil
        isCoreActionCompletedInSession = false
    }

    func markCoreActionCompleted() {
        isCoreActionCompletedInSession = true
    }

    private func emitQualifiedRetentionSession(duration: TimeInterval) {
        // Dispatch structured telemetry event to analytics ingestion gateway
        print("Logging qualified active session: 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 }
        
        // Initialize aggregate session tracker
        _ = AppSessionTracker.shared
        
        // Initialize OpoInstall delegate
        OpoInstallSDK.initWith(self)
        
        // Process Universal Links when launched from a terminated state
        for userActivity in connectionOptions.userActivities {
            OpoInstallSDK.continue(userActivity)
        }
        
        // Retrieve deferred installation parameters on Day 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 // Custom dynamic parameters dictionary
            let channelCode = data.channelCode // Acquisition channel identifier
            
            // Log sanitized metadata rather than raw dynamic payload
            let hasPayload = customParams != nil
            print("Restored iOS parameters complete: payload_present=\(hasPayload), channel=\(String(describing: channelCode))")
            
            // Execute automated onboarding routing and reward binding
            self.applyOnboardingContext(customParams: customParams, channelCode: channelCode)
        })
    }

    private func applyOnboardingContext(customParams: [AnyHashable: Any]?, channelCode: String?) {
        // Business logic to route returning user directly to intended content
    }

    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        // Handle Universal Links when app transitions to foreground from background
        OpoInstallSDK.continue(userActivity)
    }

    // MARK: - OpoInstallDelegate Callbacks
    func getWakeUpParams(_ appData: OpoinstallData?) {
        if let data = appData {
            print("One-click launch wakeup params received: channel=\(String(describing: data.channelCode))")
        }
    }
}

ไปป์ไลน์เซสชันการคงอยู่ที่มีคุณสมบัติของ Android และ iOS

การยกเว้นการปลุกระบบเบื้องหลังและการเตรียมพร้อมระบบล่วงหน้าของ OS ออกจากเมตริกการคงอยู่แบบ Active

ระบบปฏิบัติการมักจะเริ่มต้นแอปพลิเคชันในเบื้องหลังเป็นประจำโดยไม่มีผู้ใช้ใช้งาน บน iOS ระบบอาจเตรียมกระบวนการแอปพลิเคชันไว้ล่วงหน้าก่อนเปิดใช้งาน โดยเรียก application(_:didFinishLaunchingWithOptions:) โดยไม่ทริกเกอร์การเปลี่ยนผ่าน scene แบบ active บน Android ตัวรับสัญญาณเบื้องหลังและเธรดตัวทำงานสามารถเริ่มต้นคลาส Application ได้

SDK ของ telemetry จะบังคับใช้ตัวกรองที่เข้มงวดเพื่อให้แน่ใจว่าการดำเนินการในเบื้องหลังเหล่านี้ไม่ทำให้เมตริกการคงอยู่เสียหาย:

  • เกตสถานะอินเทอร์แอกทีฟ (Interactive State Gates): การเริ่มต้นกระบวนการหรือการดำเนินการในเบื้องหลังจะต้องไม่ถูกนับเป็นการคงอยู่แบบ active เว้นแต่จะยืนยันสถานะ UI แบบอินเทอร์แอกทีฟได้ (ProcessLifecycleOwner บน Android หรือสถานะแอปพลิเคชันแบบ active บน iOS) และเกณฑ์การมีส่วนร่วมที่ผลิตภัณฑ์กำหนดได้รับการเติมเต็ม
  • การยกเว้นงานในเบื้องหลัง (Background Task Exclusion): การดำเนินการงานในเบื้องหลังที่จัดการผ่าน Android Jetpack WorkManager หรือ Apple BGTaskScheduler จะต้องถูกแท็กอย่างชัดเจนและยกเว้นจากการคำนวณการคงอยู่ของผู้ใช้แบบ active

การเริ่มต้นใช้งานแบบกำหนดพารามิเตอร์ (Parameterized Onboarding) ช่วยปรับปรุงการมีส่วนร่วมแบบ Active ในสัปดาห์แรกอย่างไร

อุปสรรคความฝืดในวันที่ 0: อุปสรรคในการต้อนรับผู้ใช้และการไม่กลับมาในช่วงต้น

ความฝืดในกระบวนการต้อนรับ (Onboarding friction) เป็นตัวการสำคัญประการหนึ่งที่ทำให้ผู้ใช้ไม่กลับมาใช้งานในช่วงแรก โดยเฉพาะอย่างยิ่งเมื่อผู้ใช้ต้องสร้างบริบทการแนะนำหรือปลายทางขึ้นมาใหม่ด้วยตนเองหลังจากการติดตั้ง ในกระบวนการได้มาซึ่งผู้ใช้แบบดั้งเดิม ผู้ใช้ที่คลิกลิงก์โปรโมชัน คำเชิญแนะนำ หรือแคมเปญอินفلูเอนเซอร์จะถูกส่งต่อไปยังแอปสโตร์ เมื่อเปิดแอป พวกเขาจะพบกับขั้นตอนการต้อนรับทั่วไปที่ต้องป้อนรหัสโปรโมชันหรือรหัสทีมด้วยตนเอง

การกำหนดให้ต้องป้อนฟอร์มด้วยตนเองทำให้ผู้ใช้ต้องสลับไปมาระหว่างแอปพลิเคชันเพื่อคัดลอกรหัส ซึ่งเป็นการสร้างความฝืดในขั้นตอน เมื่อกระบวนการต้อนรับไม่สามารถส่งมอบบริบทที่กระตุ้นให้เกิดการดาวน์โหลดได้ทันที อัตราการกลับมาใช้งานในวันที่ 1 ก็อาจลดลงได้

การเย็บติดบริบทแบบไดนามิก (Dynamic Context Stitching): การดึงโทเค็นการแนะนำและบริบทการกำหนดเส้นทาง Deep Link เมื่อเปิดแอป

การเริ่มต้นใช้งานแบบกำหนดพารามิเตอร์ช่วยลดความฝืดในการป้อนข้อมูลด้วยตนเอง โดยการรักษาและกู้คืนบริบทการตลาดผ่านโปรแกรมข้ามอุปสรรคในการติดตั้ง

OpoInstall ซึ่งเป็นแพลตฟอร์มการระบุแหล่งที่มาบนมือถือและ deep linking ทำการติดตั้ง deferred deep linking โดยการจับพารามิเตอร์คิวรี URL (เช่น ?inviter_id=usr_9988&coupon=SAVE20) บนหน้า Landing Page บนเว็บ เมื่อผู้ใช้ติดตั้งและเปิดแอปพลิเคชันเป็นครั้งแรก SDK ของมือถือเนทีฟจะสืบค้นแบ็กเอนด์การระบุแหล่งที่มาเพื่อดึงบริบทที่แคชไว้

วิศวกรสามารถศึกษา เอกสารประกอบการกู้คืนพารามิเตอร์ สำหรับข้อกำหนดทางเทคนิคในการแยกวิเคราะห์พจนานุกรมเพย์لودไดนามิกภายในคอลแบ็กลูปวงจรชีวิตเนทีฟ

สถานะต้อนรับอัตโนมัติ: การมอบประสบการณ์เริ่มต้นส่วนบุคคลผ่าน OpoInstall SDK

การกู้คืนพารามิเตอร์เมื่อเปิดใช้งานครั้งแรกช่วยให้แอปพลิเคชันสามารถทำให้การตั้งค่าบัญชีเป็นแบบอัตโนมัติและแสดงสถานะต้อนรับส่วนบุคคล แทนที่จะแสดงหน้าจอสมัครใช้งานทั่วไป แอปพลิเคชันจะแยกวิเคราะห์เพย์لودที่กู้คืนมาและใช้รหัสแนะนำโดยอัตโนมัติ เข้าร่วมเวิร์กสเปซของทีมที่กำหนด หรือแสดงรายการผลิตภัณฑ์เฉพาะจากการคลิกเว็บเริ่มต้น

แผนภาพด้านล่างแสดงไปป์ไลน์ข้อมูลแบบ end-to-end ตั้งแต่การคลิกลิงก์แนะนำเริ่มต้นไปจนถึงการวัดการคงอยู่ช่วงต้น:

[User Clicks Referral Link] ──> [Web SDK Stages Context & Tokens]
             │                                │
             ▼                                ▼
   [Store Install & Open]   ──> [OpoInstall SDK Retrieves Payload]
             │                                │
             ▼                                ▼
 [Zero-Code Parameter Bind] ──> [Direct Routing to Content/Reward]
             │                                │
             ▼                                ▼
    [Day 0 Core Action]     ──> [Measure D1 & D7 Retention vs Control]

การกู้คืนบริบทก่อนการติดตั้งช่วยลดความฝืดในกระบวนการ ช่วยให้ทีมผลิตภัณฑ์สามารถประเมินว่าการต้อนรับในวันที่ 0 แบบไร้รอยต่อช่วยปรับปรุงอัตราการกลับมาใช้งานแบบ active ในวันที่ 1 และวันที่ 7 เมื่อเทียบกับกลุ่มควบคุมที่ไม่มีความช่วยเหลือหรือไม่

การทดลองการคงอยู่ของบริบทการต้อนรับแบบ deferred สำหรับ D1 และ D7

การประเมินเชิงเปรียบเทียบของวิธีการวัดการคงอยู่ของผู้ใช้ในสัปดาห์แรก

การเปรียบเทียบโมเดลการวัดแบบ Classic N-Day, Rolling และ Bracketed สำหรับการคงอยู่ช่วงต้น

การเลือกโมเดลการคำนวณการคงหน้าที่เหมาะสมขึ้นอยู่กับหมวดหมู่ผลิตภัณฑ์ ความถี่ในการมีส่วนร่วมตามธรรมชาติ และลักษณะวงจรชีวิต สำหรับสูตรทางคณิตศาสตร์โดยละเอียดของเส้นโค้งการคงอยู่แบบ rolling และ bracketed ตลอดช่วงเวลา 30 ถึง 90 วัน โปรดดูเอกสารประกอบการคงอยู่ของวงจรชีวิตโดยเฉพาะ

เมทริกซ์ด้านล่างเปรียบเทียบวิธีการคงอยู่ช่วงต้นหลัก ๆ:

ประเภทเมตริกการคงอยู่ พื้นฐานการคำนวณ กรณีการใช้งานทั่วไป อคติการวินิจฉัยที่มีอยู่
Classic N-Day (D1,D7D_1, D_7) Rt=AtU0×100%R_t = \frac{\vert A_t \vert}{\vert U_0 \vert} \times 100\% เครื่องมือความถี่สูง, แอปโซเชียล, เกมมือถือ ลงโทษผู้ใช้ที่มีจังหวะการใช้งานที่ไม่สม่ำเสมอ 2–3 วัน
Rolling / Unbounded (D7+D_7+) กลับมาในหรือหลังวันที่ 7 อีคอมเมิร์ซ, การจองการเดินทาง, ยูทิลิตี้แบบเป็นตอน ๆ เติมข้อมูลย้อนหลังเมื่อผู้ใช้กลับมาในสัปดาห์ถัด ๆ ไป
Bracketed Window (D17D_{1-7}) กลับมาอย่างน้อยหนึ่งครั้งในวันที่ 1–7 B2B SaaS, ชุดโปรแกรมเพิ่มผลผลิต, เครื่องมือทางการเงิน ปกปิดการไม่ใช้งานหลายวันที่เกิดขึ้นภายในช่วง 7 วัน

ทริกเกอร์การมีส่วนร่วมซ้ำในแอปมีประสิทธิภาพสำหรับการคงอยู่ช่วงต้นเมื่อใด

การเลือกจังหวะเวลาในการกระตุ้นการมีส่วนร่วมซ้ำจากจังหวะของผลิตภัณฑ์และสถานะผู้ใช้

กลไกการกระตุ้นการมีส่วนร่วมซ้ำอัตโนมัติ เช่น การแจ้งเตือนพุชบริบท, คำแนะนำในแอป และอีเมลธุรกรรม สามารถสนับสนุนการคงอยู่ช่วงต้นเมื่อถูกทริกเกอร์โดยพฤติกรรมผู้ใช้ที่ชัดเจน แทนที่จะเป็นหน้าต่างเวลาตามอำเภอใจ จังหวะเวลาของทริกเกอร์ควรมาจากจังหวะการใช้งานผลิตภัณฑ์ที่คาดหวังและการไม่มีความเคลื่อนไหวที่สังเกตได้ แทนที่จะเป็นตารางเวลาสากลที่ตายตัว

ข้อความกระตุ้นการมีส่วนร่วมซ้ำควรส่งมอบประโยชน์ใช้สอยที่ใช้งานได้ เช่น แจ้งเตือนผู้ใช้เกี่ยวกับข้อความที่ยังไม่ได้อ่าน เน้นย้ำงานตั้งค่าที่ยังไม่เสร็จสิ้น หรือให้คำแนะนำเกี่ยวกับผลิตภัณฑ์ที่เกี่ยวข้อง

Contextual Deep Linking: การกระตุ้นผู้ใช้ที่ไม่ได้ใช้งานให้กลับมาด้วยการกำหนดเส้นทางไปยังเวิร์กฟิลด์ที่ยังไม่เสร็จสิ้นโดยตรง

การแจ้งเตือนกระตุ้นการมีส่วนร่วมซ้ำทั่วไปที่นำผู้ใช้ไปยังหน้าจอหลักเริ่มต้นจะสร้างความฝืดในการนำทาง การกระตุ้นการมีส่วนร่วมซ้ำที่มีประสิทธิภาพใช้ deep link แบบบริบท (Universal Links บน iOS, App Links บน Android) ที่นำผู้ใช้ที่กลับมาไปยังอินเทอร์เฟซเฉพาะที่สามารถตระหนักถึงมูลค่าได้ทันที

ตัวอย่างเช่น หากผู้ใช้สร้างบัญชีในวันที่ 0 แต่ไม่ได้ตั้งค่าโปรเจกต์ให้เสร็จสมบูรณ์ การแจ้งเตือนกระตุ้นการมีส่วนร่วมซ้ำควรทำ deep link ไปยังหน้าจอกำหนดค่าโปรเจกต์โดยตรงด้วยพารามิเตอร์ที่กรอกไว้ล่วงหน้า

ขอบเขตความยินยอมและการอนุญาต: การปฏิบัติตามการให้สิทธิ์การแจ้งเตือนของระบบและการปฏิเสธ

เวิร์กฟลอว์การกระตุ้นการมีส่วนร่วมซ้ำทั้งหมดต้องปฏิบัติตามกรอบการอนุญาตของระบบปฏิบัติการและกฎหมายการสื่อสารที่เกี่ยวข้องอย่างเคร่งครัด บน iOS แอปพลิเคชันต้องขออนุญาตก่อนนำเสนอการแจ้งเตือน เสียง หรือป้ายกำกับแก่ผู้ใช้ผ่าน UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) บน Android 13+ แอปพลิเคชันต้องได้รับสิทธิ์รันไทม์ android.permission.POST_NOTIFICATIONS

นอกจากนี้ ทีมวิศวกรรมต้องรักษาการจัดการสถานะการปฏิเสธอย่างถาวรและการจำกัดความถี่เพื่อป้องกันความล้าจากการแจ้งเตือน การส่งการแจ้งเตือนความถี่สูงที่ไม่มีบริบทโดยปราศจากความยินยอมของผู้ใช้สามารถสร้างความล้าจากการแจ้งเตือนและอาจมีส่วนทำให้เลิกใช้งานหรือปฏิเสธ ข้อกำหนดอาจแตกต่างกันไปตามเขตอำนาจศาลและประเภทข้อความ ควรขอรับการตรวจสอบทางกฎหมายและการปฏิบัติตามข้อกำหนดสำหรับแคมเปญการตลาดเฉพาะ

การแทรกแซงที่เหมาะสมเทียบกับการแทรกแซงที่ไม่เหมาะสมสำหรับการเพิ่มประสิทธิภาพการคงอยู่ในสัปดาห์แรก

  • การแทรกแซงที่เหมาะสม: ข้อความแจ้งเตือนกระตุ้นการมีส่วนร่วมซ้ำที่ถูกทริกเกอร์โดยการกระทำ, การกำหนดเส้นทางต้อนรับส่วนบุคคลผ่านพารามิเตอร์ที่กู้คืน, ความช่วยเหลือในการต้อนรับในแอปแบบไดนามิก และ deep link ที่อุดมไปด้วยบริบท
  • การแทรกแซงที่ไม่เหมาะสม: การส่งข้อความออกอากาศความถี่สูง, คำขออนุญาตก่อนกำหนดที่นำเสนอก่อนแสดงคุณค่า และการบังคับให้ป้อนรหัสยืนยันด้วยตนเองในระหว่างการเปิดใช้งานครั้งแรก

คำถามที่พบบ่อย (FAQ)

เกณฑ์มาตรฐานทั่วไปสำหรับการคงอยู่ของผู้ใช้แอปมือถือในวันที่ 1 และวันที่ 7 คืออะไร?
ไม่มีเกณฑ์มาตรฐานสากลสำหรับการคงอยู่ในวันที่ 1 และวันที่ 7 ชุดข้อมูลอุตสาหกรรมภายนอก (เช่น รายงานข้ามแพลตฟอร์มจากผู้ให้บริการวัดผล) แสดงให้เห็นว่าการคงอยู่เฉลี่ยมีความแตกต่างกันอย่างมากในหมวดหมู่เกม โซเชียล การเงิน และอีคอมเมิร์ซ รวมถึงตามระบบปฏิบัติการและภูมิภาคทางภูมิศาสตร์ เกณฑ์มาตรฐานต้องได้รับการประเมินเทียบกับแนวตั้งเฉพาะของผลิตภัณฑ์และจังหวะการใช้งานตามธรรมชาติเสมอ
ทำไมการคงอยู่ในวันที่ 1 มักจะสูงกว่าการคงอยู่ในวันที่ 7 อย่างมีนัยสำคัญ?
ผลิตภัณฑ์จำนวนมากแสดงการคงอยู่แบบระบุวันเป๊ะ ๆ ที่ต่ำกว่าในไมล์สโตนที่ช้ากว่า แต่ขนาดและสาเหตุจะแตกต่างกันไปตามจังหวะการใช้งาน ส่วนผสมการได้มา ฤดูกาล และการออกแบบผลิตภัณฑ์ การคงอยู่ในวันที่ 1 วัดการสำรวจเริ่มต้นทันทีหลังจากการติดตั้ง ในขณะที่วันที่ 7 สะท้อนถึงประโยชน์ใช้สอยในการใช้งานอย่างต่อเนื่องและการนำผลิตภัณฑ์ไปใช้ตามกาลเวลา
Deferred deep linking ส่งผลกระทบต่อการคงอยู่ของผู้ใช้ในสัปดาห์แรกอย่างไร?
Deferred deep linking รักษาพารามิเตอร์แคมเปญ รหัสผู้เชิญ และเส้นทางปลายทางผ่านขั้นตอนการดาวน์โหลดจากแอปสโตร์ ด้วยการกู้คืนบริบทนี้ในการเปิดใช้งานครั้งแรก แอปพลิเคชันสามารถนำทางผู้ใช้ไปยังเนื้อหาหรือรางวัลที่กระตุ้นให้เกิดการติดตั้งได้โดยตรง ขจัดความฝืดในการต้อนรับ และช่วยให้ทีมเติบโตสามารถทดสอบผลกระทบต่อการคงอยู่ช่วงต้นเทียบกับกลุ่มควบคุมที่ไม่มีความช่วยเหลือได้

สรุปและกรอบการตัดสินใจ

การวัดและปรับปรุงการคงอยู่ของผู้ใช้ในสัปดาห์แรกต้องอาศัยแนวทางแบบรวมที่ผสมผสานสูตรทางคณิตศาสตร์ที่แม่นยำ telemetry ของไคลเอนต์ที่มีความยืดหยุ่น และกระบวนการต้อนรับที่ไร้ความฝืด การประเมินการคงอยู่ตั้งแต่ 1 ถึงวันที่ 7 โดยใช้โมเดลแบบวันเป๊ะ ๆ (exact-day), แบบ rolling หรือแบบ bracketed ช่วยให้ทีมวิศวกรรมและผลิตภัณฑ์สามารถระบุตำแหน่งที่เกิดความเสื่อมถอยของการคงอยู่ช่วงต้นและจัดลำดับความสำคัญของสมมติฐาน เช่น ความฝืดในการต้อนรับหรือประโยชน์ใช้สอยซ้ำที่ไม่เพียงพอ

การเพิ่มประสิทธิภาพสัปดาห์แรกที่สำคัญขึ้นอยู่กับการกำหนดเกณฑ์สถานะ active ที่ชัดเจนและการกำจัดอุปสรรคในขั้นตอน ด้วยการใช้ประโยชน์จากการผสานรวม SDK ที่มีน้ำหนักเบาและการกู้คืนพารามิเตอร์บริบท แพลตฟอร์มอย่าง OpoInstall จึงมอบโครงสร้างพื้นฐานที่จำเป็นในการสนับสนุนการวัดผลและประสบการณ์การเปิดใช้งานครั้งแรกที่มีความฝืดต่ำสำหรับผู้ใช้ใหม่ที่ได้มา

หากต้องการประเมินว่าโครงสร้างพื้นฐานการระบุแหล่งที่มาแบบรวมและการส่งผ่านพารามิเตอร์สามารถสนับสนุนการคงอยู่ของผู้ใช้ในสัปดาห์แรกของแอปพลิเคชันของคุณได้อย่างไร สำรวจ ข้อมูลอ้างอิงการใช้งานการระบุแหล่งที่มาบนมือถือ หรือลงทะเบียนบน คอนโซลนักพัฒนา OpoInstall

วัสดุที่เกี่ยวข้อง

Share this article

Keep Discovering

Microsoft เปิดตัว MAI-Transcribe-2 รองรับ 60 ภาษา: นักพัฒนาจะได้ประโยชน์อะไร?

Microsoft เปิดตัว MAI-Transcribe-2 รองรับ 60 ภาษา: นักพัฒนาจะได้ประโยชน์อะไร?

Microsoft เปิดตัว MAI-Transcribe-2 ด้วยค่า WER 5.2% ครอบคลุม 60 ภาษา ในราคาเพียง 10 เซนต์ต่อชั่วโมง ค้นพบข้อมูลการทดสอบประสิทธิภาพ ราคา และการผสานรวม API

Tesla เปิดตัว Cybercab ในออสติน? ทำความเข้าใจกลไกการรับส่งผู้โดยสาร

Tesla เปิดตัว Cybercab ในออสติน? ทำความเข้าใจกลไกการรับส่งผู้โดยสาร

Tesla เริ่มใช้งาน Cybercab ในออสติน ค้นพบวิธีที่โรโบแท็กซี่ไร้พวงมาลัยจัดการการเรียกใช้บริการผ่านโทรศัพท์ การเข้าถึงตัวรถ และประสบการณ์การใช้งานภายในห้องโดยสาร

วิธีที่ Referral Loop ช่วยเพิ่มการรักษาฐานผู้ใช้ (Retention) และสร้างความภักดีในระยะยาว

วิธีที่ Referral Loop ช่วยเพิ่มการรักษาฐานผู้ใช้ (Retention) และสร้างความภักดีในระยะยาว

เรียนรู้วิธีที่ Referral Loop ช่วยเพิ่มการรักษาฐานผู้ใช้มือถือ การสร้างแบบจำลองค่า K-factor แบบไวรัลร่วมกับอัตราการลดลงของกลุ่มผู้ใช้ (Cohort Decay) และการกำจัดอุปสรรคในการกรอกรหัสเชิญในวันที่ 0 ด้วยการส่งผ่านพารามิเตอร์