Actions at a Glance
| Action Type | Builder Label | Use When |
| navigate | Go to URL | Navigating to an external URL, special scheme (tel:, mailto:), or raw path |
| navigateToPage | Go to Page | Navigating to another page in the same app by page ID |
| navigateBack | Navigate Back | Going back in browser/app history |
| setURLParameters | Set URL Parameters | Updating the current page's query string without navigating |
| openShareDialog | Open Share Dialog | Opening the OS share sheet or copying a shareable link |
navigate — Go to URL
Sends the user to any URL or path. Use this for external websites, special schemes like tel: or mailto:, and raw router paths. For navigating to another page in the same app by page ID, use navigateToPage instead.
Parameters
| Parameter | Type | Required | Default | Description |
| path | string (URI) | Required (required) | — | The URL or path to navigate to. Supports {{ }} bindings for dynamic destinations. If missing, empty, or resolving to nothing, the action is a silent no-op. |
| target | "_self" | "_blank" | Optional (optional) | _self | Open in same tab (_self) or new tab (_blank). On mobile, _blank opens in the external browser. Only the exact string _blank opens a new tab — anything else routes in the current tab. |
| history | "push" | "replace" | Optional (optional) | push | Same-tab web only. replace swaps the current history entry (Back won't return here); push adds a new entry. Ignored when target is _blank. |
| preserveSearchParams | boolean | Optional (optional) | false | When true, merges the current page's query string into the destination URL. Params written inside path win per-key on conflict. |
Warning: Path resolution rule: A value that starts with http://, https://, //, a special scheme, or a leading slash is used as-is. Anything else gets // prepended (so google.com becomes //google.com). An in-app path with a dot (like pricing.v2) will be treated as an external host — always prefix in-app paths with /.
Note: Chain gate: NO. The navigate handler returns an already-resolved promise and cannot fail the chain. Put navigate last in a chain when it targets the same tab — the runner continues executing remaining nodes even after navigation starts.
Examples
External URL in a new tab
{ "actionType": "navigate", "payload": { "path": "https://docs.unifyapps.com", "target": "_blank" } }
Same-tab navigation replacing history (e.g. after login)
{ "actionType": "navigate", "payload": { "path": "/dashboard", "history": "replace" } }
Dynamic path with preserved query params
{ "actionType": "navigate", "payload": { "path": "https://example.com/orders/{{ variables.orderId }}", "preserveSearchParams": true } }
Email link
{ "actionType": "navigate", "payload": { "path": "mailto:support@example.com?subject=Help" } }
navigateToPage — Go to Page
Navigates to another page in the same app by page ID. This is the correct action for in-app routing — it performs an SPA route change, preserves app state, and supports passing page parameters and inputs to the destination.
Parameters
| Parameter | Type | Required | Default | Description |
| pageId | string | Required (required) | — | The destination page's ID (e.g. e_68a881264ee5a774c912d4c1 or a template slug like login). If missing or resolving to nothing, the action is a silent no-op. Fetch IDs from app overview — never invent them. |
| target | "_self" | "_blank" | Optional (optional) | _self | Open in same tab or new tab. Read raw (not through binding engine). Only the exact string _blank opens a new tab. |
| history | "push" | "replace" | Optional (optional) | push | History entry behavior. Read raw — write a literal, not a binding. Ignored when target is _blank. |
| pageParams | Array of {key, value} | Optional (optional) | — | Values for dynamic path segments (e.g. :id in /order/:id). Each entry has key (segment name) and value (string, supports bindings). A missing segment leaves :param in the path — a visible error in builder/preview, a silent no-op in deployment. |
| pageInputs | object | Optional (optional) | — | Query-string inputs serialized to the destination URL as ?key=value. Keys should match the destination page's declared query inputs. Supports bindings in values. |
| overridePageAnimation | boolean | Optional (optional) | false | Mobile only. When true, applies pageTransitionBehavior. Hidden on web. |
| pageTransitionBehavior | enum | Optional (optional) | — | Mobile only. One of: default, none, slide_from_right, fade, fade_from_bottom, modal, adaptive_sheet, full_screen_modal, overlay. Only applied when overridePageAnimation is true. |
Warning: Do not write openInNewTab. This is a form-only field in the builder that gets transformed to target before storage. Writing it in a stored payload is invalid. Always use target.
Examples
Simple same-tab navigation to a static page
{ "actionType": "navigateToPage", "payload": { "pageId": "e_68a881264ee5a774c912d4c1", "history": "push", "target": "_self" } }
Pass a dynamic path parameter to an order detail page
{ "actionType": "navigateToPage", "payload": { "pageId": "e_orderDetailPage", "pageParams": [ { "key": "id", "value": "{{ row.orderId }}" } ], "target": "_self" } }
Pass query-string inputs to a search results page
{ "actionType": "navigateToPage", "payload": { "pageId": "e_searchPage", "pageInputs": { "query": "{{ textInput_search['value'] }}", "category": "{{ select_category['value'] }}" } } }
Redirect-style navigation after login (no back history entry)
{ "actionType": "navigateToPage", "payload": { "pageId": "login", "history": "replace" } }
navigateBack — Navigate Back
Goes back in the browser or app navigation history — equivalent to the user pressing the browser Back button.
Parameters
| Parameter | Type | Required | Default | Description |
| navigateToSpecificPage | boolean | Optional (optional) | false | When true, navigates to a specific fallback page if there is no history to go back to (e.g. the user arrived directly via a deep link). |
| pageId | string | Optional (optional) | — | The fallback page ID to navigate to when navigateToSpecificPage is true and no history exists. |
Note: On mobile apps, navigateBack uses the native navigation stack — it is not just a history pop.
Examples
Simple back button
{ "actionType": "navigateBack", "payload": {} }
Back with fallback page (for deep-linked entry)
{ "actionType": "navigateBack", "payload": { "navigateToSpecificPage": true, "pageId": "e_homePage" } }
setURLParameters — Set URL Parameters
Updates the current page's query string without triggering a page navigation. The URL changes but the page stays mounted, making this ideal for filter state, active tabs, or any state you want reflected in the URL for sharing or back-button support.
Parameters
| Parameter | Type | Required | Default | Description |
| params | object or array of {key, value} | Required (required) | — | The query parameters to set. Keys map to URL parameter names. Values support bindings. Existing params not specified here are preserved. |
| history | "push" | "replace" | Optional (optional) | replace | Whether to push a new history entry or replace the current one when updating the URL. |
Update filter state in URL without navigating
{ "actionType": "setURLParameters", "payload": { "params": { "status": "{{ select_status['value'] }}", "page": "1" }, "history": "replace" } }
openShareDialog — Open Share Dialog
Opens the operating system's native share sheet (on mobile) or copies a link to the clipboard (on web). Use it on any "Share" button where you want users to forward a link to the current page or a specific record.
Parameters
| Parameter | Type | Required | Default | Description |
| title | string | Optional (optional) | — | Title text shown in the share sheet (mobile) or as the dialog heading (web). Supports bindings. |
| url | string | Optional (optional) | Current page URL | The URL to share. Defaults to the current page's URL if not set. Supports bindings for dynamic record URLs. |
| text | string | Optional (optional) | — | Additional body text included with the share (mobile only, passed to the OS share API). |
Share current page with a custom title
{ "actionType": "openShareDialog", "payload": { "title": "Check out this order", "url": "{{ window.location.href }}" } }
Share a specific record URL
{ "actionType": "openShareDialog", "payload": { "title": "Order #{{ row.orderNumber }}", "url": "https://app.example.com/orders/{{ row.id }}", "text": "View the full details of this order." } }
Choosing the Right Navigation Action
| Scenario | Use |
| Link to an external website | navigate with target: "_blank" |
| Navigate to another page in this app | navigateToPage with the page ID |
| Navigate to a page and pass a record ID in the URL path | navigateToPage with pageParams |
| Navigate to a page and pass filter values as query params | navigateToPage with pageInputs |
| Back button / cancel button | navigateBack |
| Update URL filters without reloading the page | setURLParameters |
| Share a link with the user | openShareDialog |
| Open an email client | navigate with path: "mailto:..." |
| Open a phone dialer | navigate with path: "tel:..." |
| After login, redirect without a Back entry | navigateToPage with history: "replace" |