Adobe Analytics measures what happens after a login. Why a login did not happen is a different question. For the logins that now run inside the browser itself, passkeys above all, Adobe has no data to answer it with. Sections 3 and 4 make that case in detail and section 5 prices up what closing the gap inside Adobe would cost.

Authentication Analytics Whitepaper. Practical guidance, rollout patterns and KPIs for passkey programs.
The reason is not a weakness of the product. Adobe reports what a tag sends it. A login that fails on the user's own device sends nothing at all. A cancelled Face ID prompt, a password manager overlay covering the form, a passkey offered in the browser's autofill dropdown and ignored: none of them produce a page load, a click or a link call. In an Adobe funnel they look exactly like somebody closing the tab. Classic password logins are the easier case here, because a rejected password usually still renders something, which is why this article is mostly about the client-side methods where nothing renders at all.
Two things are worth saying before the passkey examples start, because they decide whether this article is about your stack. The first is that the gap is client-side rather than passkey-specific: a one-time code requested and never submitted, a user who leaves for their SMS inbox and does not come back, a step-up MFA challenge that stalls, all produce the same silence in a page tag. The second is that the passkey cases are simply where the silence is total, which makes them the clearest way to show the mechanism. If you have no passkeys in production, sections 4 to 7 still apply to the flows you run today.
The four authentication failure types that never reach a tag, what they do to your login success rate, what it takes to instrument them inside Adobe and which questions belong in which tool.
Adobe is a strong product and enterprise analytics teams know it well, so it is worth being precise about where the limit sits.
Fallout and Flow visualizations handle funnels properly. Adobe's own documentation names "a purchase or registration process" as a use case, there is no limit on the number of touchpoints and you can mix dimensions, metrics and segments freely as steps. Calculated Metrics handle rates in a single definition: divide one event by another, format as percent, done. Customer Journey Analytics goes further and supports person-level analysis when stitching is configured.
So the problem is not that Adobe cannot build a login funnel. It sits one layer below the report.
Adobe reports what a tag gives it. A passkey login gives a tag nothing.
The four cases below are not four versions of the same thing. The first is a reason a login fails, the second is what that failure looks like in your code, the third is a passkey offer the user never acts on and the fourth is a login that moves to another device. One login can run into all four.
Held against what the tag recorded, all four sit in the same gap. The tag sees the login page load and it sees whatever hit comes next, if there is one at all. What separated the two is missing:
One piece of vocabulary first, because the rest of this section needs it. The ceremony is the part of a passkey login that the browser runs: your page makes a call, the browser shows the Face ID or Windows Hello prompt and hands back either a credential or an error. Everything in between belongs to the browser, not to your page.
And it is fragile. The Web Authentication API cancels a running create() or get() call as soon as the browser window loses focus. MDN states this directly: the calls "are canceled if the browser window loses focus while the call is pending", for security reasons.
A user who switches to their password manager app to look something up has just aborted their own passkey login. No error page renders, no link is clicked, nothing navigates. There is no hit.
When a passkey login fails, the browser almost always returns the same error: NotAllowedError. The W3C specification uses it for three completely different situations. The user cancelled. The ceremony ran out of time. Or there was no passkey on the device to begin with.
That is deliberate. If the browser said "you have no credential here" instead of "you cancelled", any website could quietly test whether a visitor has a passkey registered. The W3C looked at adding separate NoCredentialsError and UserCancelledError codes in issue #2062 in April 2024 and closed it without them.
More tools do not fix this. We have analysed production passkey deployments that run five separate observability platforms side by side, covering web analytics, real user monitoring, session replay, feature flagging and device fingerprinting. Every failed ceremony reaches all five as the same string: the operation either timed out or was not allowed, NotAllowedError.
The consequence applies to every vendor including us: no tool can read the reason out of the error object. What a tool can do is work the reason out from what surrounded the call. Was passkey autofill available and active on this device? What did the browser report it was capable of? How long did the call run before it failed, given that half a second looks like somebody cancelling and five minutes looks like a timeout? And which path did the user take next?
All of that has to be collected while the login is running. Afterwards it no longer exists. It was never in the page to begin with.
Experiment with passkey flows in the Passkeys Debugger.
Passkey autofill, or conditional mediation, behaves unlike any other login interaction. Your page starts a get() call that then simply waits. Nothing appears until the user taps an input field marked autocomplete="username webauthn". At that point the browser offers the passkey in its own dropdown.
That dropdown is drawn by the browser, on top of your page rather than in it. No element appears in the document, no click handler fires, no form is submitted and nothing navigates.
Activity Map makes this concrete. It tracks links with an href, form submits, buttons and elements carrying an s_objectID or a tl() call. A passkey dropdown is none of those, because it is not part of your page at all.
So the central question in a passkey rollout, whether the user was offered a passkey and ignored it, has no answer in the page. Session replay runs into the same wall: a replay rebuilds the document and none of this ever touched the document.
In a cross-device login the user starts on a desktop and finishes on their phone. The desktop shows a QR code, the two devices check over Bluetooth that they are in the same room and the passkey itself stays on the phone.
The phone never loads your page. It fires no tag and Adobe never gives it a visitor ID. The result does come back to the desktop, because the phone only stands in as the authenticator and never opens a session of its own, so a success event can fire there. What does not come back is the middle: what the phone showed, how long the user hesitated, whether they scanned at all. Adobe sees two desktop hits with a gap in between. That gap could be anything.
Most enterprise teams define login success rate as successful logins divided by login attempts. In Adobe that is one Calculated Metric and building it takes about five minutes.
Three things go wrong before you get there and the metric shows none of them.
First, the events may not exist. The Adobe Experience League community sees the question regularly: how to report on logins when nobody ever implemented a login event. The accepted answer is a sequential segment that infers a login from a state change, counted with the Occurrences metric. It works. It also means your login number is reconstructed from a variable that describes the page, which is not the same as measuring an authentication.
Second, the numerator and the denominator may live in different report suites. Web, native app and transactional email are frequently instrumented separately. Adobe is explicit about what that costs: "Data from multiple report suites cannot be combined in tables, segments or calculated metrics (summed, divided, etc)." Two report suites can sit side by side in one Workspace project, but one cannot be divided by the other. That is where the second dashboard and the manual arithmetic come from. No amount of skill on the analytics team removes it.
Third, the failures may be missing from both sides of the fraction. Picture a user who opens the login page, gets a passkey prompt, ignores it until it times out and closes the tab. That was a login attempt. Whether your metric knows about it depends on where the events fire.
If the attempt event fires on a page load, the tag learned nothing about the prompt and nothing about the timeout, so the success rate does not move. If somebody wrapped the navigator.credentials call and sent an event on the rejection, the failure shows up. Check which of the two you have before you accept the gap as unavoidable. And note how long this can take: the specification recommends a timeout of five to ten minutes, production deployments often set three, so a prompt can sit unanswered for minutes before anything counts as a failure at all.
The third case is easier to see as a fraction:
A fourth trap has nothing to do with passkeys. One team we work with found their analytics counted a user as successfully logged in even when that user dropped out mid-journey, because the success event fired on a page load before the journey was complete. The aggregate looked healthy. The funnel underneath it was not.
None of these is a reporting bug. Each one is a gap in what gets collected. No report can warn you about data it never received. The same pattern shows up in tracking logins with Google Analytics 4, a different tool with the same blind spot.
All of it is possible. It is just not a configuration task. The table below is what the work actually consists of.
| Step | What it involves |
|---|---|
| 1. Client instrumentation | A JavaScript layer around every navigator.credentials.get() and create() call: try/catch, an event per err.name, timing, plus a check of what the browser can do before the call |
| 2. Tag layer | Data layer pushes or Direct Call Rules in Adobe Tags for every one of those signals |
| 3. Schema and mapping | With Web SDK: extend the XDM schema, configure the datastream, map fields to eVars, props and events. With AppMeasurement: maintain linkTrackVars and linkTrackEvents for every call |
| 4. Report suite | Create the events, set expiration and allocation, work around the 255-byte limit on eVars when storing error text and decide which suite this lives in if login spans web and app |
| 5. Data volume | Every one of these is an s.tl() call and Adobe counts link tracking as a server call |
| 6. Maintenance | Browser and OS behaviour around passkeys changes several times a year. Each change is a re-test of the instrumentation |
Step 5 is where the conversation usually stops in enterprise environments. Adobe Analytics is licensed by server call volume, so tracking every step of a login is a budget question rather than a sprint ticket.
Step 6 is where it stops in engineering. Nobody ever finishes this project. It turns into a component the team has to maintain.
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 studyThe question is not which tool replaces which. It is which tool owns which question. Adobe itself documents specialised tools running alongside Adobe Analytics, including its own Customer Journey Analytics use-case documentation for third-party session replay data. More than one analytics layer is Adobe's documented practice, not a workaround.
| Question | Where it belongs |
|---|---|
| How did users reach the login page and what did they do after? | Adobe Analytics |
| What is the attribution path and the business impact of a session? | Adobe Analytics / CJA |
| Which page-level content drives sign-ups? | Adobe Analytics |
| Was a passkey offered on this device and browser, then used? | Authentication observability layer |
| Why did this specific WebAuthn ceremony fail and what happened next? | Authentication observability layer |
| How many users requested an SMS or email code and never used it? | Authentication observability layer |
| Where does a step-up MFA challenge lose people inside the flow? | Authentication observability layer |
| Which credential manager did the user land in? | Authentication observability layer |
| Did last week's OS update break login for a segment of users? | Authentication observability layer |
| Reconstruct one user's login history to close a support ticket | Authentication observability layer |
Corbado Observe sits in the second column. It does not replace Adobe Analytics, it does not replace your identity provider and it has no interest in your page-level tracking. It instruments the authentication ceremony and reports what happened inside it, the ground covered in authentication observability.
A passkey rollout is not the trigger for this. The gap is client-side rather than passkey-specific and it applies to your SMS, OTP and MFA flows today.
Try passkeys in a live demo.
The four failure types above have one thing in common: they happen inside the browser's own authentication interface, where a page tag has nothing to observe. Corbado Observe is the authentication observability layer that instruments the ceremony. It is a client-side integration next to the login you already run, it works with any identity provider and it sends UUID-only telemetry with no PII, so it sits next to Adobe Analytics instead of replacing it.
navigator.credentials call with its timing, its outcome and the client capabilities that preceded it, reconstructed as a funnel instead of inferred from page loads.NotAllowedError that reaches every tool gets split by how long the call ran, by whether the client could offer a passkey at all and by what the user did next, so an error spike after an OS update reads as a pattern instead of noise in a support queue.Adobe keeps the questions in the top half of that table. Observe answers the ones underneath.
Adobe Analytics answers a narrower question than its reports suggest: of the login attempts the page could observe, how many produced a success the page could observe. Everything that fails inside the browser's own authentication interface falls outside that sentence.
That is no reason to remove Adobe. It is a reason to stop expecting it to explain client-side authentication and to measure the ceremony where it happens. For the metric definitions first, start with authentication drop-off rate and the authentication analytics playbook.
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 β
Adobe Analytics can track any error you explicitly send it through a custom link call or a Web SDK event. It cannot track errors that never surface as a page event, which includes most WebAuthn failures, cancelled biometric prompts and passkey autofill offers the user ignored. Adobe also documents that custom links are never tracked automatically, so every one of these signals has to be instrumented by hand before it can appear in a report.
Usually because failed attempts never fired an event. If your attempt event fires on a page load instead of around the authentication call, a user who cancels a biometric prompt or lets a passkey ceremony time out is missing from the numerator and from the denominator, so the rate does not move while the funnel underneath it gets worse. The second common cause is a success event that fires on a page load before the login journey is actually complete, which counts users as logged in even though they dropped out mid-flow.
Because Adobe cannot combine data from multiple report suites in a table, segment or calculated metric. If web logins and app logins are instrumented in separate report suites, Analysis Workspace can show both suites side by side in one project but cannot divide one by the other, so the final division has to happen outside Adobe.
Yes, if the events exist in the dataset. Customer Journey Analytics supports person-level analysis when stitching is configured, with documented limits such as single-level rekeying only, one namespace per ID field and stitching stopping for a shared device above 50,000 user switches. The constraint is rarely the query. It is that the authentication events were never captured.
No. The reason is structural rather than a question of quality. Replay tools reconstruct the DOM, while the passkey prompt, the autofill dropdown and the biometric sheet are browser and operating system interface elements drawn outside the document. They never appear in a replay, which is why session replay cannot answer whether a passkey was offered and ignored.
Subscribe to our Passkeys Substack for the latest news.
Related Articles
Table of Contents