docs
/
Courses — Appmint

Appmint Message Templates: email, messages and print layouts

Watch on YouTube ↗

Video chapters
  1. 0:00 Welcome
  2. 0:11 How message templates work
  3. 0:36 Part 1 · Built-in templates: explained
  4. 0:51 Part 1 · Built-in templates — Customize the order confirmation
  5. 1:55 Part 2 · Your own email: explained
  6. 2:09 Part 2 · Your own email — Write the brewing-guide email
  7. 2:47 Part 3 · Test before you send: explained
  8. 3:00 Part 3 · Test before you send — Preview, fix a placeholder, send a test
  9. 3:47 Part 4 · Text messages: explained
  10. 4:00 Part 4 · Text messages — An SMS for order pickup
  11. 4:30 Part 5 · Put a template to work: explained
  12. 4:44 Part 5 · Put a template to work — An automation sends the guide
  13. 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.

Concept illustration: order data plus a template becomes a personalized preview; delivery still needs a separate check.

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.

Create New offers Email, Print receipt / ticket and eight other channel choices.

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.

  1. In Name, enter your chosen name.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

A built-in order-tracking template being customized: its matching name is locked and the recipient references the order email.

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.

The Variables browser expanded for order fields. Use the collection expected by the consuming operation.

Now select Test. The test drawer renders the current edits, including edits you have not saved.

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

Order sample preview: Ada Park and order TD-1042 resolve in the body, while the subject ends after a comma and needs correction.

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:

  1. Open Compose and select Email.
  2. Expand Templates in the left column.
  3. Select the saved template by its name.
  4. Inspect the populated subject and body before choosing recipients or sending.

Saved template applied in Compose. The body still contains order variables and no recipient is selected; this is not a completed send.

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.

Print editor: structured lines on the left and a sample receipt on the right. The sample is not a physical printer result.

The initial layout already contains useful company, location and order fields. Work from that structure:

  1. Edit the company Text line. Choose its alignment, size and bold setting. Keep {{company.name}} if the company should come from the print context.
  2. Inspect the Image line's {{company.logoUrl}}. A blank or unreachable logo value cannot become a printed logo merely by existing in the layout.
  3. Use the up/down arrows to order lines. Remove only the lines you do not need; check the preview after each change.
  4. Add or edit a Two-column line for a label and amount. Keep long labels short enough for the paper width.
  5. For repeating purchased items, use a Loop over items with Each as i. The default item line uses {{i.quantity}}x {{i.name}} and {{fmt i.lineTotal}}. These are print-context variables, not the email example's data.sf_order paths.
  6. Add a Divider, Blank lines and Cut paper where appropriate. Signature and fill-in lines are available for documents that need them.
  7. Inspect JSON if editing the structured representation. It must remain an array; correct parse errors rather than assuming invalid text replaced the visual layout.
  8. 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.

  1. Give the template an identifiable Name and Subject / Title.
  2. Enter the intended text in Message Content. Use a variable only when the consumer supplies that value.
  3. Where shown, use Variant for the consuming operation's expected subtype; it is not a destination address.
  4. Save and reopen before testing through the actual channel. Compare the full saved message with what you entered.
  5. 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.

Notification template editor with Message Content, optional Variant and Template AI. The captured variable is unrendered test text, not a delivered notification.

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 seeWhat to check next
Raw braces in the design previewUse Test → Preview with data. The layout view may not resolve records.
Correct body but incomplete subjectCheck the subject's variables separately against the same sample.
Correct preview but wrong or missing recipientCheck To and the context supplied by the actual operation.
Preview correct, saved record oldSave, reopen the exact name, then preview again.
Template loaded into Compose but tokens remainVerify that Compose has the expected data context; loading content alone is insufficient.
Built-in still appears unchangedConfirm the override name matches the intended built-in and was saved.
Receipt preview works, printer does notCheck 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.

BusinessMade Message Templates: receipts, tickets and communications — supporting guide

BusinessMade entry: Content → Templates (/content/templates).

Use a receipt or kitchen-ticket print template as the BusinessMade example. A template must be selected by the actual print consumer and tested with its data; saving a print layout alone does not assign a receipt printer.

Scope: This BusinessMade route uses the shared component whose complete procedures follow. Use the BusinessMade menu and organization throughout. Shared references are implementation evidence, not instructions to switch products. These written steps have not been replayed as a new BusinessMade live walkthrough.

Reader update: Current mounted source and retained application images inspected 5 October 2026. No new BusinessMade save or external outcome is claimed.

Pick the consumer before writing the template

Start with the operation that will use the message: for example, a print receipt or a reservation email. Open Content → Templates, check My Templates for an existing organisation template and use Built-in to inspect the supplied alternatives. The type badge identifies the intended channel; it does not prove that channel is configured to deliver.

The retained list below includes old demo templates and a historical built-in count. Use search plus the type/category filters to locate your intended record; do not copy the example names or assume the built-in count remains unchanged. A print template supplies layout content but does not connect a printer, choose the business location or assign the receipt consumer.

BusinessMade Message Templates list with My Templates, Built-in and Create New

Personally inspected retained application view; current action/result captures remain pending.

Overview

This is BusinessMade Message Templates: email, messages and print layouts. We will configure the feature, use it and check the actual result. The essential setup comes first; the later chapters cover alternatives and recovery. Use the chapter list to return directly to a demonstration.

