Somebody asks how many logins you had yesterday, last month and over the last 30 days. You open your Adobe Analytics report suite and there is no login event to report on. What you do have is a page name, a URL and a variable that records whether the visitor was logged in when each hit was sent, usually an eVar, Adobe's name for a dimension whose value can carry over from one hit to the next.

Authentication Analytics Whitepaper. Practical guidance, rollout patterns and KPIs for passkey programs.
That is enough to work with. The question comes up often enough in the Adobe Experience League community that it has a settled answer. The thread with the accepted solution is the one this article follows: rebuild the login from the status variable using a sequential segment. It works. The number it produces still has to be read carefully once it lands in a board deck.
Section 3 builds the segment, click by click. Sections 4 to 6 are about reading the result: what it counts, what it misses and when to stop inferring and build a real login event instead. Section 7 says where that event belongs once you do.
Almost nobody decides against a login event. It goes missing for structural reasons.
The result is the same in each case. You have a state, not an event.
Even when nobody tracked the login itself, the change of state is still visible in the data. A hit where the user is logged out, followed by a hit where the same user is logged in, has a login somewhere in between. That is what the segment below looks for.
You need a variable that carries the logged-in state on every hit, usually an eVar or a prop set to yes or no. If it is only set on some pages, everything below turns into noise. Check the coverage first: an Occurrences report broken down by page shows you where the variable is missing.
In the segment builder, use a Visit container with a Hit level sequence and the Then operator, which Adobe documents as "one segment condition occurs, followed by another":
| Position | Condition |
|---|---|
| Checkpoint 1 | Logged In Status equals no |
| Then | After 1 Hit |
| Checkpoint 2 | Logged In Status equals yes |
| And | Logged In Status equals yes |
In the builder the two checkpoints sit above and below the Then row and the timing constraint hangs off that row, set to hits, not to the weeks shown here:
The Then operator between two checkpoints. Source: Adobe Analytics documentation (MIT licence).
Set the container to Only Before Sequence. Adobe defines that option as including "all data before a sequence and the first data of the sequence itself".
That last setting does two things. It stops the segment from returning the whole logged-in remainder of the visit, which is the reason it appears in the accepted community answer at all. It also means the hits you get back are not the login itself, so the result approximates a login count instead of defining one.
Jennifer Dungan, the Adobe Champion who published this structure, said the same in that thread. She compared it against a real login event on her own site and got close numbers, not identical ones. Do that comparison yourself before the figure goes into a report: against a login event in a neighbouring report suite, against an export from your identity provider or against a single day you can count by hand.
Run the segment with the Occurrences metric. Adobe defines it as the number of hits where a given dimension was set or persisted and it counts page views, link tracking hits and data source imports alike.
Page Views is the wrong choice here. If any step of your flow reports through s.tl() instead of a page view, that step disappears from the number without a warning. Tracking login success rate in Adobe Analytics describes the same mistake.
Experiment with passkey flows in the Passkeys Debugger.
Once the segment exists, the time dimensions handle the rest. Put the segment on a Workspace panel, add Occurrences as the metric and use a Day, Month or rolling date range. A rolling 30-day view is a date range component, not a second segment.
For unique logins, apply the same segment with Unique Visitors. Read section 5 before anyone treats that as a count of people.
The number is a reconstruction, built from a variable that describes the page. That is a useful thing to have and it is not the same as measuring an authentication.
Three things come with the method:
yes into a later visit where nothing was ever set.no hit to open the sequence. Those logins are not in the number at all.Unique Visitors on this segment counts browsers, not accounts. One person on a laptop, a phone and a work machine counts three times. A tablet shared by a family counts once. Adobe cannot tell the difference unless your implementation sets a hashed customer ID and you report on that instead.
Outside the analytics team, "unique logins" reads like "users". Write the definition next to the number in the dashboard. One line stops the figure being compared against an account count from the identity provider, which measures something else entirely.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users, alongside their existing IDP.
Read the case studyBuild the workaround, then stop defending it once one of these shows up:
The fix at that point is an attempt event and a success event firing through link tracking. It takes an afternoon and track login success rate in Adobe Analytics has it step by step.
Before you plan the implementation, one thing is worth knowing, because it decides where the event belongs.
An attempt event that fires on a page load inherits the blind spot of the inferred number. It needs a page to load and a lot of logins never load one:
So fire the attempt event where the attempt actually happens: in the submit handler for a password or a code and around the navigator.credentials call for a passkey. Then the attempt is counted and every failure that comes back as an error is counted with it. Only the ignored autofill offer stays outside, because it never produces an error to catch. Leave the event on the page load instead and the success rate keeps looking fine while the funnel underneath it does not. Why Adobe Analytics cannot debug login failures has the full list.
You only need an inferred login count because nobody ever instrumented the login as an event. Corbado Observe is the authentication observability layer that does instrument it, including the parts that never reach a page tag. It runs client-side next to the login you already have, works with any identity provider and sends UUID-only telemetry with no PII, so it answers the authentication questions while Adobe keeps the page-level ones.
Adobe keeps reporting on the pages around the login. Observe reports on the login.
The sequential segment is the right answer to the question as asked. Build it, use Occurrences, set Only Before Sequence and write the definition of "unique" next to the number.
Then be clear about the ceiling. It counts successes, it depends on a variable that was never meant to count anything and it cannot say why a login did not happen. Once that becomes the question, a smarter segment will not help. An event fired around the authentication call will. The authentication analytics playbook has the wider metric set and login success rate has the definition to agree on first.
Corbado is the Passkey Intelligence Platform for large-scale CIAM teams running consumer authentication. We help you see what IDP logs and generic analytics tools can't: where passkeys, passwords, OTP, social login and fallback journeys succeed, stall or fail, which devices and browsers create friction, and when an OS update silently breaks login. Two products: Corbado Observe layers process mining and observability across authentication journeys. Corbado Connect adds managed passkeys with analytics built in alongside your IDP. VicRoads runs passkeys for 5M+ users with Corbado (+80% passkey activation). Talk to a Passkey Expert →
Build a hit-level sequential segment inside a Visit container that matches a hit where the logged-in status is no, followed after one hit by a hit where the status is yes, with a second condition requiring the status to be yes. Set the container to Only Before Sequence and report it with the Occurrences metric. It infers a login from the state change instead of measuring an authentication, so it counts successes only and it approximates the count rather than defining it. Validate it against a number you already trust before anyone reports it.
Adobe documents Only Before Sequence as including all data before a sequence and the first data of the sequence itself. Without it the segment returns the whole logged-in tail of the visit, which inflates any hit-based metric built on top of it. With it the returned hits are still not the login hit itself, so the result stays an approximation and never becomes a definition.
Occurrences. Adobe defines it as the number of hits where a given dimension was set or persisted, counting page views, link tracking hits and data source imports alike. Page Views would miss any login that happens through a link tracking call. Visits would answer a different question.
No. A failed login produces no state change, so it produces nothing for the segment to match. The only rate you can build on an inferred login count is successes over visits, which is a reach metric, not a success rate. Login success rate needs an attempt event that fires before the outcome is known.
Decide what unique means before you build anything. Unique Visitors on the segment counts people who logged in at least once in the period, keyed on the analytics identity instead of the account. A user on three devices counts three times and a shared device counts once, so the number answers a device question instead of an account question unless your implementation sets a hashed customer ID.
Subscribe to our Passkeys Substack for the latest news.
Related Articles
Table of Contents