Receipts & Printing
Three print modes, one receipt layout. Print to any OS printer, download a real PDF, or cut directly to a USB thermal printer with no dialog.
The three print modes
After every sale, and from the Sales history for any past invoice, three buttons are available:
Print — browser dialog
Opens a formatted receipt in a hidden iframe and immediately triggers window.print(). Your operating system’s print dialog appears, listing every configured printer — a USB or network thermal printer (set up via CUPS on Linux/macOS or Windows print spooler), a regular office printer, or “Save as PDF.” Set up the thermal printer once at the OS level and it shows here automatically.
- Works on all platforms (Linux, macOS, Windows, any OS that runs Docker).
- Full Unicode — renders any language, any currency symbol.
- The backend is not involved in this path at all.
Download PDF
Generates a PDF server-side using pdfkit (pure-JS renderer, no shell-out, no native dependencies) and downloads it to your device. Page height is computed per-receipt — a one-item receipt is a short page, not a blank A4.
- Use this for emailing receipts, archiving, or printing from a device that is not at the counter.
- Full Unicode — correct rendering for all languages and currency symbols.
- Works even on machines with no printer attached at all.
Print via USB — ESC/POS direct
Sends raw ESC/POS commands from the backend directly to a USB thermal printer. No print dialog, no OS driver setup — the receipt cuts off the roll immediately after you click.
- Requires a Linux host (uses Docker
/dev/bus/usbpassthrough — this is a Linux-only feature). - Works with any standard USB ESC/POS thermal printer that advertises USB Printer device class. No vendor/product ID to configure.
- Does not require CUPS or any printer driver.
- One-time Docker setup:
/dev/bus/usbis already bind-mounted and cgroup rules are set indocker-compose.yml.
?. Use Print or Download PDF when exact Unicode is needed.Auto-print setting
Enable Settings → Receipt → Print automatically after every sale to skip the receipt modal entirely and trigger the browser print dialog immediately on checkout. Does not apply to USB printing.
Receipt layout
The receipt is driven entirely by your Settings — no hardcoded content. The layout includes:
- Header — shop name, address, phone, and your custom header text from Settings.
- GSTIN / tax registration — shown only if entered in Settings.
- Invoice number and date — auto-incrementing invoice number in
INV-YYYY-NNNNNformat. - Customer name and phone — if a customer was attached.
- Line items — product name, quantity, unit, rate, and line total. Per-product discount is shown as a strikethrough.
- Tax breakdown — subtotal, tax (CGST/SGST or VAT/GST depending on Settings), loyalty discount, due balance impact.
- Grand total and payment — total amount, payment method, change (for cash).
- Loyalty summary — points earned on this purchase.
- Footer — your custom footer text from Settings (e.g. “Thank you! Visit again.”).
Receipt layout is paper-efficient
Every millimetre of thermal paper costs money over thousands of receipts. NodeDR POS’s HTML receipt CSS has no unnecessary margins, and the PDF page height is computed per-receipt — a two-item sale generates a shorter page than a ten-item sale. There is no fixed A4 or fixed thermal length.
Paper width (USB printing)
Go to Settings → Receipt → USB printer paper width and select 80mm (standard) or 58mm (compact). This controls the column count of the fixed-width text layout sent to the printer. Use 80mm unless your printer’s roll is 58mm wide.