📖 Przegląd

Moduł Segments automatycznie kategoryzuje użytkowników na podstawie ich zachowania, czasu od instalacji, wydatków i zaangażowania.

Szybki przykład
// Sprawdź segment
if (ADict.Segments.isIn(Segment.PAYING_USER)) {
    // Mniej reklam dla płacących
    showLessAds()
}

// Sprawdź wiele segmentów
if (ADict.Segments.isInAny(Segment.WHALE, Segment.SUBSCRIBER)) {
    showVIPContent()
}

📊 Predefiniowane segmenty

Czasowe

SegmentOpis
NEW_USERUżytkownik < 7 dni
RETURNING_USERUżytkownik 7-30 dni
LOYAL_USERUżytkownik > 30 dni
VETERAN_USERUżytkownik > 90 dni

Płatności

PAYING_USERDokonał jakiegokolwiek zakupu
WHALEWydał > 10$
SUBSCRIBERMa aktywną subskrypcję

Zaangażowanie

HIGH_ENGAGEMENT> 5 sesji w ostatnim tygodniu
MEDIUM_ENGAGEMENT2-5 sesji w ostatnim tygodniu
LOW_ENGAGEMENT< 2 sesje w ostatnim tygodniu
AT_RISKNie był > 7 dni
DORMANTNie był > 30 dni

Inne

NOTIFICATIONS_ENABLEDWłączył powiadomienia
ONBOARDEDUkończył onboarding

📝 Śledzenie

trackSession()

Śledź sesję (automatycznie przy init).

trackPurchase(amount: Double)

Śledź zakup.

setSubscriptionStatus(active: Boolean)

Ustaw status subskrypcji.

setNotificationsEnabled(enabled: Boolean)

Ustaw status powiadomień.

setOnboardingCompleted(completed: Boolean)

Oznacz onboarding jako ukończony.

Śledzenie zdarzeń
// Po zakupie
fun onPurchaseCompleted(amount: Double) {
    ADict.Segments.trackPurchase(amount)
}

// Po subskrypcji
fun onSubscriptionStarted() {
    ADict.Segments.setSubscriptionStatus(true)
}

// Po onboardingu
fun onOnboardingFinished() {
    ADict.Segments.setOnboardingCompleted(true)
}

// Po włączeniu powiadomień
fun onNotificationsGranted() {
    ADict.Segments.setNotificationsEnabled(true)
}

🔍 Pobieranie segmentów

isIn(segment: String): Boolean

Sprawdź czy użytkownik jest w segmencie.

isInAny(vararg segments: String): Boolean

Czy jest w którymkolwiek z segmentów.

isInAll(vararg segments: String): Boolean

Czy jest we wszystkich segmentach.

getActive(): Set<String>

Pobierz wszystkie aktywne segmenty.

getUserData(): UserData

Pobierz surowe dane użytkownika.

🔧 Własne segmenty

defineCustom(name: String, condition: (UserData) -> Boolean)

Zdefiniuj własny segment.

Własne segmenty
// Super aktywni (> 10 sesji/tydzień, > 50 zł wydane)
ADict.Segments.defineCustom("super_active") { userData ->
    userData.sessionsLastWeek > 10 && userData.totalSpent > 50.0
}

// Potencjalny churn (dawno nie było, ale kiedyś płacił)
ADict.Segments.defineCustom("potential_churn") { userData ->
    val daysSinceLastSession = TimeUnit.MILLISECONDS.toDays(
        System.currentTimeMillis() - userData.lastSessionTimestamp
    )
    daysSinceLastSession > 14 && userData.hasPurchased
}

// Użycie
if (ADict.Segments.isIn("potential_churn")) {
    sendWinBackNotification()
}

📡 Obserwacja (Flow)

Reaktywna obserwacja
lifecycleScope.launch {
    ADict.Segments.segments.collect { activeSegments ->
        updateUserBadge(activeSegments)

        // Dostosuj UI do segmentu
        when {
            Segment.WHALE in activeSegments -> showVIPBanner()
            Segment.AT_RISK in activeSegments -> showRetentionOffer()
            Segment.NEW_USER in activeSegments -> showOnboardingTip()
        }
    }
}

💡 Przykłady użycia

Personalizacja doświadczenia
// Mniej reklam dla płacących
fun getAdFrequency(): Int {
    return when {
        ADict.Segments.isIn(Segment.WHALE) -> 0 // Brak reklam
        ADict.Segments.isIn(Segment.PAYING_USER) -> 5 // Co 5 akcji
        ADict.Segments.isIn(Segment.HIGH_ENGAGEMENT) -> 3 // Co 3 akcje
        else -> 2 // Co 2 akcje
    }
}

// Specjalne oferty dla segmentów
fun getSpecialOffer(): Offer? {
    return when {
        ADict.Segments.isIn(Segment.AT_RISK) -> Offer.COMEBACK_DISCOUNT
        ADict.Segments.isIn(Segment.NEW_USER) -> Offer.FIRST_PURCHASE_BONUS
        ADict.Segments.isInAll(Segment.LOYAL_USER, Segment.HIGH_ENGAGEMENT)
            -> Offer.LOYALTY_REWARD
        else -> null
    }
}

// Adaptacyjne powiadomienia
fun shouldSendNotification(type: NotificationType): Boolean {
    return when (type) {
        NotificationType.PROMO ->
            ADict.Segments.isIn(Segment.HIGH_ENGAGEMENT)
        NotificationType.COMEBACK ->
            ADict.Segments.isIn(Segment.AT_RISK)
        NotificationType.VIP_ONLY ->
            ADict.Segments.isIn(Segment.WHALE)
        else -> true
    }
}

📦 data class UserData

  • installTimestampLong
  • lastSessionTimestampLong
  • totalSessionsInt
  • sessionsLastWeekInt
  • totalSpentDouble
  • hasPurchasedBoolean
  • hasSubscriptionBoolean
  • notificationsEnabledBoolean
  • onboardingCompletedBoolean