Docs
Notifications and email
The bell, email delivery through Resend and editable templates.
ClientOS tells your team and your clients when something needs them, in the app and by email. Every notification has a place in one catalog, every email is sent through your own Resend account from your own domain, and you control both what goes out and what each message says. This page covers the bell, preferences, the event catalog, email settings, deliverability, templates and digests.
Where things live#
| Screen | Menu path | Route | Permission |
|---|---|---|---|
| The bell | Top bar, both apps | Everyone | |
| Your notification preferences (staff) | Avatar menu → Security → Your notifications | /settings/security | Everyone |
| A client's preferences | Portal → Settings → Notifications | /settings/notifications | Everyone |
| Sender, switches, bounces | Settings → Emails | /settings/emails | Emails |
| What each email says | Settings → Email templates | /settings/email-templates | Emails |
| Connect Resend | Settings → Integrations → Resend | /settings/integrations | Integrations |
Three layers decide who hears#
- The catalog says who an event is for and which channels it uses by default.
- Your workspace switch under Settings → Emails turns each event on or off for everyone, per channel.
- Each person's own preference turns their own copy off.
Nobody can switch on what the workspace has switched off. On top of that, an event only reaches people who could see the record anyway: billing events go to clients with Access invoices and staff with the relevant finance permission, order events go to clients with Collaborate on orders, and so on.
The bell#
The bell in the top bar shows an unread count and updates live, without refreshing the page. Open it to see recent notifications, filter Show by All or Unread, and click Mark all read. Clicking a notification opens the record it's about. When there's nothing new, it says you're all caught up.
In-app notifications are never bundled: if fourteen things happened, the bell shows fourteen rows.
Notification preferences#
Each person controls their own copy of every notification they can receive, with one switch in the app and one by email.
- Clients: portal Settings → Notifications.
- Staff: avatar menu → Security, under Your notifications.
The list only shows events that can actually reach that person. A role without finance access isn't offered the money events. Events marked "always sent" (such as sign-in codes) can't be switched off.
Event catalog#
ClientOS has 76 notification events, grouped under the same headings you see in Settings → Emails. Here's a summary of the main ones by group:
| Group | Main events | Who hears |
|---|---|---|
| Account | Welcome, sign-in code, password reset, team invitation, client invitation (all always sent, email only); team member joined | The person concerned; team join goes to staff who can see the team |
| Payments | Payment receipt, new invoice, overdue reminder, refund issued, account credit, credit paid out, payment needs confirming, card expiring; subscription started, renewal, renewal reminder, payment failed, past due, paused, cancelled; payment disputed; manual payment to confirm, manual payment not found; abandoned checkout (opt-in); referral commission earned and clawed back | Clients with Access invoices; staff with finance or subscription access |
| Orders | Order placed, brief reminder, brief submitted, delivery ready, download ready, delivery accepted, revision requested, order rated, order complete; cancellation requested, approved, declined; custom offer sent and paid; invoice paid, order made | Clients with Collaborate on orders; the assignee, followers and staff with order access |
| Support | Ticket opened, message from the team, ticket reply, client replied, internal note, ticket assigned, ticket closed, ticket rated, dashboard rated | Clients with Collaborate on tickets; the assignee, followers and staff with ticket access |
| Messages | Client message, message from the team, mentioned in chat, reminders when a client or the team is waiting | The people in the conversation |
| Forms | Form submission, form request (always sent) | Staff who can see forms, plus any "also send to" addresses; the client a form was sent to |
| Sales | New lead, thanks to the lead | Staff with lead access; the lead |
| Tasks | Task assigned, task offered to your role, task due, task comment | The people involved |
| Reports | Monthly report | Clients with Collaborate on orders; staff with Reports |
| System | Background job failed, payment without an order, notifications not sending (all always sent) | Staff with the relevant settings or finance access |
Always sent events can't be switched off by anyone, because people need them to reach their account or because they warn you something is broken. Opt-in events (such as Abandoned checkout) email people who haven't bought anything, so they're off until you turn them on, and never sent for anything that happened before.
Settings → Emails#
Sender#
| Field | What it does |
|---|---|
| Sender name | How mail is signed. Empty uses your company name. |
| Sender address | The from address. It must be on a domain Resend has verified; the screen lists your verified domains. |
| Reply-to | Where replies land. Empty sends replies to the sender address. |
A banner at the top tells you whether mail is going out: Sending through Resend, Resend connected but not able to send yet, or Nothing is sending.
Send a test#
Click Send me a test to send a real email to your own address through the same key and sender every notification uses. It reports what Resend answered. A sent test proves the key, the sender and the domain all work. Save your changes first: the test uses what's stored, not what's on screen.
Notifications#
Every event in the catalog is listed by group with an Email and an In app switch. Switching one off stops it for the whole workspace. Each person can still switch off their own copy of anything you leave on. Events marked Always sent have no switch; events marked Opt-in start off.
Sending through Resend#
In production, all email goes through your own Resend account. There is no other mail provider.
- Create a Resend account and verify your sending domain there.
- Go to Settings → Integrations, open Resend, and paste your API key.
- Wait for it to show as connected. ClientOS checks your domain and registers the webhook it needs.
- Add the Webhook signing secret from Resend so delivery reports can be trusted.
- Go to Settings → Emails, set the sender, and click Send me a test.
Until Resend is connected, nothing sends, including sign-in codes. Connect it before inviting anyone. See First run.
Credentials you paste are sealed (encrypted) before they're stored.
Bounces and complaints#
The Bounces and complaints panel on Settings → Emails shows Resend's delivery reports. When an address bounces for good or marks a mail as spam, it's added to a suppression list automatically and isn't mailed again.
| Reason | Meaning |
|---|---|
| Bounced | The address doesn't accept mail. |
| Marked as spam | The recipient reported a mail as spam. |
| Unsubscribed | The recipient unsubscribed. |
To mail an address again (after a typo is fixed, for example), remove it from the list and confirm. The panel also shows the Webhook address and whether Resend is reporting deliveries, and warns you if reports are failing the signature check, which usually means the signing secret changed in Resend.
Email templates#
Settings → Email templates lets you rewrite every email the product sends, with a live preview rendered by the same code that sends it.
Edit a template#
-
Pick a message from the Messages list on the left. Each shows when it's sent; edited ones are marked Custom.
-
Edit any of the fields:
Field What it is Subject What the inbox shows first. Phones cut it around 40 characters. Preview line The grey line beside the subject. Say the next thing; never repeat the subject. Heading The first line inside the message. Opening The sentence before the details. Button The button label. Leave empty to send no button. Closing The sentence after. Leave empty to end on the button. -
Insert variables (see below) by clicking them.
-
Save.
A field you leave on the built-in wording stays linked to it, so later improvements to the default still reach you. Reset to built-in deletes your words for that message; Discard edits throws away unsaved changes.
Whatever you type is escaped before sending: a pasted HTML tag arrives as text, never as markup.
Variables#
Each template lists the variables it supports, written like {{ invoice.number }}. Click one to copy it, then paste it into any field, and the real value takes its place when the email is sent. A variable with nothing behind it disappears rather than leaving a gap.
Preview#
The Preview shows the message as it will arrive, including the inbox row with your subject and preview line. Switch between:
- Email and Plain text,
- Desktop and Phone width,
- Light and Dark colour scheme,
- for payment emails, Can pay online or Anyone else, since the wording changes when the reader can pay with a connected gateway.
Click Send me this one to send the selected template to yourself. Save first; the test uses the stored words.
Every email automatically carries your logo, colours, company name and business address from Settings → Company.
Digests#
Bursts of email are bundled so people aren't flooded. The first email of a burst waits a few minutes; anything of the same kind that arrives meanwhile joins it, and they go out together as one digest.
| What | How it's bundled |
|---|---|
| Ticket replies | One email per ticket, sent once the conversation has been quiet for three minutes, never later than 30 minutes after the first reply. Quoted as a conversation. |
| Chat messages | One email per conversation, sent after five quiet minutes, never later than 30 minutes after the first. Quoted as a conversation. |
| Chat mentions | Bundled per conversation over five minutes. |
| Task assignments and offers | Bundled per task over one minute. |
| Task comments | Bundled per task over five minutes. |
If nothing joins, the single email goes out as itself. In-app notifications are never bundled.
Reminders that send themselves#
Some notifications are sent by scheduled checks rather than by someone's action: brief reminders, overdue invoice reminders, renewal reminders, card-expiring notices, tasks due, and chat reminders when a client or your team has been waiting. Each is sent at most a set number of times per record, so nobody is chased endlessly. See Invoices and credit and Messages and files.
Tips#
- Set a Reply-to that a person reads. Clients reply to notification emails.
- Turn off events your team doesn't act on rather than training people to ignore them.
- Rewrite the Welcome and New invoice emails first. They're the ones clients read most.
- Check Bounces and complaints after any bulk import of clients.