Video chapters
- 0:00 Welcome
- 0:11 How message templates work
- 0:36 Part 1 · Built-in templates: explained
- 0:51 Part 1 · Built-in templates — Customize the order confirmation
- 1:55 Part 2 · Your own email: explained
- 2:09 Part 2 · Your own email — Write the brewing-guide email
- 2:47 Part 3 · Test before you send: explained
- 3:00 Part 3 · Test before you send — Preview, fix a placeholder, send a test
- 3:47 Part 4 · Text messages: explained
- 4:00 Part 4 · Text messages — An SMS for order pickup
- 4:30 Part 5 · Put a template to work: explained
- 4:44 Part 5 · Put a template to work — An automation sends the guide
- 5:24 Wrap-up
Written guide
Message Templates keeps reusable message content in one place. An order notification can reuse a branded email; a receipt can reuse a print layout. The template controls the content. The operation that uses it supplies the data and decides when to send or print.
You will create an email template, preview it against an order, save and reopen it, and understand how built-in overrides and print layouts differ. You will also learn how to diagnose a message whose design looks right but whose customer name or order details are missing.
Evidence: screenshots below are retained application captures, inspected against the current editor source on 4 October 2026. Sample preview is shown; external delivery, all channel integrations and physical printing remain unverified for this course.

Generated concept illustration, not an application screen. The preview combines a record with a layout; it neither saves nor sends the message.
1. Choose the right template type
Open Message Templates, then choose Create New. Select Email for this walkthrough. The channel chooser determines the editor you receive; the channel is fixed when the template is created. To build a different channel, create another template instead of attempting to convert the email.

Email offers HTML and plain text. Print receipt / ticket offers structured receipt lines. The chooser also lists SMS, WhatsApp, Mobile push, In-app notification, Site popup, Site alert, Slack and Internal chat. Those choices identify content formats; they do not connect a messaging provider or make an unconfigured channel deliver messages.
Start with My Templates for your organization's saved records. Built-in contains templates supplied with the platform. Use search and the type/category filters to find a specific template. A count in these tabs is a count of templates, not sent messages.
2. Give your email a stable name
The Name is the template's identifier. Use a meaningful lowercase dashed name such as order-summary-practice. You can choose another available name. The faint pos-receipt-default text in a new form is a placeholder, not an instruction to name an email after a receipt.
- In Name, enter your chosen name.
- In Subject / Title, start with
Your order summary. A fixed subject makes the first layout check easier; add a variable after checking the sample data. - Leave From blank to use the organization default sender, or enter the configured sender appropriate to the operation. Typing a new address here does not provision or verify its mailbox.
- Set To to the recipient value supplied by the consuming operation. Do not copy an unrelated contact variable into an order template merely because the editor accepts the text.
- Keep the new template separate from any built-in override while learning the editor.
For an order-backed email, the built-in example below uses {{data.sf_order.email}} as its recipient. That is appropriate only when the operation provides an sf_order record with an email value.

Built-in customization has a different consequence. On the Built-in tab, find the intended template and choose Customize. Saving the matching name creates an organization override used wherever that built-in template is resolved. Its name is locked because changing it would break the match. Read the existing subject, variables and delivery type before replacing the content.
3. Write the email and its plain-text version
The HTML tab edits the email markup. On a wide screen, the Visual area on the right also supports editing directly: select words or an element to adjust the message. On a compact screen, use the Visual tab to reach that view. Keep the source and visual result consistent as you edit. Its layout preview helps you inspect spacing, headings and line wrapping. Switch between Desktop and Mobile to check that the message remains readable in a narrow view. This is a layout check, not proof of inbox delivery or compatibility with every email client.
For a small order summary, paste this into HTML. These field paths appear in the captured order preview; choose a sample order in the next section before expecting values to appear.
<h2>Your order summary</h2>
<p>Hello {{data.sf_order.name}},</p>
<p>Order <strong>{{data.sf_order.number}}</strong></p>
<p>Total: <strong>{{formatCurrency data.sf_order.amount}}</strong></p>Select Plain text and enter a readable fallback:
Your order summary
Hello {{data.sf_order.name}},
Order: {{data.sf_order.number}}
Total: {{formatCurrency data.sf_order.amount}}A plain-text fallback should still tell the customer what the message concerns. Do not paste HTML tags into that tab. If you add an item loop or a delivery link later, check its data separately before considering the message ready.
4. Use Variables to find the field, then test its value
Select Variables in the upper toolbar. Search for the collection used by the message, such as sf_order, expand it, and inspect its fields. Copy the required variable into the relevant subject or body location. Field names are schema names: a label that looks similar in another collection is not automatically interchangeable.

