Personalise the empty states, not just the tour
The most common mistake in role-based onboarding is personalising the tour and then dumping every role into the same blank product. A tour is a layer of tooltips floating over an empty screen; the empty screen is where the user actually decides whether to stay. Personalise the canvas, not the commentary. The empty state is the highest-leverage surface in the entire first run, because it is the first thing the role sees that is theirs.
For each role, the empty state should be pre-populated towards that role's activation event, not a generic "nothing here yet" panel. The analyst's first screen shows a chart scaffold waiting for their data source, with the connect button as the obvious next action. The admin's shows an invite-your-team panel and a workspace checklist. The operator's shows their single most common task, pre-filled with everything that can be inferred, one field away from done. Each empty state is a different screen because each role's first real action is different, and the lift from this is the same mechanism as the whole playbook: you have removed the blank-page moment where a user has to invent their own next step.
The temptation is to hardcode a pretty placeholder, and that is the trap, because a static mock drifts from the live product and quietly lies to the user. Drive the empty state from the same backend the live experience uses, so a labelled sample row is a real row the user can act on and replace, not a screenshot. This keeps the path honest and keeps the activation event genuine, the same discipline that runs through the conversion work on the sign-up surface itself. When the user replaces your sample with their own first piece of real data, that is the aha moment landing, and it only lands if what they are replacing was real to begin with.