Respectlytics Respect lytics
Menu
Replace Mixpanel No PII collected

Replace Mixpanel to stop collecting personal data in analytics

Migrate from Mixpanel to Respectlytics. 5-field event schema enforces no PII at the API boundary. Helps developers avoid collecting personal data.

Example Mixpanel call (the "before")

swift Respectlytics
import Mixpanel

let mixpanel = Mixpanel.mainInstance()

// Identifies the user — distinct_id becomes joinable to email forever:
mixpanel.identify(distinctId: userId)
mixpanel.people.set(properties: [
    "$email": email,
    "$name": fullName,
    "plan": "pro",
])
mixpanel.track(event: "Paywall Purchase", properties: ["value": price])

Most analytics SDKs accept arbitrary event parameters — the path of least resistance for an engineer adds user_id, email, phone, address to events over time. Respectlytics's 5-field event schema (event_name, session_id, timestamp, platform, country) rejects extra fields at the API with a 400 — making PII drift architecturally impossible.

Remove Mixpanel cleanly

  1. 1

    Remove pod 'Mixpanel' from Podfile

  2. 2

    Remove implementation 'com.mixpanel.android:mixpanel-android:...' from build.gradle.kts

  3. 3

    Remove mixpanel-react-native from package.json or mixpanel_flutter: from pubspec.yaml

  4. 4

    Delete any Mixpanel.mainInstance().people.set(...) or identify() calls — those are the people-profile entry points

  5. 5

    Replace mixpanel.track(...) call sites with Respectlytics.track("event_name")

  6. 6

    Delete the Mixpanel project (or revoke the project token) in the Mixpanel admin once you've confirmed no more events arrive

  7. 7

    If you used Mixpanel-driven cohort exports for marketing, plan the cutover to whatever replaces those flows

Mixpanel vs Respectlytics — no pii collected

MixpanelRespectlytics
Accepts arbitrary event parametersYes (per-event params or properties)No (5-field schema, extras rejected with 400)
Persistent user identifier— see tool note aboveNo (session_id rotates every 2h, RAM-only)
IP address stored— see tool note aboveUsed transiently to derive country, then discarded
Per-user historical record— see tool note aboveOut of scope (use your account system)

Frequently asked questions

How do we attribute revenue to a specific user without `user_id`?

You don't — at least not in your analytics. Your billing system (Stripe, RevenueCat, App Store Connect) is the authoritative source of per-user revenue, with refund-aware totals and the appropriate access controls. Respectlytics tells you the product signal (conversion rate, funnel completion) at the session level; per-user revenue lives where it belongs.

What if our analytics team needs to slice by user segment (paid vs free)?

Encode the segment into the event name. Instead of track('paywall_view', { tier: 'paid' }), fire track('paywall_view_paid_user') and track('paywall_view_free_user'). The aggregation buckets them automatically; no per-user identity is stored.

Doesn't the country field count as personal data?

Country-only resolution is generally considered the most minimised form of geographic data and is widely accepted in privacy reviews — but consult your legal team to determine your specific situation. Respectlytics derives country from the request IP server-side, then discards the IP before storing the event.

What happens if a teammate accidentally adds an extra field to a `track` call?

The API returns a 400 with the offending field name in the response body. Your integration test fails on the first run that includes the new field, so the regression is caught at PR review — not after months of unnoticed silent PII collection.

Related migration guides

Track what matters. Collect nothing you don't.

Five-field event schema, RAM-only event queue, no IDFA, no AAID, no persistent user IDs. Helps developers avoid collecting personal data in the first place.