# Navigate within the Dashboard using route descriptors
Soft, context-preserving navigation to Dashboard pages from your Stripe App.
> Route descriptors require SDK version 9.2.0 or later. To install or upgrade, run: `npm install @stripe/ui-extension-sdk@latest`.
Route descriptors let your app navigate users to specific Dashboard pages without triggering a full page reload, keeping their active session intact. A route descriptor is a JavaScript object that identifies a Dashboard page by name and, optionally, by resource parameters. Passing a route descriptor instead of a bare `href` string triggers a *soft navigation*. The Dashboard URL updates and the target page renders without a full page reload.
## Benefits of route descriptors
| | Plain `href` string | Route descriptor |
| --------------------------- | ------------------- | ------------------ |
| Navigation type | Hard reload | Soft (client-side) |
| Preserves active context | - Unsupported | ✓ Supported |
| Type-safe params | - Unsupported | ✓ Supported |
| Works across test/live mode | - Unsupported | ✓ Supported |
**Active context** refers to mode (test vs. live), the active account, and the current merchant session state. A hard reload resets that state; a soft navigation preserves it. This matters most when your app navigates users to related Dashboard objects — for example, from a drawer to a customer details page — because it keeps them in the session they were already in.
## Where to use route descriptors
Route descriptors are accepted wherever an `href` attribute or navigation argument is expected:
- [`Link`](https://docs.stripe.com/stripe-apps/components/link.md) `href` prop: navigates to the destination when selected
- [`Button`](https://docs.stripe.com/stripe-apps/components/button.md) `href` prop: navigates to the destination when the button is selected
- [`navigateToDashboardRoute`](https://docs.stripe.com/stripe-apps/reference/extensions-sdk-api.md#navigateToDashboardRoute) utility: imperative navigation
## Examples
### Link component
```ts
import {Link} from '@stripe/ui-extension-sdk/ui';
function CustomerLink({customerId}: {customerId: string}) {
return (
View customer
);
}
```
### Button component
```ts
import {Button} from '@stripe/ui-extension-sdk/ui';
function PaymentsButton() {
return (
);
}
```
### Imperative navigation with navigateToDashboardRoute
Use `navigateToDashboardRoute` when you need to navigate in response to an event (for example, after a form submission or a successful API call) rather than from a rendered link or button.
```ts
import {useCallback} from 'react';
import {Button} from '@stripe/ui-extension-sdk/ui';
import {navigateToDashboardRoute} from '@stripe/ui-extension-sdk/utils';
function App({customerId}: {customerId: string}) {
const goToCustomer = useCallback(() => {
navigateToDashboardRoute({
name: 'customerDetails',
params: {customerId},
});
}, [customerId]);
return ;
};
```
## Passing parameters to the destination view
Use the optional `envParams` field to pass custom key-value pairs to the `environment` prop of the view being navigated to. This is useful for communicating state across viewports without relying on external storage.
```ts
navigateToDashboardRoute({
name: 'fullPage',
params: {appId: 'my.app', tabId: 'details'},
envParams: {sourceViewport: 'drawer', recordId: '123'},
});
```
The destination view receives these values inside `environment.objectContext`.
## See also
- [Link component](https://docs.stripe.com/stripe-apps/components/link.md)
- [Button component](https://docs.stripe.com/stripe-apps/components/button.md)
- [navigateToDashboardRoute](https://docs.stripe.com/stripe-apps/reference/extensions-sdk-api.md#navigateToDashboardRoute)
- [FullPageView component](https://docs.stripe.com/stripe-apps/components/fullpageview.md)