Fire one event per step completion — tutorial_step_1_complete, tutorial_step_2_complete, etc. — and a final tutorial_complete. Don't pass step numbers as parameters. The pattern matches onboarding-completion intentionally; the two events serve different products but the funnel discipline is identical.
▸Install the Kotlin (Android) SDK
// build.gradle.kts (app module)
dependencies {
implementation("com.respectlytics:respectlytics-kotlin:3.0.0")
}
Pure Kotlin coroutines implementation. No Java dependencies, no Google Play Services dependencies. ~300KB DEX overhead — compare to roughly 3.8MB for Firebase Analytics (a measurable cold-start improvement on lower-end devices).
▸Initialize Respectlytics in Kotlin (Android)
import com.respectlytics.android.Respectlytics
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
Respectlytics.configure(this, appKey = "<YOUR_APP_KEY>")
}
}
Initialize once in Application.onCreate. No additional permissions in the manifest — INTERNET is sufficient. The SDK does not request AD_ID, does not query AdvertisingIdClient, and does not declare ACCESS_NETWORK_STATE.
▸Track the event in Kotlin (Android)
import com.respectlytics.android.Respectlytics
object TutorialAnalytics {
fun reportStep(step: Int) {
Respectlytics.track("tutorial_step_${step}_complete")
}
fun reportFinish(skipped: Boolean) {
Respectlytics.track(if (skipped) "tutorial_skipped" else "tutorial_complete")
}
}
Both tutorial_complete and tutorial_skipped are valuable — the ratio is your tutorial-quality signal.
✦Privacy & implementation notes
Common confusion: "tutorial" and "onboarding" are different events. Onboarding is account / profile setup (sign in, opt in, give consent, verify email); tutorial is feature instruction (how to play the game, how to navigate the app). Most apps have both, with different drop-off patterns. Instrument them as separate funnels.
First-day retention from tutorial completion is the most actionable single metric a games team can read — it tells you whether the introduction is doing its job. Session-grouped Respectlytics events give you the rate; per-player retention curves live in your game backend if you need them at the individual level.
Many teams discover the com.google.android.gms.permission.AD_ID permission in their merged manifest only after Google Play flags them — usually because a transitive dependency dragged it in. Respectlytics's Kotlin SDK has no Google Play Services dependency at all, so it cannot contribute to that merge.
The SDK is implemented as pure Kotlin coroutines with no Java sources, no RxJava, and no platform channels. Events are queued in a Channel<Event> buffered to a small ring (RAM-only), drained by a coroutine that flushes every 30 seconds or on backgrounding. There is no SharedPreferences usage.
⇋How this compares to other analytics SDKs
| Tutorial finish event | Firebase Analytics | Mixpanel | Respectlytics |
|---|---|---|---|
| Step number as parameter | Recommended | Recommended | Use distinct event_name |
| Time-on-step in seconds | Recommended | Recommended | Server-side derivation |
| Skip-tutorial as parameter | Recommended | Recommended | Use distinct event_name |
| Per-user tutorial completion history | Yes | Yes | Out of scope |
| Step-by-step funnel rate | Per-user | Per-user | Session-grouped |
❓Frequently asked questions
Should we differentiate skipped vs completed?
Yes, distinct event names: tutorial_complete, tutorial_skipped. The ratio is product information — a high skip rate may mean the tutorial is redundant or annoying; a low skip rate may mean it's actually useful. Either interpretation needs the two signals separated.
What about tutorials with branches (gameplay style choice, e.g. easy vs hard)?
Distinct event names per branch: tutorial_complete_easy, tutorial_complete_hard. Per-branch retention curves come from comparing subsequent retention events across the two cohorts.
Do we measure D1 retention from tutorial finish?
Session-scoped, yes — the rate of sessions emitting any meaningful event in the 24-hour window after a session that emitted tutorial_complete is your D1-from-tutorial signal. Country / platform breakdowns surface the variation.
How is this different from `onboarding-completion`?
Onboarding is account-level setup (email verification, push opt-in, profile creation). Tutorial is gameplay/feature-level instruction. Most apps have both — a sign-in flow + a how-to-use-the-app flow. Treat them as distinct, and instrument both.