Skip to content

Receipt Templates

Customize the format and content of your printed receipts using the built-in template language. You can control every aspect of the output — layout, text formatting, columns, tax breakdowns, and more.

Edit templates from Admin > System > Receipt Templates in the dashboard. Changes take effect immediately for all subsequent prints — no restart needed.

Template Types

TypePurpose
ProformaCustomer-facing receipt with full business details, items, tax breakdown
FiscalTax authority receipt with fiscal signature and verification QR code
KitchenKitchen order ticket — large text, item focus, minimal business info

Each type has a built-in default. You can create custom templates and set one as the default per type.

Quick Reference

How do I make text bold?

{{ bold }}This text is bold{{ boldOff }}

How do I center text?

{{ center }}This line is centered
{{ left }}Back to left-aligned

How do I make text larger?

{{ doubleHeight }}LARGE TEXT{{ doubleHeightOff }}
{{ doubleWidth }}WIDE TEXT{{ doubleWidthOff }}

How do I print a separator line?

{{ separator }}
{{ doubleSep }}

separator prints dashes (------------------), doubleSep prints equals signs (==================).

Template Syntax

Templates use {{ }} tags for dynamic content and formatting commands. Anything outside the tags is printed as-is.

Displaying Data

Access order, business, and item data using dot notation:

{{ .Business.Name }}
{{ .Order.ReceiptID }}
{{ .Waiter.Name }}

Loops

Print each item in the order:

{{ range .Items }}
{{ .Name }} x{{ .Quantity }}  {{ currency .Total }}
{{ end }}

Conditionals

Show content only when a condition is met:

{{ if notEmpty .Order.Notes }}
Notes: {{ .Order.Notes }}
{{ end }}

Text Formatting

CommandEffect
{{ bold }}Start bold text
{{ boldOff }}End bold text
{{ center }}Center-align subsequent lines
{{ left }}Left-align subsequent lines
{{ right }}Right-align subsequent lines
{{ doubleHeight }}Double-height text (for kitchen visibility)
{{ doubleHeightOff }}Normal height
{{ doubleWidth }}Double-width text
{{ doubleWidthOff }}Normal width

TIP

Alignment and size commands affect all lines that follow until changed. Remember to turn off bold/doubleHeight when you're done.

Layout Helpers

Two-Column Row

Print a label on the left and a value on the right:

{{ row "Total" (currency .Order.TotalDue) }}

Output: Total 1,234.56

Three-Column Row

{{ row3 "Left" "Center" "Right" }}

Centered Text

{{ centerText "RECEIPT" }}

Separator Lines

{{ separator }}
{{ doubleSep }}

Padding and Truncation

Align columns precisely:

{{ padRight (truncate .Name 20) 20 }} {{ padLeft (printf "%d" .Quantity) 3 }}
FunctionDescriptionExample
padRight text widthPad text with spaces on the rightpadRight "Chicken" 20"Chicken "
padLeft text widthPad text with spaces on the leftpadLeft "150" 8" 150"
truncate text lengthShorten text with "..." if too longtruncate "Grilled Chicken Breast" 15"Grilled Chic..."

Number and Date Formatting

Currency

{{ currency .Order.TotalDue }}

Formats with commas and two decimals: 1,234.56

Dates and Times

FunctionFormatExample Output
date .Order.CreatedAtDD/MM/YYYY07/04/2026
time .Order.CreatedAtHH:MM:SS14:30:00
datetime .Order.CreatedAtDD/MM/YYYY HH:MM07/04/2026 14:30
datetimeFull .Order.CreatedAtDD-MM-YYYY HH:MM:SS07-04-2026 14:30:00
datetime12 .Order.CreatedAtDD/MM/YYYY hh:mm:ss AM07/04/2026 02:30:00 PM

Printf Formatting

For precise number formatting:

{{ printf "%.2f" .Order.Tax }}     → 123.45
{{ printf "%d" .Quantity }}        → 3
{{ printf "%.0f" .Order.TotalDue }} → 1235

Graphics

QR Code

{{ qrcode .Fiscal.QRData }}

Prints a QR code that customers can scan (used on fiscal receipts for tax authority verification).

Barcode

{{ barcode .Order.ReceiptID }}

Prints a CODE39 barcode of the given text.

Printer Control

CommandEffect
{{ feed 2 }}Feed 2 blank lines
{{ cut }}Cut the paper
{{ init }}Reset printer to defaults

A typical receipt ends with:

{{ feed 2 }}{{ cut }}

Available Variables

Order

