Loslegen

Event-Referenz

Jeder Aufruf, den das SDK bietet, auf jeder Plattform, mit dem Event-Namen, der bei Unolink ankommt. Funnels gelten pro App: Lege unter Funnel → Neuer Funnel so viele an, wie du willst, und wähle beliebige dieser Namen als Schritte, auch deine eigenen. Jeder Schritt zählt die Installationen, die das Event irgendwann gesendet haben. So bekommen auch Apps, deren Screens in einer anderen Reihenfolge kommen, einen aussagekräftigen Funnel. Aktiviere Schritte nur in dieser Reihenfolge zählen in einem Funnel, damit ein Schritt nur zählt, wenn er nach dem vorherigen passiert.

Standard-Events

Event-NameAndroidiOSReact NativeFlutterFunnel-Schritt
onboarding_steponboardingStep(step, index, flow)onboardingStep(_:index:flow:)onboardingStep(step, { index, flow })onboardingStep(step, index:, flow:)Tab Onboarding, kein Schritt
onboarding_skippedonboardingSkipped(step)onboardingSkipped(_:)onboardingSkipped(step)onboardingSkipped(step)Tab Onboarding, kein Schritt
onboarding_completedonboardingCompleted()onboardingCompleted()onboardingCompleted()onboardingCompleted()Onboarding
paywall_viewedpaywallViewed(placement)paywallViewed(placement:)paywallViewed(placement)paywallViewed(placement:)Paywall
paywall_skippedpaywallSkipped(placement)paywallSkipped(placement:)paywallSkipped(placement)paywallSkipped(placement:)Wenn du ihn hinzufügst
sign_upsignUp(method)signUp(method:)signUp(method)signUp(method:)Registrierung
sign_insignIn(method)signIn(method:)signIn(method)signIn(method:)Angemeldet
sign_up_skippedsignUpSkipped()signUpSkipped()signUpSkipped()signUpSkipped()Als Gast weiter
trial_startedtrialStarted(productId)trialStarted(productId:)trialStarted(productId)trialStarted(productId:)Testphase
purchasepurchase(amount, currency, productId)purchase(amount:currency:productId:)purchase(amount, currency, productId)purchase(amount, currency, productId:)Bezahlt
purchase_cancelledpurchaseCancelled(productId)purchaseCancelled(productId:)purchaseCancelled(productId)purchaseCancelled(productId:)Wenn du ihn hinzufügst
purchase_failedpurchaseFailed(productId, reason)purchaseFailed(productId:reason:)purchaseFailed(productId, reason)purchaseFailed(productId:reason:)Wenn du ihn hinzufügst
deine eigenentrack(name, properties)track(_:properties:)track(name, properties)track(name, properties)Wenn du ihn hinzufügst

Jedes Argument außer Betrag und Währung eines Kaufs ist optional, und jeder Aufruf nimmt zusätzlich weitere Eigenschaften an.

  • placement sagt, welche Paywall: onboarding, launch, feature_gate, settings oder ein eigener Name. Er wird als Eigenschaft placement gesendet. Funnel → Aufteilen nach Paywall zeigt für jede Platzierung einen eigenen Funnel.
  • method sagt, wie das Konto erstellt wurde: email, apple, google. Gesendet als method.
  • productId ist die Produkt-ID aus deinem Store. Gesendet als product_id.
  • purchase überträgt den Preis als Dezimalzahl (Android BigDecimal, iOS Decimal, React Native und Flutter ein String wie "49.99") und einen dreistelligen Währungscode. Preise werden nie gerundet.

Wann du welches sendest

