The problem is larger than it looks
An expert-built Fullstory segment — constructed by searching for users who visited the hotel search results page and subsequently encountered the #RedemptionError UI element in order, within the same session — captures the true exposure footprint.
A race condition, not a data problem
The booking SPA runs client-side validation on page mount — before the async rewards availability API has had time to respond. This is the core defect. Authentication status, loyalty tier, travel dates, and property configuration are all irrelevant to whether the error fires.
// Secondary JS error fires when user attempts to click "Select" post-error (11 sessions): ReferenceError: Can't find variable: s // Occurs even on the rare occasions when the redemption error UI resolves itself
23 sessions reviewed in full
Every session in the expert segment was reviewed systematically using Fullstory's session event stream. Sessions were drawn across loyalty tiers, platforms, geographies, and session dates to ensure breadth of coverage. All 23 confirmed the same error pattern.
Session Group A — Guest & Basic Members
10 sessionsSession Group B — Silver & Gold Members
4 sessionsSession Group C — Platinum & Platinum Achiever
4 sessionsSession Group D — Platinum Premier & Lifetime Elite
5 sessions| Session Identifier | Tier | Platform | RLM Visits | Outcome |
|---|---|---|---|---|
| iOS / Terryville | Guest | iOS Safari | 5 | Abandoned |
| Linux / San Jose | Guest | Linux Chrome | 6 | Abandoned |
| OSX / Mount Healthy | Guest | macOS Safari | 4 | Abandoned |
| Win / Haverstraw | Platinum Achiever | Windows Chrome | 9 | Abandoned |
| OSX / hskeels | Gold | macOS Chrome | 20 | Abandoned |
| OSX / Rancho Cordova | Platinum Lifetime Elite | macOS Chrome | 37 | Abandoned |
| DC / jdman | Platinum Achiever | Windows Edge | 7 | Abandoned |
| Santa Monica / jenna | Silver | macOS Safari | 3 | Switched to cash |
| iOS / Tempe | Gold | iOS Safari | 6 | Abandoned |
| Highland City | Platinum Premier Achiever | Windows Chrome | 6 | Abandoned |
| Dallas | Guest | Windows Chrome | 7 | Abandoned |
| Enfield / cindijames | Platinum Premier Achiever | macOS Chrome | 7 | Abandoned |
| en-gb (London) | Guest | macOS Safari | 5 hotels, 5 date combos | Switched hotel, hit JS error |
| /ja/ (Japan) | Guest | iOS Safari | 4 | Abandoned |
| + 9 additional sessions | Various tiers | Various | — | All: error confirmed |
No tier, platform, or locale is spared
This is not a niche edge case. The error affects every authenticated loyalty tier from Basic to Platinum Premier Lifetime Elite, all major browsers and operating systems, and at least three distinct regional locales (US, UK, Japan). Authentication state is irrelevant — Guest users are hit with equal frequency.
| Tier | Sessions Reviewed | Error Observed |
|---|---|---|
| Guest (not enrolled) | 9 | Yes — all 9 |
| Member (basic) | 1 | Yes |
| Silver Elite | 2 | Yes — all 2 |
| Gold Elite | 2 | Yes — all 2 |
| Platinum Elite | 1 | Yes |
| Platinum Achiever | 2 | Yes — all 2 |
| Platinum Premier Achiever | 3 | Yes — all 3 |
| Platinum Premier Lifetime | 2 | Yes — all 2 |
| Platform | Browser | Affected |
|---|---|---|
| iOS | Safari | Yes |
| Android | Chrome | Yes |
| macOS | Chrome, Safari | Yes |
| Windows | Chrome, Edge | Yes |
| Linux | Chrome | Yes |
Frustration loops, not recoveries
When the error fires, users do not understand that they're stuck. They repeat the same action — visiting Rate List Menu, hitting the same error — in an attempt to recover. The experience produces the classic dead-end frustration pattern Fullstory captures as repeated navigation with zero conversion.
Additional errors compound the experience
Beyond the primary redemption race condition, four additional JavaScript errors were observed across the 23 sessions. Two are independently confirmed by Fullstory's automated opportunity detection.
| Error | Frequency in Sessions | User Impact | StoryAI |
|---|---|---|---|
| ReferenceError: Can't find variable: s | 11/23 sessions (48%) | Fires when user clicks "Select" — even after redemption error UI resolves. Blocks the select action. | — |
| TypeError: Cannot read properties of null (reading 'insertAdjacentHTML') | 8/23 sessions (35%) | Silent DOM manipulation failure; may prevent rate card rendering | — |
| React hydration errors #418 / #423 | 7/23 sessions (30%) | Server/client state mismatch on mount — may contribute to validation timing issue | — |
| Rate List — "Show With Taxes and Fees" checkbox TypeError | Observed in segment | TypeError on checkbox interaction; user can still proceed despite the error | ★ StoryAI Confirmed 2,987 users · WuNRo59zfFXd |
| Rate List — Room Selection Area Unresponsive | Observed in segment | Users repeatedly error-clicking rate/room area; multiple locale versions affected | ★ StoryAI Confirmed 233 users · FAt7MX0huesL |
Three actions, prioritized by severity
The root cause is addressable with a targeted fix to the validation timing. Two supporting changes — exposing the existing escape hatch and resolving the secondary Select error — would materially reduce harm for users already in the error state while the primary fix is developed and deployed.
Recommended Actions
These recommendations are sequenced by severity and independence. Fix 1 is the systemic repair. Fixes 2 and 3 are mitigations that can ship independently and faster.
Fix the race condition — gate validation on API resolution
The client-side validation executing redemptionNotAvailableError must not run until the rewards availability API response is confirmed. Options: (a) move validation into the API response callback, (b) add a loading/pending state that defers the validation pass, (c) check for presence of rewards data before executing the validation path. The simultaneous ×2 fire pattern suggests the validation is being triggered by component re-renders in parallel — worth auditing the React effect dependencies for the validation hook.
Surface the existing "View Rates" escape hatch
The #RedemptionError element already contains a "View Rates" button that navigates to reviewDetails.mi. Only 1/23 users discovered it. A simple styling change — larger button, higher contrast, explicit label "Continue to rates" — would allow a meaningful percentage of affected users to recover without waiting for the primary fix. This can ship as a CSS-only change.
Resolve the ReferenceError: Can't find variable: s
This error fires when users attempt to click "Select" on a rate, including after they have navigated away from an errored property to a clean one. The variable s is referenced but undefined in scope at click-time — likely a scoping or initialization issue with an analytics or tracking library (the single-letter variable name is consistent with a minified analytics SDK). This blocks users who have already partially recovered from the redemption error. Resolving it would give persistent users a real path to completion.
This analysis is a great starting point for an ongoing Fullstory Professional Services engagement. If you'd like this work to be more tailored or continuous, talk to your CSE or Account Executive about getting started.