Skip to content

[Sentry: APP-JSV / APP-JPQ] Dynamic route throws when "action" query param exists in both base path and suffix #98792

Description

@mountiny

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:

  1. Let the suffix win and drop the duplicate from the base, rather than throwing.
  2. 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:

  1. Open an expense from Search (/search/view/:reportID/expense-report).
  2. Enter a money-request flow that lands on the tag step, on a route that already has an action query param.
  3. Tap the control that builds the next dynamic route.

Related

Upwork Automation - Do Not Edit
Issue OwnerCurrent Issue Owner: @thelullabyy

Metadata

Metadata

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributor

Type

No type

Projects

Status
No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions