Skip to content

identify(userId)

One person, however many devices they use.

Rabolic links a visitor’s browser and each app install to your user id the moment they sign in, and brings their earlier events along. Every report then counts people, not devices.

  • Anonymous history kept
  • Two users never merged
  • No fingerprinting
Web
checkout_completed
iPhone
$screen
Android
workout_started
Server
$purchase
app.rabolic.com/users/usr_8f2k1x9q
MC

Anonymous visitor

4f1c2b7e-…-e2a9

Maya Chen

usr_8f2k1x9q

Sessions
4
Events
11
Revenue
$89.00

Identity graph

  • Anonymous web ID4f1c2b7e-…-e2a9identify()not linked
  • iOS installation ID9b2e41d0-…-77c1identify()not linked
  • Android installation IDc07d9a35-…-03feidentify()not linked
  • Server eventsuserId: usr_8f2k1x9qsecret keynot linked

Activity timeline

Tuesday, Nov 4

  1. 09:12$pageview/pricing · utm_source=newsletter
  2. 09:14signup_completedmethod: google
  3. 09:14$identifyanonymous web visitor → usr_8f2k1x9q
  4. 09:31$app_first_openAcme Fit 4.12.0 · iPhone 15
  5. 09:31$identifyiOS install joins usr_8f2k1x9q
  6. 09:33$screenOnboarding
  7. 18:05$app_openAcme Fit 4.12.0 · Pixel 8
  8. 18:05$identifyAndroid install joins usr_8f2k1x9q
  9. 18:07workout_startedprogram_id: strength-30
  10. 18:40checkout_completedplan: pro_yearly
  11. 18:40$purchase$89.00 · @rabolic/node · verified

Sample data · one person, four sources, one timeline

how it works

From anonymous visitor to one person.

Identity in Rabolic follows a few plain rules. You make one call; Rabolic does the linking and keeps every report consistent with it.

  1. 1

    anonymous_id

    Every device starts anonymous

    The SDK creates a random id for each browser and each app install, and every event carries it. Rabolic keeps a person for each one, so a visitor’s pages, screens and sessions are tracked before they ever sign up.

  2. 2

    identify('usr_8f2k1x9q')

    Sign-in turns the visitor into your user

    Call identify() with your own user id after signup or login. The anonymous person gets that user id, and nothing has to move: their history already belongs to them.

  3. 3

    $app_first_open → $identify

    New devices join the same person

    When the same user id is identified on a new iPhone, an Android phone or another browser, that device is attached to the existing person. From then on, its events land on one timeline.

  4. 4

    merge

    Earlier history follows them

    If a device had anonymous history of its own and then signs in as a user Rabolic already knows, the anonymous person is merged into that user. Reports read through the merge at once, and the raw ids on each event stay as they were sent.

merge

A known user on a new device keeps their history.

Someone browses your app on a new iPad, then signs in. Rabolic merges the iPad’s anonymous person into the user they already are, so their first screens count in the right funnel and their next purchase has the right source.

  • The merge is recorded, and reports follow it at once
  • Each event keeps the ids it was sent with
  • Newer profile properties win when two people merge

resolution rules

The rules, exactly.

What happens to an event, depending on what Rabolic already knows about its anonymous id and its user id. Two identified people are never merged.

WhenRabolic
A device Rabolic has never seen sends its first eventA new person is created for its anonymous id.
An anonymous person calls identify() with a new user idThat person becomes the user. Their earlier events are already theirs.
A new device identifies as a user Rabolic already knowsThe device is attached to that person.
A device with anonymous history identifies as a known userThe anonymous person is merged into the user, with its history.
An identified device sends a different user id (a shared device without reset())Nothing is merged. The new events go to the person with that user id, and Rabolic records an identity conflict.
Two different user ids meetNever merged. Two identified people always stay two people.

the sdk calls

The same user id, on every platform.

Call identify() when someone signs up or logs in, with the id your own database uses, and reset() when they log out. That is all the linking you write.

  • identify(userId, traits) on the web and in Flutter apps
  • reset() on logout: a new anonymous id and session
  • identify({ userId, anonymousId }) from your server
  • appLink(url) carries a web visitor into your app
// Web: after signup or login
rabolic.identify('usr_8f2k1x9q', { plan: 'pro' })

// On logout: a new anonymous id and session
rabolic.reset()

privacy

Linked by what you send, never by a guess.

  • No fingerprinting

    The SDKs never build a device fingerprint or read advertising ids (IDFA, GAID).

  • No IP matching

    IP addresses are used to look up the country and city, then dropped. They never link two people.

  • One project at a time

    People are resolved within a project. Ids are never matched across projects.

  • Your user id, your rules

    A person is only linked to a user id that your app or your server sends.

identity faq

Identity resolution, answered.

What happens to events from before someone signs in?

They stay with the person. If the visitor is new to your product, identify() gives that anonymous person your user id and nothing moves. If they already have an account from another device, the anonymous person is merged into that user, and their earlier events move with them.

Can two of my users be merged by mistake?

No. Rabolic never merges two people who are both identified. If a shared device sends a different user id without calling reset() first, the new events go to the person with that user id and Rabolic records a conflict instead of merging.

Do you use fingerprinting or IP addresses to match people?

No. The SDKs don’t fingerprint devices or collect advertising ids, and the server uses IP addresses only to look up the country and city before dropping them. People are linked by identify(), by your server naming the user, or by a link that carries the web visitor’s anonymous id into your app.

What should I use as the user id?

Your own stable id for the account, such as the primary key in your database. It should be the same on the web, in your apps and on your server, and it shouldn’t change when someone changes their email address.

What should my app do when someone logs out?

Call reset(). It starts a new anonymous id and a new session, and clears the user id, so the next person on that device starts fresh instead of being added to the last one.

How do server events find the right person?

Every event from the Node SDK or the HTTP API names a userId or an anonymousId. Calling identify({ userId, anonymousId }) on the server links that visitor to the user, which helps when sign-up happens on your backend.

Can I link a website visitor to the app they install?

Yes, through identify(): when the person signs in on the website and in the app with the same user id, both devices become one person, including the anonymous events from before. rabolic.appLink(url) and Rabolic.handleDeepLink already carry the visitor’s anonymous id into the app, but Rabolic doesn’t link people by that id yet.

Are people matched across my projects?

No. Each project has its own people, and ids are never matched across projects, even within one organization.

Give every person one timeline.

Start a 3-day trial without a card. It begins with your first event, so you can set up the SDKs first.

  1. 1

    Create a project

    Sign up, name your project, and copy its publishable key.

  2. 2

    Add an SDK

    Web, React Native, Flutter or Node.js, or the HTTP API. Or run npx rabolic init.

  3. 3

    Watch the first event arrive

    It shows in live events within seconds, and your trial starts then.