VariableTypeDescription
.Order.IDnumberInternal order ID
.Order.ReceiptIDtextReceipt number (e.g., "RCP-2026-001234")
.Order.CreatedAttimestampWhen the order was placed
.Order.TabletextTable number or name
.Order.NotestextOrder-level notes
.Order.PaymentMethodtext"cash", "mpesa", "card"
.Order.MpesaCodetextM-PESA transaction reference
.Order.SubtotalnumberItems total before discounts
.Order.BaseTotalnumberTotal excluding tax
.Order.TaxnumberVAT amount
.Order.CTLnumberCatering Training Levy
.Order.DiscountnumberDiscount applied
.Order.TotalDuenumberFinal amount to pay

Business

VariableTypeDescription
.Business.NametextRestaurant name
.Business.AddresstextPhysical address
.Business.PostaltextP.O. Box
.Business.PhonetextPhone number
.Business.EmailtextEmail address
.Business.WebsitetextWebsite URL
.Business.PINtextTax PIN
.Business.VATRatenumberVAT rate (e.g., 0.16)
.Business.CTLRatenumberCTL rate (e.g., 0.02)
.Business.FootertextCustom footer message

Staff

VariableTypeDescription
.Waiter.NametextWaiter's name
.Cashier.NametextCashier's name

Items (use inside {{ range .Items }})

VariableTypeDescription
.NametextMenu item name
.CodetextItem code
.QuantitynumberQuantity ordered
.PricenumberUnit price
.TotalnumberLine total (qty x price)
.NotestextItem-level notes / modifiers
.VatablebooleanWhether item is taxable
.CategorytextMenu category

Fiscal (for fiscal receipts)

VariableTypeDescription
.Fiscal.CodetextFiscal device code
.Fiscal.QRDatatextVerification URL for QR code
.Fiscal.InvoiceNotextFiscal invoice number
.Fiscal.TimestamptextFiscal signing timestamp

Other

VariableTypeDescription
.NowtimestampCurrent date and time
.Printer.NametextPrinter name

Math and Comparison

FunctionDescriptionExample
add a bAddition{{ add .Order.BaseTotal .Order.Tax }}
sub a bSubtraction{{ sub .Order.Subtotal .Order.Discount }}
mul a bMultiplication{{ mul .Price .Quantity }}
div a bDivision (safe){{ div .Order.Tax .Order.Subtotal }}

String Functions

FunctionDescription
upper textUPPERCASE
lower textlowercase
title textTitle Case
trim textRemove leading/trailing whitespace
repeat text nRepeat text n times

Full Example: Custom Proforma Receipt

Here's a complete custom receipt template showing common patterns:

{{ center }}{{ bold }}{{ doubleHeight }}{{ .Business.Name }}{{ doubleHeightOff }}{{ boldOff }}
{{ .Business.Address }}
{{ .Business.Phone }}
{{ separator }}
{{ left }}{{ datetime .Order.CreatedAt }}
Receipt: {{ .Order.ReceiptID }}
Table: {{ .Order.Table }}
{{ doubleSep }}
{{ bold }}ITEM                     QTY    PRICE AMOUNT{{ boldOff }}
{{ separator }}
{{ range .Items }}{{ padRight (truncate .Name 24) 24 }} {{ padLeft (printf "%d" .Quantity) 3 }} {{ padLeft (printf "%.2f" .Price) 8 }} {{ padLeft (printf "%.2f" .Total) 7 }}{{ if .Vatable }} C{{ end }}
{{ if notEmpty .Notes }}  -> {{ .Notes }}
{{ end }}{{ end }}{{ doubleSep }}
{{ bold }}{{ row "TOTAL" (currency .Order.TotalDue) }}{{ boldOff }}
{{ separator }}
VAT 16%: {{ printf "%.2f" .Order.Tax }}
CTL  2%: {{ printf "%.2f" .Order.CTL }}
{{ separator }}
Served by: {{ .Waiter.Name }}
Cashier: {{ .Cashier.Name }}
{{ separator }}
{{ center }}{{ .Business.Footer }}
{{ feed 2 }}{{ cut }}

Tips

  • Paper width: Standard 80mm thermal printers fit 48 characters per line (Font A). Plan your column layouts accordingly.
  • Preview first: Use the Preview button in the dashboard template editor to see how your template renders before saving.
  • Validate: The editor checks your template syntax before saving — fix any errors shown.
  • Item column alignment: Use padRight for left-aligned columns and padLeft for right-aligned numbers. Combine with truncate to prevent long names from breaking the layout.
  • C marker: The {{ if .Vatable }} C{{ end }} pattern marks taxable items with a "C" — a common convention on fiscal receipts.
  • Kitchen tickets: Use {{ doubleHeight }} for kitchen templates so cooks can read orders from a distance.

Moneta Pay POS — Built for African Restaurants