> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Quick-action deep links

> Open a pre-filled compose dialog on any channel page from a URL.

# Quick-action deep links

Every per-channel messaging page in the Orbit dashboard supports a `?dialog=compose` URL parameter that opens the compose dialog automatically on mount. Combine it with channel-specific query params (recipient, template, conversation context) to build deep links from internal tooling, contact lists, or browser bookmarks.

This is the same pattern used by the dashboard's own Quick Actions menu and the contact list's "Send message" button.

## Supported pages

| Channel  | URL                                 |
| -------- | ----------------------------------- |
| SMS      | `/messages/sms?dialog=compose`      |
| WhatsApp | `/messages/whatsapp?dialog=compose` |
| Email    | `/messages/email?dialog=compose`    |
| RCS      | `/messages/rcs?dialog=compose`      |
| Viber    | `/messages/viber?dialog=compose`    |
| Push     | `/messages/push?dialog=compose`     |
| Fax      | `/messages/fax?dialog=compose`      |

The dashboard's top-bar Quick Actions menu always uses these URLs; the entry chosen reflects the channels the operator's organisation has connected.

## Pre-fill the recipient

Append `?to=<E.164 or address>` along with `dialog=compose`:

```
/messages/sms?to=%2B14155552671&dialog=compose
```

URL-encode the `+` as `%2B`. Email addresses pre-fill as-is — `?to=alex%40example.com&dialog=compose`.

## Pre-fill a template

For SMS / WhatsApp / RCS, append `template=<template_name>`:

```
/messages/sms?dialog=compose&template=order_shipped
/messages/whatsapp?dialog=compose&template=appointment_reminder
```

The dialog opens with the template selector pre-set. Variables are presented as empty fields the operator must fill — the deep link cannot supply variables (this is a deliberate guard against templating-injection from external links).

## Thread into an existing conversation

For inbox-aware channels (WhatsApp, RCS, Viber, Email), include `conversation=<conversation_id>`:

```
/messages/whatsapp?dialog=compose&conversation=conv_abc123
```

The compose dialog opens scoped to that conversation thread; recipient + WABA selection are auto-resolved from the conversation row.

## Common combinations

```text theme={null}
# From a contact card → "Send SMS"
/${locale}/messages/sms?to=${encodeURIComponent(contact.phone)}&dialog=compose

# From a customer-success runbook → "Open WhatsApp re-engagement template"
/${locale}/messages/whatsapp?dialog=compose&template=call_permission_request

# From an internal Slack alert → "Reply on the existing WhatsApp thread"
/${locale}/messages/whatsapp?dialog=compose&conversation=conv_abc&template=outage_followup
```

## Locale prefix

Every URL is locale-prefixed: `/${locale}/messages/...`. When building from JS / TS, read the locale from the dashboard's `useLocale()` hook (or the URL path on a server-rendered page); when building from external systems, default to the operator's preferred language or `en`.

## Cross-channel dispatch from Quick Actions

The dashboard's Quick Actions component normalises a "Send message" intent into the right channel automatically. If you build a custom Quick Action via the Orbit SDK, prefer the same logic over hard-coding `/messages/sms`:

```typescript theme={null}
// Pick the first connected channel; fall back to SMS.
const channel = connectedChannels[0] ?? "sms";
const url = `/${locale}/messages/${channel}?dialog=compose`;
```

This avoids the previous behaviour where every Quick Action sent the operator to SMS even when SMS wasn't connected.

## What the dialog will NOT do

* **Auto-send** — the dialog always opens in compose mode and waits for explicit operator confirmation. There is no `&auto_send=true`.
* **Pre-fill body content** — `?body=` is intentionally unsupported; we don't want a malicious link from outside the org to draft messages on behalf of the operator. Use templates for repeatable content.
* **Bypass role guards** — the operator's role still controls whether the compose dialog renders at all. A viewer-tier role lands on the channel page but the compose dialog refuses to mount.

## See also

* [Channels overview](/channels/sms) — per-channel sending semantics.
* [WhatsApp Business Calling](/guides/whatsapp/business-calling) — the call-permission template that the WhatsApp permission-indicator CTA opens via this same deep link.
