Compose a New Message
Start an outbound conversation from the inbox. Compose sends the first email and opens a ticket that the customer's reply threads back into.
Compose lets operators start a conversation from scratch instead of waiting for the customer to email first. It's useful for proactive support, follow-ups, or reaching out about an issue you discovered internally.
When to compose vs reply
- Reply when a customer has already written in and you want to respond inside an existing ticket thread.
- Compose when there is no existing ticket yet and you need to send the first message.
Opening the composer
There are two ways to open it from the inbox:
- Click the Compose button in the top-right of the ticket list.
- Press
con your keyboard.
The c shortcut works even when the inbox list panel is collapsed.
The compose form
The dialog contains the same fields you'd expect in an email client, plus the existing template picker.
To
Enter the customer's email address. On blur, the inbox looks up your workspace customers:
- If the address matches an existing customer, their name appears next to the field.
- If not, you'll see a New customer badge. A customer record is created automatically when you send.
Only a single recipient is supported in the MVP. Cc and Bcc are not available.
From
The From address depends on how many verified sending domains the workspace has:
- No verified domain — an error block is shown and Send is disabled. You (or an admin) must set up and verify a domain first.
- One verified domain — the address is shown as static text.
- Multiple verified domains — a dropdown lets you pick which address to send from. The workspace's active domain is selected by default.
The backend re-validates the chosen address on every send, so an unverified address cannot be used even if the client state is tampered with.
Subject
The subject line of the outbound email. Required.
Body
A rich-text message body. The formatting toolbar sits in the bottom action bar, and the same keyboard shortcuts work here as in the reply composer.
Press Cmd + Enter (Mac) or Ctrl + Enter (Windows/Linux) to send.
Templates
The Templates picker works the same as in the reply composer:
- Click Templates in the bottom bar.
- Search by name or category.
- Click a template to preview it with variables substituted.
- Click Insert to fill the body and, if the template has a subject, the subject line.
At compose time the ticket doesn't exist yet, so {{ticket_id}} and {{ticket_subject}} are left as literal {{…}} text. The available variables are:
| Variable | Resolves to | Fallback |
|---|---|---|
{{customer_email}} | The To address | — |
{{customer_name}} | The matched customer's name | The To address |
{{agent_name}} | Your display name | Empty string |
{{workspace_name}} | The current workspace name | Empty string |
See Reply Templates for more detail on creating and managing templates.
After sending
When you send, the app:
- Creates a customer record (or reuses an existing one by email).
- Creates a ticket with status Pending, source Outbound, and you as the assignee.
- Creates the first outbound message with a generated
Message-ID. - Enqueues the email for delivery via Resend.
- Invalidates the inbox list so the new ticket appears immediately.
Reply threading
The outbound email is sent with a generated Message-ID header. When the customer replies, their email client typically includes that ID in In-Reply-To or References. The ingest worker matches those headers against the stored messageIdHeader and threads the reply into the same ticket, regardless of whether the ticket is still pending or has been resolved in the meantime.
If a provider rewrites the Message-ID, a second safety net matches by subject + sender on known customers, so the reply still lands in the right conversation in most cases.
Error states
- Invalid email — shown inline and rejected by the API with a 400 error.
- No verified sending domain — both the UI and the API block sending. Set up a domain in Settings → Domains.
- Send to your own inbound address — blocked to prevent mail loops. The API rejects with a 400 error.
Limitations
- Single recipient only (no Cc/Bcc).
- No attachments on outbound compose in the MVP.
- No autosave/drafts for unfinished compose dialogs.