Prerequisites
- Admin role access to your tenant.
- To customize email templates, a configured SendGrid integration. Without it, email toggles are hidden and you’ll only see the In-App column.
- To customize SMS templates, a configured Twilio integration. Without it, SMS toggles are hidden.
- A rough idea of your message voice — friendly, terse, formal, whatever matches the rest of your customer communication.
Step 1: Open the Notification Templates list
Click Settings in the left sidebar, then Notification Templates (/manage/<tenant>/notification-templates). You land on a table with one row per notification type — 14 types total, from Lead Assigned at the top to Under Funded Bids at the bottom.
Each row shows the type name, a one-line description of when it fires, and column groups for the delivery channels your tenant has configured. Inside each channel group are two icon columns:
| Column | What it means |
|---|---|
| Visible | Whether customers can see this notification in their preferences. If off, customers can’t toggle it — it’s effectively forced on (or off, depending on Default). |
| Default | Whether the notification is enabled by default when a new customer contact is created. Customers can still change it themselves if Visible is on. |
-) in any column means that notification type doesn’t support that channel at all — e.g., Payment Failed is email-only, so it shows - for SMS and In-App.
Step 2: Open a template to edit
Click any row in the table. You land on the Edit <Notification Type> Template page (/manage/<tenant>/notification-templates/<type>/manage). The page has one collapsible section per channel — Email, SMS, and In-App — stacked down the page.
The order matters: the first supported channel is expanded by default, the rest are collapsed. Click a channel header to expand/collapse.
If the notification only supports some channels (e.g., Payment Failed is email-only), only those sections are rendered. Don’t go looking for the SMS section on Payment Failed — it doesn’t exist.
Step 3: Edit the template fields
Inside each channel section, the form has four fields:| Field | What it does |
|---|---|
| Visible to customers | Toggle. Matches the Visible column from the list. |
| Enabled by default | Toggle. Matches the Default column from the list. |
| Subject | The email subject line or in-app notification title. Required for email. Hidden for SMS entirely (SMS has no subject concept). |
| Body | The message content. Rich text editor for email (bold/italic/underline/strike), plain text for SMS, basic formatting for In-App. |
Step 4: Use template variables
Both Subject and Body support merge variables in{{ variable_name }} syntax. The system validates on save — reference a variable that doesn’t exist for this notification type and you get an inline error before the template is saved.
Always-available variables (every notification type):
{{ actionLink }}— URL to the most relevant page (lead detail, bid detail, account settings, etc.).{{ defaultActionText }}— Default button label for the action button (e.g., “View lead →”).{{ supportEmail }}— Your tenant’s support email from Company Profile.
- Lead-related (Lead Assigned, Outbid, Bid Matched, Return Approved):
{{ lead.full_name }},{{ lead.first_name }},{{ lead.email }},{{ lead.phone }},{{ lead.city }},{{ lead.leadType.name }}, plus{{ lead.details.field_name }}for any custom field on the lead category. - Bid-related (Outbid, Bid Matched):
{{ bid.amount }},{{ bid.scope }},{{ bid.status }}. - Buy order (Buy Order Exceeded, Buy Order Reinstated):
{{ buyOrder.amount }},{{ buyOrder.scope }},{{ buyOrder.status }}. - Customer-related (all):
{{ customer.name }},{{ customer.email }},{{ customer.phone }}. - Batch notifications (Under Funded Bids):
{{ customer.leads_count }},{{ leads_count }}.
Step 5: Embed the action link
For most notifications, the call-to-action matters more than the body copy. Two ways to wire up the button: Auto button (default): leave the body alone with no{{ actionLink }} reference. The renderer automatically appends a button at the bottom of the email with the default action text (View lead →, View bid →, etc.).
Inline/custom button: embed {{ actionLink | defaultActionText }} or your own link text where you want the button to appear. The renderer intercepts this and builds a proper action button in email and a URL append in SMS.
Step 6: Save (per channel or all at once)
Each channel section has its own Save button that commits just that channel. The page header has a Save All button that commits every channel in one click. If your template has a variable validation error, Save fails and shows the error inline on the field. Fix the typo, save again.If you’re editing email only but haven’t touched SMS or In-App yet, use the per-channel Save. Save All triggers validation on every form, and an unrelated SMS typo will block your email save.
Step 7: Reset a template to default
At the bottom of each channel section, next to Save, is a Reset to Default button. It clears your customizations for that one channel and restores the out-of-the-box template. Requires confirmation in a modal before the reset runs. At the top of the page, the header Reset All to Default button wipes every channel for this notification type and restores all defaults in one click. Useful when you’ve hacked up a template badly and want to start over.Step 8: Walk through a realistic edit
A worked example — customizing Lead Assigned for a customer named Acme Mortgage:- Open Notification Templates → click Lead Assigned.
- In the Email Template section:
- Subject:
New lead for {{ lead.leadType.name }} — {{ lead.city }} - Body:
<p>Hi {{ customer.name }},</p><p>You just won a new {{ lead.leadType.name }} lead: <strong>{{ lead.full_name }}</strong> in {{ lead.city }}. Phone: {{ lead.phone }}.</p><p>{{ actionLink | View lead → }}</p>
- Subject:
- Click Save on the Email section.
- Expand SMS Template and set Body to:
New lead: {{ lead.full_name }} ({{ lead.city }}). {{ actionLink }} - Click Save on the SMS section.
- Leave In-App Template as-is or lightly edit the subject — it’ll inherit a decent default.
Step 9: Adjust visibility and default enrollment
Back on the edit page, the two toggles at the top of each channel control the customer’s preference experience:- Visible to customers off = the customer can’t toggle this channel off in their preferences. Use this for must-send notifications like Payment Failed.
- Enabled by default off = new customers won’t have this channel enabled unless they opt in. Use this for optional/noisy notifications like Bid Matched.
What happens next
With templates tuned:- Customers receive branded messages that look and sound like your company. The Customizing the portal branding flows through — avatars and logos appear in emails without extra configuration.
- Customer notification preferences — customers can still toggle visible channels on/off from their portal’s Account → Notifications page. See Notifications for the buyer-side view.
- Webhooks are separate — if you want notifications hitting your own webhook endpoint (CRM, Slack, etc.), configure that in Tenant webhooks, not here. This page only covers customer-facing messages.
- Adding a new notification type requires app-side code changes — the 14 types are fixed. If you need one that isn’t in the list, it’s a product request, not a configuration change.

