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
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
- 09:12$pageview/pricing · utm_source=newsletter/pricing · utm_source=newsletter
- 09:14signup_completedmethod: googlemethod: google
- 09:14$identifyanonymous web visitor → usr_8f2k1x9qanonymous web visitor → usr_8f2k1x9q
- 09:31$app_first_openAcme Fit 4.12.0 · iPhone 15Acme Fit 4.12.0 · iPhone 15
- 09:31$identifyiOS install joins usr_8f2k1x9qiOS install joins usr_8f2k1x9q
- 09:33$screenOnboardingOnboarding
- 18:05$app_openAcme Fit 4.12.0 · Pixel 8Acme Fit 4.12.0 · Pixel 8
- 18:05$identifyAndroid install joins usr_8f2k1x9qAndroid install joins usr_8f2k1x9q
- 18:07workout_startedprogram_id: strength-30program_id: strength-30
- 18:40checkout_completedplan: pro_yearlyplan: pro_yearly
- 18:40$purchase$89.00 · @rabolic/node · verified$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
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
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
$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
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
Anonymous personMerged into Maya Chen
anonymous_id 7d03e1aa-…-5b2f
- $app_first_open
- $screen Programs
- $screen Paywall
identify('usr_8f2k1x9q')
Maya Chen
user_id usr_8f2k1x9q
- Events
- 4144
- Devices
- 23
iPad installation linked by identify(), with its 3 earlier events
Each event keeps the ids it was sent with; the merge is recorded, so reports follow it at once.
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.
| When | Rabolic |
|---|---|
| A device Rabolic has never seen sends its first event | A new person is created for its anonymous id. |
| An anonymous person calls identify() with a new user id | That person becomes the user. Their earlier events are already theirs. |
| A new device identifies as a user Rabolic already knows | The device is attached to that person. |
| A device with anonymous history identifies as a known user | The 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 meet | Never 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 appsreset()on logout: a new anonymous id and sessionidentify({ userId, anonymousId })from your serverappLink(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
Create a project
Sign up, name your project, and copy its publishable key.
- 2
Add an SDK
Web, React Native, Flutter or Node.js, or the HTTP API. Or run npx rabolic init.
- 3
Watch the first event arrive
It shows in live events within seconds, and your trial starts then.