Now select Test. The test drawer renders the current edits, including edits you have not saved.
- Set Sample datatype to
sf_orderfor this example. Correct any automatically filled datatype if it belongs to a different kind of record. - Open Sample record and choose an order you recognize. The recorded example is Ada Park's order; your organization will have different records.
- Choose Preview with data. An external inbox is not needed for this preview.
- Read the rendered subject as well as the message body. Compare the name, order number and total with the selected record.
- If a value is blank, check the variable path and whether the sample record actually contains that value. Repeat the preview after correcting it.

This capture illustrates a useful failure to catch. The body displays Ada Park, TD-1042 and $73.44, but the subject ends Welcome to product-guide-mur4m8a2, without a name. A successful render request does not mean every field is correct. For this order example, use a subject such as Order {{data.sf_order.number}} — your summary, then preview again. That suggested correction requires its own preview; the screenshot above shows the earlier result.
Also notice the recipient configuration: a body using order fields and a To field using data.contact.email can depend on different data contexts. The sample preview of the body does not establish that the recipient will resolve correctly when the operation runs.
5. Save and reopen before using the template
Close the test drawer and select Save. Wait for the save result and return to the template list. Search for the exact name, reopen it, and check that the subject, HTML and plain text are still present. Previewing unsaved edits does not save them; sending a test is not a substitute for Save either.
To test email delivery, reopen Test, inspect Send test to, enter an inbox you control and choose Send test. The editor may prefill your signed-in email; check it rather than assuming it is the intended destination. Inspect the received message, including subject and recipient. A success notice alone is weaker evidence than the message appearing in the intended inbox.
No delivered test email is shown in this course's retained evidence. If the sender is not configured, finish Email Accounts before relying on delivery.
6. Apply content in the feature that uses it
Saving a custom template does not attach it to every order or customer automatically. The consuming feature must select or resolve that template and supply the expected data.
The captured Communications Center → Compose flow demonstrates loading template content:
- Open Compose and select Email.
- Expand Templates in the left column.
- Select the saved template by its name.
- Inspect the populated subject and body before choosing recipients or sending.

In this capture the template has loaded, but the editor still shows {{data.sf_order.name}} and other tokens. That proves content selection, not order-context resolution. Do not send raw tokens to customers. Check that the feature supplies the required record; if it does not, use content and variables supported by that feature. A standalone Compose action is not automatically an order notification.
For built-in templates, keep the matching name and test the actual operation that invokes it. For other channels, verify that channel's configured provider or receiving device. There is no universal consumer selector in Message Templates that connects every feature at once.
7. Create a print layout
Return to Create New and choose Print receipt / ticket. Use a separate name and set the Variant appropriate to the intended print operation. The editor explains that the server selects by variant at print time and the most recent matching template wins. Do not create competing live receipt variants just to experiment.

