The app prints to ESC/POS thermal printers paired to the device, or hands print jobs to a shared printer through the device hub. Layouts are not in the app: the server renders each receipt or check into a small set of primitives and the app draws them.
Printers the app talks to
| Connection | Notes |
|---|---|
| Bluetooth (BLE) | The usual case — a belt printer or a counter printer. Pair at the OS level first, then in the app. |
| USB | Where the device has a port that supports it. |
| Network | Printers reachable on the venue network. |
Star, Epson, Bixolon, Sunmi and generic ESC/POS printers work. Paper width is 80 mm by default, with 58 mm supported; the width is chosen at pairing and stored with the printer.
Pairing lives at More → Printer: scan, pick, set the width, print a test. The chosen printer becomes the device's default and reconnects on demand. With no default saved, printing fails with "No printer configured" rather than silently dropping the job.
What the server sends
Receipts and checks are fetched as payloads, then printed:
/storefront/pos/tab/:id/receipt-payload?copy=customer|merchantNo auth/storefront/pos/tab/:id/check-payloadNo auth/storefront/pos/tab/:id/print-checkNo auth/storefront/pos/tab/:id/print-receiptNo authThe payload is a list of primitives:
| Kind | Fields | Meaning |
|---|---|---|
text | text, bold, size, align | A line of text |
feed | lines | Blank lines |
cut | — | Cut the paper |
image | url | A logo or QR |
The server also states the line width: 32 characters means 58 mm paper, 48 means 80 mm. The template behind the payload is the organization's posReceiptCustomerTemplate setting, with a factory default; copy=merchant renders the merchant copy. Editing the template in Studio Manager changes every device's output without an app update.
The app can also render its own receipt from a block model (header, line items, key-value rows, dividers, feeds, barcodes as QR, CODE128 or EAN13) — used for previews and for anything the server has not templated.
Cash drawers
A drawer plugs into the printer's DK (RJ12) port and opens on an ESC/POS kick pulse sent through the printer (ESC p, pin 0, 50 ms on, 250 ms off). Nothing is paired separately: if the printer works, the drawer works. Checkout can print and kick in one action.
Shared printers
A printer that several devices send to — a till printer, a kitchen printer — is not paired to each phone. It is reached through the Device Hub, which owns the connection and accepts jobs from any device in the venue. Kitchen tickets from Send to prep go that way when a hub is configured.
Per-device keys
| Key | Meaning |
|---|---|
printer_default_address | Bluetooth address, USB id or network host |
printer_default_name | Display name |
printer_default_kind | BLE, USB or NETWORK |
printer_default_paper_mm | 58 or 80 |
Forgetting the printer clears all four. They are on the device, not the account, so a replacement tablet pairs again.
Web builds
The thermal printer plugin depends on native code, so on the web build scanning finds nothing and printing reports that it is unavailable. Receipts by email and SMS still work there.
When something goes wrong
Work down this list; the causes are ordered by how often they are the answer.
| Symptom | Cause | Fix |
|---|---|---|
| Nothing prints, no error | No default printer saved on this device | More → Printer, scan, Pair. Printing without a default fails rather than queueing. |
| Print failed: … | The printer is off, asleep, out of range, or claimed by another device | Power-cycle it, check range, then Test print. A printer paired to another phone in between must be paired here again. |
| The printer never appears in Scan | Not in pairing mode, or not paired at the OS level | Bluetooth printers usually need OS pairing first. Also check the Bluetooth is off banner. |
| Text wraps or half the roll is blank | Wrong paper width | Switch between 58 mm and 80 mm. The server renders 32 or 48 characters per line to match. |
| Receipts print but the layout is wrong everywhere | The organization's receipt template | Edit posReceiptCustomerTemplate in Studio Manager — it changes every device without an app update. |
| The drawer will not open | The drawer cable, or no printer paired | Kick drawer on the printer screen tests it. Drawer kick skipped means the pulse never left; open it with the key meanwhile. |
| Kitchen tickets do not print | They go through the hub, not this phone | See Device Hub troubleshooting. |
| Printing is unavailable in a browser | The web build has no native printer plugin | Expected. Email or text the receipt instead. |
| A receipt was needed and the tab is closed | Nothing is lost | Re-print or re-send from the closed tab's payment list. |