Arrival from another source leaves Back's destination undefined
Aliases: cross-source back · empty history stack · inbound link · referrer back
What it is
When a search engine, ad, email, push notification, or another site's deep link drops the user on an interior page, that page is often the first frame in this browsing context. Tapping Back may exit to the off-site previous page, a blank new tab, a container that then closes, or a default home that SPA routing substituted. The Back target is undefined on cross-source arrival: the failure is not mixing previous-page with parent-level, but that the history stack holds no reasonable in-product previous frame at the moment of entry. People still press the chevron, expecting to return to “wherever I was before I came in.”
Why it happens
Browser Back only promises to pop the stack top. It does not promise that the top belongs to your product. A landing page opened in a new tab often has a stack of one, so Back is disabled or closes the tab. Arrival from Google puts the SERP on the stack, so one Back leaves the product. In apps the case is harsher: a notification may spawn an activity with an empty back stack, and the default system Back destroys the task—visually a crash. Calling history.back() or finish() at that moment hands the next place to a frame the product never wrote.
Routing policy widens the uncertainty. If the landing page replaceStates to a canonical internal URL, the off-site source vanishes and Back becomes somewhere inside. If a login or locale interstitial is then pushed automatically, the stack gains frames the user never requested, and Back lands on those interceptors rather than the source. The next Back destination cannot be rehearsed, because the source is not part of the UI and is never named.
Studying it
Run a cross-entry Back task: open the same URL from in-site navigation, a simulated search engine, an email deep link, and an empty new tab; tap system Back; score the destination against a destination written down beforehand.
- Independent variables: source type, opening mode (same tab / new tab / app task), whether inbound routing pushed, replaced, or wrapped an interceptor.
- Dependent variables: destination–expectation match, unexpected exits from the product, verbal reports of not being able to explain “why I am here.”
- Methodological note: if the lab always enters from the site home, the cross-source condition never occurs. Mail and push must be true cold starts, not taps on a notification inside an already-populated task. Web logs in the Weinreich–Obendorf line repeatedly show large shares of sessions beginning at external search—an internal tree test never sees this failure.
Where it stops holding
When the user arrived from another page of the same product, the stack top is a known internal frame and this leaf does not apply; that is ordinary temporal Back. Safari and similar browsers freeze or force-reload cross-site Back via bfcache and privacy rules, so “return to source” can fail for reasons that are not the product’s router. Controlled WebViews (payment hops, OAuth) deliberately bind Back to closing the container; the uncertainty is then a protocol requirement, and the need is close, not a forged internal previous page.
Applying it
- On inbound entry, detect whether
history.lengthor the app task stack is empty. Do not callback()on an empty stack. Offer a reasonable in-site exit (that category, a search field, home) labelled with the destination’s name, not “Back.” - When the external source is known, do not
replaceit away unless login must follow immediately; after login, replace the interceptor so Back cannot stick on the sign-in page. - For pages opened from notifications or mail, pre-seed a parent stack (that category or list) so system Back has an internal frame to pop instead of finishing the task.
- Verify: in a private window, open the landing page from external search and tap Back. Record whether the user leaves, stays on a blank tab, or lands where the product claims. Repeat from a killed-process notification cold start. Both destinations must be stateable in one sentence before the tap.
Related
- Within the group: G4.01.1 Back to the previous page is not the same as up to the parent level · G4.01.3 Back should restore the page as it was left
- Adjacent: G4.02 Deep linking · G4.04 New window versus in-place navigation · G2.07 Navigation consistency
- Search terms:
cross-origin entry·empty back stack·deep link