EventSende es
onboarding_stepWenn jeder Onboarding-Screen erscheint, nicht wenn sein Button angetippt wird. Siehe Onboarding-Screens.
onboarding_skippedWenn jemand auf Überspringen tippt, mit dem Screen, auf dem das passiert ist.
onboarding_completedWenn die letzte Onboarding-Frage oder der letzte Onboarding-Screen erledigt ist, vor einer Paywall oder Registrierung, die darauf folgt.
paywall_viewedJedes Mal, wenn eine Paywall erscheint, mit ihrer Platzierung. Nicht für Abonnenten: Wenn deine App ihnen keine Paywall zeigt, sende nichts.
paywall_skippedWenn jemand eine Paywall schließt, ohne zu kaufen: über ihren Schließen-Button, durch Herunterwischen oder mit der Zurück-Geste. Nicht, solange ein Kauf noch auf Freigabe wartet (Kaufanfrage, die 3-D-Secure-Prüfung einer Bank).
sign_upDirekt nachdem ein neues Konto erstellt wurde. Nicht, wenn sich jemand bei einem Konto anmeldet, das er schon hatte.
sign_inWenn sich jemand bei einem Konto anmeldet, das er schon hatte: ein wiederkehrender Nutzer (nach einer Neuinstallation, auf einem neuen Smartphone, nach dem Abmelden). Journeys markiert ihn als wiederkehrend und kann danach filtern. SDK 0.3.0 oder neuer.
sign_up_skippedWenn sich jemand auf einem Registrierungs-Screen entscheidet, ohne Konto weiterzumachen (Gastmodus). Journeys markiert ihn als Gast, und ein Funnel mit einem Registrierungsschritt zeigt ihn als jemanden, der einen anderen Weg genommen hat, nicht als Abbruch.
trial_started, purchaseWenn der Store es bestätigt. Lass beide weg, wenn RevenueCat verbunden ist.
purchase_cancelledWenn jemand das Kaufformular des Stores schließt, ohne zu bezahlen.
purchase_failedWenn die Zahlung fehlschlägt. reason ist deine eigene kurze Beschreibung.

Onboarding-Screens

Der Tab Onboarding zeigt, auf welchem Screen Leute aussteigen und wie lange jeder Screen dauert. Sende einen Aufruf pro Screen, sobald er erscheint, einen bei Überspringen und am Ende onboardingCompleted:

// iOS (SwiftUI)
GoalScreen().onAppear { Unolink.onboardingStep("goal", index: 0) }
Button("Skip") { Unolink.onboardingSkipped("goal") }
// Android (Compose)
LaunchedEffect(Unit) { Unolink.onboardingStep("goal", index = 0) }
// React Native
useOnboardingStep("goal", { index: 0 })   // or Unolink.onboardingStep("goal", { index: 0 }) in a useEffect
// Flutter, in initState
Unolink.onboardingStep('goal', index: 0);
  • step ist eine feste ID pro Screen: goal, notifications, plan. Es gelten dieselben Regeln wie für Event-Namen. Gib Verzweigungen eigene IDs. Ein Pager oder ein Onboarding auf einem einzigen Screen sendet einen Aufruf pro Seite.
  • Nur die eigenen Screens des Onboardings. Paywall und Registrierungs-Screen sind keine Onboarding-Screens, auch wenn sie Schritte desselben Flows sind: Sie senden paywallViewed / paywallSkipped und signUp. Eine Paywall, die ohne Kauf geschlossen wird, ist paywallSkipped, nie onboardingSkipped.
  • onboardingCompleted kommt direkt nach dem letzten Onboarding-Screen, vor der Paywall oder Registrierung, die folgt, auch wenn das Konto erst am Ende des Flows erstellt wird. Wer die Paywall sieht, hat das Onboarding abgeschlossen.
  • index (optional) ist die Position des Screens, 0 bis 999. Damit kann der Tab neben dem zuletzt gesehenen Screen auch den am weitesten erreichten zeigen.
  • flow (optional) benennt das Onboarding, wenn du mehr als eines hast: eine A/B-Variante, eine neue Version, ein erneutes Onboarding. Jeder Flow bekommt seine eigene Liste.
  • Das sind die einzigen Eigenschaften, die diese Events annehmen. Alles andere führt dazu, dass das Event abgelehnt wird.
  • Pack nie Nutzerdaten in step oder flow. Das sind Screen-Namen, die im Dashboard angezeigt werden.
  • Sie sind kostenlos. Ein Onboarding kostet ein Event, sein onboardingCompleted, egal wie viele Screens es hat. Jede Installation kann bis zu 100 davon senden, für bis zu 40 verschiedene Screens.
  • Zurück-Navigation, beendete und neu gestartete Apps brauchen nichts Besonderes. Unolink ermittelt den Status jeder Installation: abgeschlossen, auf einem Screen übersprungen, auf ihrem letzten Screen ausgestiegen (24 Stunden nichts Neues) oder noch dabei. Eine App, die nur onboardingCompleted sendet, zeigt trotzdem, wie viele abgeschlossen haben; um zu sehen, wo Leute aussteigen, braucht es die Screens. Installationen, die gar kein Onboarding-Event gesendet haben, werden als nicht erfasst angezeigt, nie als Abbruch.

