Sentry
Both throw the same error from the same frame, on different routes.
Impact (snapshot at filing, 2026-08-17)
| Sentry ID |
Users (last 14d) |
Users (total since first seen) |
Events |
First seen |
| APP-JSV |
25 |
25 |
37 |
2026-08-04 |
| APP-JPQ |
9 |
9 |
10 |
2026-08-10 |
- Last seen: 2026-08-16 (ongoing)
- Platform: iOS HybridApp (
com.expensify.expensifylite); the same throw also reaches web
- App version(s): 9.4.52-11 and later
- Affected view(s):
Dynamic_Money_Request_Step_Tag, /search/view/:reportID/expense-report
- Mechanism:
onerror, level fatal
- Engine: Hermes, Fabric enabled, RN 0.85.3
Error
Error: [createDynamicRoute] Query param "action" exists in both base path and dynamic suffix. This is not allowed.
Stack trace (top frames)
mergeQueryStrings
createDynamicRoute
onPress
_performTransitionSideEffects
_receiveSignal
onResponderRelease
executeDispatch
executeDispatchesAndReleaseTopLevel
batchedUpdatesImpl
dispatchEvent
Source: src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts
Suspected cause
createDynamicRoute treats an action query param appearing in both the base path and the dynamic suffix as unrecoverable and throws. On a real navigation that assertion is too strict: the base path already carries ?action=... from the route the user is standing on, and the suffix adds its own, so a plain tap on a money-request step crashes the app instead of navigating.
The fix is likely one of:
- Let the suffix win and drop the duplicate from the base, rather than throwing.
- Stop the caller from passing a base path that still carries
action — the guard then stays as a genuine invariant.
Option 1 is the safer immediate fix because the throw is fatal on iOS.
Reproduction
Unknown as an exact click path. Both Sentry events fire from an onPress, so the trigger is a user tap and not a deep link. Starting points:
- Open an expense from Search (
/search/view/:reportID/expense-report).
- Enter a money-request flow that lands on the tag step, on a route that already has an
action query param.
- Tap the control that builds the next dynamic route.
Related
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @thelullabyy
Sentry
Both throw the same error from the same frame, on different routes.
Impact (snapshot at filing, 2026-08-17)
com.expensify.expensifylite); the same throw also reaches webDynamic_Money_Request_Step_Tag,/search/view/:reportID/expense-reportonerror, levelfatalError
Stack trace (top frames)
Source:
src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.tsSuspected cause
createDynamicRoutetreats anactionquery param appearing in both the base path and the dynamic suffix as unrecoverable and throws. On a real navigation that assertion is too strict: the base path already carries?action=...from the route the user is standing on, and the suffix adds its own, so a plain tap on a money-request step crashes the app instead of navigating.The fix is likely one of:
action— the guard then stays as a genuine invariant.Option 1 is the safer immediate fix because the throw is fatal on iOS.
Reproduction
Unknown as an exact click path. Both Sentry events fire from an
onPress, so the trigger is a user tap and not a deep link. Starting points:/search/view/:reportID/expense-report).actionquery param.Related
getPathFromStateandcreateDynamicRouteUpwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @thelullabyy