Every install ships with these. Each one is a block tree — no HTML, no CSS, no print stylesheet
that behaves differently in one browser. Copy any of them, change what you need, and push it
back with a new id.
The default counter receipt: items, tax summary, payment mode, QR.
Item names wrap onto a second line rather than being truncated, because a customer who cannot read what they bought will ask, and asking costs more counter time than the extra line of paper.
Table, server, covers, and a service-charge line above tax.
Service charge sits above the tax lines and is labelled as optional, which is both the legal position in India and the thing guests query most often at the table.
================================================
TABLE 7 KOT 4412
Steward Suresh 21:07
Course: MAIN
================================================
2 PANEER TIKKA
- less spicy
4 BUTTER NAAN
1 DAL MAKHANI
================================================
*** NEW ORDER ***
- - - - - - - - - - - - - - - - - - - - - - - -
Kitchen order ticket
pos80 · 48col
pos.kot.kitchen
Double-height items, no prices, one ticket per course.
Prices are deliberately absent and item names print at double height: a KOT is read at arm’s length across a hot pass, by somebody who does not care what it costs.
Reads
tableservercourselines[]notes
THE FILTER ROOM
TOKEN
A-47
Counter 2 21:09
Please wait for your number to
be called
- - - - - - - - - - - - - - - -
Token slip
pos58 · 32col
pos.token.queue
One enormous number, and nothing else that matters.
The number prints at quadruple height and is the only thing above the fold, because the slip is read from a queue three metres away.
No tax columns. For anyone not registered, or billing abroad.
Same block tree as the GST invoice with the tax section removed, so a shop that registers later keeps its layout and only changes the template id.
Reads
sellercustomernumberdatelines[]notes
Quotation
a4 · 96col
a4.quotation
Validity, lead time and terms, with prices marked as an estimate.
Carries a validity date in the header rather than the footer: a quotation whose expiry is buried under the terms is a quotation that gets honoured six months later.
Reads
sellercustomernumberdatevalid_untillines[]terms
Delivery challan
a4 · 96col
a4.challan.delivery
Goods, quantities and a receiver’s signature. No money.
Amount columns are omitted entirely rather than zeroed, because a challan showing values invites the exact argument at the gate that a challan exists to avoid.
Reads
sellerconsigneenumberdatevehiclelines[]reason
A5 invoice
a5 · 68col
a5.invoice.compact
The GST invoice folded onto half a sheet, for a dot-matrix tray.
A5 is what a lot of Indian counters actually keep loaded, so this is a first-class layout rather than an A4 scaled down until the tax table stops being readable.
Reads
sellercustomernumberdatelines[]
Writing your own
A template is a JSON document with a list of blocks. Every string may contain {{ expression }} over the payload you send, with filters
for money, dates and amount-in-words. The renderer walks the same tree three ways — to ESC/POS
bytes, to a PDF page, and to an HTML preview — so a layout that looks right in the preview is
right on paper.
Push one from your web app and it lands on that machine only. Push it with a built-in's id
and it shadows the built-in, which is how a single shop gets its own receipt without you
forking anything.