The initial layout already contains useful company, location and order fields. Work from that structure:
- Edit the company Text line. Choose its alignment, size and bold setting. Keep
{{company.name}}if the company should come from the print context. - Inspect the Image line's
{{company.logoUrl}}. A blank or unreachable logo value cannot become a printed logo merely by existing in the layout. - Use the up/down arrows to order lines. Remove only the lines you do not need; check the preview after each change.
- Add or edit a Two-column line for a label and amount. Keep long labels short enough for the paper width.
- For repeating purchased items, use a Loop over
itemswith Each asi. The default item line uses{{i.quantity}}x {{i.name}}and{{fmt i.lineTotal}}. These are print-context variables, not the email example'sdata.sf_orderpaths. - Add a Divider, Blank lines and Cut paper where appropriate. Signature and fill-in lines are available for documents that need them.
- Inspect JSON if editing the structured representation. It must remain an array; correct parse errors rather than assuming invalid text replaced the visual layout.
- Save, reopen and check the layout. Then invoke the intended print operation with the matching variant and inspect the paper output on the correct printer.
The right-hand preview uses sample receipt data. Its totals, company and location are examples; they do not prove your organization's data or device is connected. Paper width, logo support, cutter behavior and signature spacing need a real print check. See the Device Hub course for the hardware connection rather than treating a layout preview as a printer test.
8. Draft with Template AI
The Template AI bar works with the template currently open in the editor. Expand it if collapsed, type a specific request, then press Enter or use its send control. For example: “Make this order summary more concise, keep its order variables and keep the subject factual.” Use Shift+Enter for a new line instead of submitting.
Review the changed subject, body and variables in the editor; an AI response is not a saved template. Run Test → Preview with data again, inspect the result, then Save and reopen. The AI context includes template content and metadata, so avoid treating a broad rewrite request as a guarantee that recipients, variants or field paths remain suitable. You can stop generation and inspect the current result before making further changes.
The screenshot in the next section shows this bar in a notification editor. It is evidence that the control exists, not a verified AI rewrite or delivery.
9. Other channels, recovery and completion
For SMS, WhatsApp, mobile push, in-app notifications, site popups/alerts, Slack and internal chat, choose the matching type at Create New. These use Message Content rather than the email HTML/print-line editor.
- Give the template an identifiable Name and Subject / Title.
- Enter the intended text in Message Content. Use a variable only when the consumer supplies that value.
- Where shown, use Variant for the consuming operation's expected subtype; it is not a destination address.
- Save and reopen before testing through the actual channel. Compare the full saved message with what you entered.
- Verify it on the intended receiving surface: the phone for SMS/push, app notification area for in-app messages, correct website for popup/alert, or connected Slack/chat conversation.

Local repair and verification: the shared save path previously overwrote non-email content with the email buffer. It now preserves the selected channel’s content, and eight focused regressions pass. Fresh browser reopening remains pending. Non-email Test renders plain text only; Send test is available for email templates. A print text preview does not render the structured receipt or operate a printer, and an SMS text preview does not send an SMS. All channel-specific delivery still needs its own receiving-surface check.
A listed channel is a content option, not a connected provider. Use Phone + IVR + SMS for the number/sending setup and the relevant website/chat setup for visitor-facing messages.
Maintain saved templates
On My Templates, open the template card's three-dot Actions menu (it may appear on hover). Edit reopens that record. Clone starts a new editable copy with a generated name ending in -copy- and a short suffix; replace that name with a meaningful available slug, Save, then verify that both the original and copy remain. Cloning a built-in override into a differently named template does not make the new name replace the original built-in everywhere.
Use Delete only for the intended saved record and read its confirmation. If a template appears missing, clear search, type and category filters before creating a replacement. A loading failure has a retry control; it is different from a successful empty list.
To remove a built-in customization, find that entry on Built-in and choose its revert action. Read Revert to built-in default? before confirming. This deletes your organization's override; it does not merely undo an unsaved edit. Preserve any needed customized content first, then repeat the same sample and consuming-operation check against the default.
| What you see | What to check next |
|---|---|
| Raw braces in the design preview | Use Test → Preview with data. The layout view may not resolve records. |
| Correct body but incomplete subject | Check the subject's variables separately against the same sample. |
| Correct preview but wrong or missing recipient | Check To and the context supplied by the actual operation. |
| Preview correct, saved record old | Save, reopen the exact name, then preview again. |
| Template loaded into Compose but tokens remain | Verify that Compose has the expected data context; loading content alone is insufficient. |
| Built-in still appears unchanged | Confirm the override name matches the intended built-in and was saved. |
| Receipt preview works, printer does not | Check variant selection and Device Hub/printer connection independently. |
You are ready to use a template when the saved record reopens correctly, its fields resolve against the right data, and the real recipient or printer receives the intended result. Keep preview, persistence and delivery as separate checks.
Course evidence and remaining verification
The retained captures demonstrate editor choices, customization, sample data rendering and content applied in Compose. They do not establish outbound delivery or physical printing. Current source checked: message-template-dashboard.tsx and message-template-form.tsx in the UI's components/crm/message-template directory.
