Skip to main content

Overview

The mobile SDKs build events with typed helpers and post them to the same collector as the web tag. One instance handles collection and personalisation, so identity is shared.
Events are built and sent in two steps on every platform: a builder returns an event, send() posts it. Building an event has no side effect, so you can enrich or discard it before sending. Installation instructions for each platform are on the Android, iOS, and Flutter pages.

Event builders

Argument order differs between platforms for purchase — Android takes transId before labels, iOS and Flutter take it last. Rely on named arguments where the language allows it.
Labels are String key/value pairs stored as queryable labels on the event. Use them for the dimensions you filter on in a Workflow — locale, store, app version — not for high-cardinality data.

Identity

setUser() stores the identity on device (SharedPreferences on Android, UserDefaults on iOS, shared preferences on Flutter) and sends an identify event when the value changes. Call it after login and after restoring a session at launch — repeated calls with the same value are no-ops. Until then, events carry only the anonymous device identity (tmpId): the advertising ID on Android when ad tracking is allowed, identifierForVendor on iOS, otherwise a random identifier generated once and persisted.
iOS exposes ReelevantAnalytics.clearStorage() to drop the stored user ID, temporary ID, and retry queue — call it on logout when the device is shared.

Screen context

Every event carries a url field. In apps it defaults to unknown, so set it on navigation to be able to filter events by screen:
Use a stable scheme and path structure — the field is indexed as text, so consistent paths keep Workflow filters simple.

Delivery guarantees

All three SDKs behave identically on failure: send() does not report transport failures to the caller — they are logged and queued. It can still throw when it is called before the SDK finished initialising its device identity, so wrap calls made early in the app lifecycle: