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-Name | Android | iOS | React Native | Flutter | Funnel-Schritt |
|---|---|---|---|---|---|
onboarding_step | onboardingStep(step, index, flow) | onboardingStep(_:index:flow:) | onboardingStep(step, { index, flow }) | onboardingStep(step, index:, flow:) | Tab Onboarding, kein Schritt |
onboarding_skipped | onboardingSkipped(step) | onboardingSkipped(_:) | onboardingSkipped(step) | onboardingSkipped(step) | Tab Onboarding, kein Schritt |
onboarding_completed | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | Onboarding |
paywall_viewed | paywallViewed(placement) | paywallViewed(placement:) | paywallViewed(placement) | paywallViewed(placement:) | Paywall |
paywall_skipped | paywallSkipped(placement) | paywallSkipped(placement:) | paywallSkipped(placement) | paywallSkipped(placement:) | Wenn du ihn hinzufügst |
sign_up | signUp(method) | signUp(method:) | signUp(method) | signUp(method:) | Registrierung |
sign_in | signIn(method) | signIn(method:) | signIn(method) | signIn(method:) | Angemeldet |
sign_up_skipped | signUpSkipped() | signUpSkipped() | signUpSkipped() | signUpSkipped() | Als Gast weiter |
trial_started | trialStarted(productId) | trialStarted(productId:) | trialStarted(productId) | trialStarted(productId:) | Testphase |
purchase | purchase(amount, currency, productId) | purchase(amount:currency:productId:) | purchase(amount, currency, productId) | purchase(amount, currency, productId:) | Bezahlt |
purchase_cancelled | purchaseCancelled(productId) | purchaseCancelled(productId:) | purchaseCancelled(productId) | purchaseCancelled(productId:) | Wenn du ihn hinzufügst |
purchase_failed | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | Wenn du ihn hinzufügst |
| deine eigenen | track(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.
placementsagt, welche Paywall:onboarding,launch,feature_gate,settingsoder ein eigener Name. Er wird als Eigenschaftplacementgesendet. Funnel → Aufteilen nach Paywall zeigt für jede Platzierung einen eigenen Funnel.methodsagt, wie das Konto erstellt wurde:email,apple,google. Gesendet alsmethod.productIdist die Produkt-ID aus deinem Store. Gesendet alsproduct_id.purchaseüberträgt den Preis als Dezimalzahl (AndroidBigDecimal, iOSDecimal, React Native und Flutter ein String wie"49.99") und einen dreistelligen Währungscode. Preise werden nie gerundet.
Wann du welches sendest
| Event | Sende es |
|---|---|
onboarding_step | Wenn jeder Onboarding-Screen erscheint, nicht wenn sein Button angetippt wird. Siehe Onboarding-Screens. |
onboarding_skipped | Wenn jemand auf Überspringen tippt, mit dem Screen, auf dem das passiert ist. |
onboarding_completed | Wenn die letzte Onboarding-Frage oder der letzte Onboarding-Screen erledigt ist, vor einer Paywall oder Registrierung, die darauf folgt. |
paywall_viewed | Jedes Mal, wenn eine Paywall erscheint, mit ihrer Platzierung. Nicht für Abonnenten: Wenn deine App ihnen keine Paywall zeigt, sende nichts. |
paywall_skipped | Wenn 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_up | Direkt nachdem ein neues Konto erstellt wurde. Nicht, wenn sich jemand bei einem Konto anmeldet, das er schon hatte. |
sign_in | Wenn 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_skipped | Wenn 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, purchase | Wenn der Store es bestätigt. Lass beide weg, wenn RevenueCat verbunden ist. |
purchase_cancelled | Wenn jemand das Kaufformular des Stores schließt, ohne zu bezahlen. |
purchase_failed | Wenn 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);
stepist 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/paywallSkippedundsignUp. Eine Paywall, die ohne Kauf geschlossen wird, istpaywallSkipped, nieonboardingSkipped. onboardingCompletedkommt 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
stepoderflow. 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
onboardingCompletedsendet, 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
onboardingCompletednach 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 ist | Senden |
|---|---|
| Ein neues Konto erstellt (E-Mail, Apple, Google, auch nach einer Zeit als Gast) | signUp(method) |
| Bei einem Konto angemeldet, das es schon gab | signIn(method) |
| Entschieden, ohne Konto weiterzumachen | signUpSkipped() (SDK 0.3.2+, React Native 0.3.1+; ältere SDKs: track("sign_up_skipped")) |
| Ein Gast, der sich später registriert, aus den Einstellungen | signUp(method): Es zählt für den Registrierungsschritt des Funnels, wann immer es passiert |
| Mit einem zurückgesetzten Passwort angemeldet | signIn(method): Das Konto gab es schon |
| Versucht, sich mit einer bereits registrierten E-Mail zu registrieren, dann angemeldet | signIn(method) |
| Abgemeldet | setUserId(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.
| Event | Wann |
|---|---|
first_open | Einmal pro Installation, beim ersten Start. Das ist die Installation. |
session_start | Beim Start oder wenn die App nach 30 Minuten oder mehr im Hintergrund zurückkommt. |
app_background | Wenn 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_upoderexport.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.
| Android | iOS | React Native | Flutter | Was 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() | installId | getInstallId() | 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.