Diese Aufrufe brauchen SDK 0.2.0 oder neuer. In älteren Versionen sendet track("onboarding_step", { step: "goal" }) dasselbe Event.

Wie Events gezählt werden

  • Funnels zählen Personen, nicht Events. Jeder Schritt zählt die Installationen, die das Event mindestens einmal gesendet haben. Eine Paywall, die fünfmal gesehen wurde, oder ein erneut gesendetes onboardingCompleted nach dem Zurückgehen zählt also einmal pro Person.
  • Standardmäßig in beliebiger Reihenfolge. Ein Schritt zählt, wann immer er passiert ist. Aktiviere Schritte nur in dieser Reihenfolge zählen in einem Funnel, wenn die Reihenfolge wichtig ist; dann zählt ein Schritt nur, wenn er gleichzeitig mit oder nach dem vorherigen passiert.
  • Jedes Event zählt trotzdem für deinen Tarif. Wiederholungen werden gespeichert (Journeys zeigt jede einzelne), und jede wird auf das monatliche Kontingent angerechnet, außer den kostenlosen unten.
  • Zeitangaben kommen vom Smartphone, außer sie sind mehr als 7 Tage alt oder mehr als eine Stunde in der Zukunft; dann wird der Zeitpunkt des Eingangs verwendet.

Gäste und Konten

Melde RevenueCats eigene App-User-ID jedes Mal, wenn sie sich ändert: für einen Gast RevenueCats anonyme ID, dann die ID des Kontos, das er erstellt oder bei dem er sich anmeldet. connectRevenueCat (SDK 0.3.2 oder neuer) erledigt das für dich; sonst ruf setUserId damit auf. Jede ID, die eine Installation gemeldet hat, zählt. Ein Kauf als Gast, seine Verlängerungen und Käufe, die RevenueCat später auf ein anderes Konto überträgt, bleiben so alle bei der Installation, die gekauft hat.

Was passiert istSenden
Ein neues Konto erstellt (E-Mail, Apple, Google, auch nach einer Zeit als Gast)signUp(method)
Bei einem Konto angemeldet, das es schon gabsignIn(method)
Entschieden, ohne Konto weiterzumachensignUpSkipped() (SDK 0.3.2+, React Native 0.3.1+; ältere SDKs: track("sign_up_skipped"))
Ein Gast, der sich später registriert, aus den EinstellungensignUp(method): Es zählt für den Registrierungsschritt des Funnels, wann immer es passiert
Mit einem zurückgesetzten Passwort angemeldetsignIn(method): Das Konto gab es schon
Versucht, sich mit einer bereits registrierten E-Mail zu registrieren, dann angemeldetsignIn(method)
AbgemeldetsetUserId(null)

Neu oder wiederkehrend mit Apple oder Google? Das Ergebnis der Anmeldung sagt es meistens. Firebase: additionalUserInfo.isNewUser. Supabase: Ein Nutzer, dessen created_at nur wenige Sekunden vor last_sign_in_at liegt, wurde gerade erstellt.

Automatische Events

Diese sendet das SDK selbst. Sie sind kostenlos: Sie werden nie auf deinen Tarif angerechnet.

EventWann
first_openEinmal pro Installation, beim ersten Start. Das ist die Installation.
session_startBeim Start oder wenn die App nach 30 Minuten oder mehr im Hintergrund zurückkommt.
app_backgroundWenn die App in den Hintergrund geht.

Eigene Events

track(name, properties) sendet alles andere, und auch eigene Events können Funnel-Schritte sein.

  • Namen: beginnen mit einem Buchstaben, danach Buchstaben, Ziffern, _ und ., höchstens 64 Zeichen. level_up oder export.pdf. Ein ungültiger Name wird verworfen und geloggt.
  • Eigenschaften: höchstens 20 pro Event. Werte sind Strings (bis zu 200 Zeichen), Zahlen oder Booleans, insgesamt 4 KB.
  • Pack nie Namen, E-Mail-Adressen, Telefonnummern oder andere personenbezogene Daten in Eigenschaften.

Nutzer- und App-Status

Diese senden kein eigenes Event.

AndroidiOSReact NativeFlutterWas es macht
setUserId(id)setUserId(_:)setUserId(id)setUserId(id)Die Nutzer-ID deiner App; mit RevenueCat RevenueCats eigene App-User-ID. Nur als Einweg-Hash pro App gespeichert. Ruf es erneut auf, wann immer sie sich ändert (Gast → Konto): Jede ID zählt. Übergib beim Abmelden null (nil). Höchstens 256 Zeichen.
connectRevenueCat { }connectRevenueCat { }connectRevenueCat(Purchases)connectRevenueCat(…)Hält die Nutzer-ID gleich RevenueCats App-User-ID, Gäste eingeschlossen (SDK 0.3.2+). Siehe RevenueCat. Nutze es oder setUserId, nicht beides.
revenueCatUserChanged()revenueCatUserChanged()Sendet RevenueCats neue ID sofort: Ruf es nach logIn und logOut auf (SDK 0.3.2+). React Native und Flutter bemerken es von selbst.
setDeferredDeepLinkListener { }onDeferredDeepLink(_:)addDeferredDeepLinkListener(fn)setDeferredDeepLinkListener(fn)Wird einmal pro Installation aufgerufen, die von einem Unolink-Link kam. In der Praxis nur Android.
getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()Der Link, der geöffnet werden soll, sobald Onboarding oder Anmeldung erledigt sind, danach als verbraucht markiert. Er wartet, bis er verbraucht ist, auch wenn die App zwischendurch geschlossen wird, bis zu 30 Tage (SDK 0.3.3+; React Native 0.3.1+ behielt ihn für einen App-Start).
isConfigured()Ob configure mit einem Schlüssel gelaufen ist (React Native 0.3.1+).
getInstallId()installIdgetInstallId()getInstallId()Die zufällige ID dieser Installation.
flush()flush()flush()flush()Sendet Events aus der Warteschlange sofort.
setEnabled(bool)setEnabled(_:)setEnabled(bool)setEnabled(bool)Schaltet das Tracking aus (Events in der Warteschlange werden gelöscht) oder wieder ein.

RevenueCat

Wenn RevenueCat verbunden ist, ist es die maßgebliche Quelle für Geld. Es meldet Testphasen, Käufe, Verlängerungen, Kündigungen, Erstattungen, Abläufe und Zahlungsprobleme, auch wenn die App nicht geöffnet ist. Aufrufe von purchase und trialStarted aus der App werden ignoriert, damit nichts doppelt zählt. Deine App braucht nur connectRevenueCat (oder setUserId mit RevenueCats ID).

Tarif-Kontingent

Das SDK ist Teil der Tarife Pro und Studio. Jedes Event, das deine App sendet, wird auf das monatliche Event-Kontingent angerechnet: 1 Million bei Pro, 5 Millionen bei Studio. Dazu gehören die Standard-Events oben und deine eigenen. Die automatischen Events (first_open, session_start, app_background) und Onboarding-Screens (onboarding_step, onboarding_skipped) sind kostenlos, ebenso Käufe, Verlängerungen und Erstattungen, die von RevenueCat kommen. Wenn du das Kontingent überschreitest, wird nichts blockiert; ab dem Doppelten des Kontingents werden eigene Events bis zum nächsten Monat abgelehnt, Standard-, Onboarding- und automatische Events werden dagegen immer behalten.