01. Choose the delivery type

Context

Message Templates gives reusable content to the operation that sends or prints it. The delivery type determines the editor and available fields. Saving the template does not itself deliver anything.

Follow the steps

Open Content → Templates and choose Create New. Select Email for the first example. Review the other available types: Print receipt / ticket, SMS, WhatsApp, Mobile push, In-app notification, Site popup, Site alert, Slack and Internal chat.

Check the result

Type availability is documented; each channel’s consumer/provider must be verified separately. Do not treat a listed WhatsApp template type as proof that Broadcast’s WhatsApp channel is live.

02. Name and customize the template

Context

A custom template has a stable slug. A built-in override must keep the original matching name, which the editor locks. The title and variant describe or select its purpose.

Follow the steps

Enter a unique lowercase dashed Name and Subject / Title. For a built-in alternative, return to the built-in list and customize the intended entry; retain its locked name. For print or notification, set the required Variant. Choose Save and reopen the same record.

Check the result

The print editor says variants are selected at print time and the most recent wins. Confirm the actual consuming operation and selection before overriding a live receipt.

03. Build email and channel-specific content

Context

Email supports HTML and a plain-text fallback. From can use the organization default or a configured sender; To can use an actual recipient variable. Each value needs to match the consuming operation.

Follow the steps

In an Email template, enter Subject / Title, set From if overriding the organization sender, and configure To with the intended address or supported variable. Edit the HTML content, compare desktop and mobile preview, then write the plain-text version. Save.

Check the result

Configured sender and consumer-variable context are prerequisites. Screen preview is not an inbox rendering or delivery test.

04. Build a print layout

Context

The print editor builds receipt lines: text, images, two columns, dividers, feeds, cuts, item loops, signatures and fill-in lines. The paper result depends on the actual printer and consuming data.

Follow the steps

Create a Print receipt / ticket template. Add Text for the company name, an Image using the intended logo, and Two-column lines for labels and totals. Add a Loop over items with Each as i and the item fields. Add a Divider, the required Blank lines and Cut paper. For the relevant document, add Customer signature or a Fill-in line. Inspect the JSON representation and Save.

Check the result

The loop variables and collection context must match the consumer. Do not show a physical print from a different template as this template’s result. Paper cut/signature behavior needs hardware validation.

05. Insert variables and preview with real data

Context

The schema browser helps choose actual field names. Test can render the current unsaved edits against a real sample, so remember to save the version you intend to use afterward.

Follow the steps

Choose Variables, browse the relevant collection and copy the required variable into the content. Choose Test. Set Sample datatype and select Sample record, then Preview with data. Read the rendered subject and output. Correct unresolved or wrong values, repeat the preview and Save.

Check the result

A schema variable can exist without being supplied by every consumer. A successful sample preview needs a second check through the actual consuming operation.

06. Send a test and connect the consumer

Context

A test message checks the rendered output through a sender. The final feature check invokes the saved template from its real consumer, such as the relevant email, notification or print operation.

Follow the steps

In Test template, enter the controlled inbox in Send test to and select Send test. Inspect that inbox. Close the test, Save the intended version, then configure or invoke the corresponding consumer with this template and inspect its actual recipient or printed result.

Check the result

A universal consumer selector does not exist in this editor. Other channels require their own connected recipient/device.

07. Revert and diagnose a wrong template

Context

A built-in override can be reverted by deleting your override and returning to the built-in default. Before doing that, distinguish selection mistakes, missing variables and delivery failures.

Follow the steps

Find the built-in entry and inspect whether it has a customized override. Use its revert action only for a disposable override, read Revert to built-in default? and confirm the intended change. Re-run the same sample or consumer. For a missing value, inspect the sample and variable; for failed delivery, inspect the configured provider or device.

Check the result

Preserve production overrides and test the reset on a disposable template.

Next steps

The saved settings establish the configuration. The independent recipient, visitor or consuming operation establishes whether it worked. Return to the relevant chapter whenever you change a sender, audience, template or connected site, and repeat the result check for that change.

Limitations and checks

Primary UI code inspected on 2 October 2026. This pass performed no live external send, DNS change, agreement acceptance, provider setup, generated audio or rendered video. Statements about expected results are recording requirements, not claims of completed tests.

BusinessMade routing and outcome check

The menu and route were checked in packages/ui/src/ui/sidebars/business-made-links.ts and apps/business-made/src/shell/route-registry.ts. Open the module through the route stated at the start, perform the controlled procedure, save, reopen and inspect its actual BusinessMade consumer. Do not infer branch isolation from a header location selection when this shared screen reads organization-wide records. Record any access refusal or consumer mismatch with the exact record identity. No new provider, payment, physical-device or live-tenant action was performed for this adaptation.

Save content and preview the same draft

For email, HTML and plain-text fallback are separate content inputs. For SMS and other text channels, review the channel’s text field. For print, inspect the structured receipt/ticket lines. Save, reopen the same template and compare the actual body rather than only the title. The local serializer repair preserves non-email content instead of overwriting it with stale email HTML, and preview now receives the current draft content.

Preview and Send test are distinct actions. Preview rendering with example data does not establish inbox delivery or physical printing. After a successful preview, test the configured consumer with its real supported variables before replacing a live template. No test message or print job was sent in this pass.