Direct Printing for Perfex CRM
by Lumadro
$59
Receipts are now tested on a real printer
A Rongta RP820 over USB, on 29 September 2026: the 80mm receipt, the 58mm receipt and the kitchen ticket all printed, cut, and matched what the renderer said they would. It found two layout faults on the first afternoon, both fixed and both now covered by tests. Two things are still not proved on hardware: the ZPL labels are checked by a real ZPL renderer but have never gone to a Zebra, and the network socket transport has never opened a connection to a printer that was not on the end of a USB cable.
What is verified, and how
Labels are rendered and checked. The ZPL goes through a real ZPL renderer and comes back as an image. Accents print correctly, a caret in a product name prints as a caret instead of breaking the format, the barcode carries the right payload, and a small 50 by 25 label drops the company name rather than the barcode.
Receipts are decoded and checked. The ESC/POS stream is decoded back into the page it describes, at 80mm and 58mm. Totals sit hard right, long product names wrap while totals never do, and the cut command is present.
162 assertions cover the commands, the transports, the layouts and who may print which document. Four exist because rendering the output found bugs the tests had missed, eighteen because a security review found that holding the print permission was being treated as permission to read any invoice, and twenty-two because a real printer found two layout faults on its first afternoon: a customer name cut short, and double-width text wrapped to the wrong column count.
Every preview image on this page is real: two are screenshots of the module running on the demo you can open yourself, and five are the actual output the module produces, rendered from the bytes it sends.
What is not verified
That your printer accepts the stream and prints it
That the paper cut fires on your model
That a scanner reads the printed bars
That PrintNode relays it to a real device
What I will do about it
Buy it, try it, and if something does not print, tell me what printer you have and what came out. I will fix it or refund you, your choice. If you need a different receipt layout, another transport, or support for the printer on your counter, say so and I will quote it. That work is what I would rather be paid for than a licence fee.
What you get
Print invoices, estimates, credit notes and payment receipts to a thermal printer straight from Perfex, with no PDF download in between
Direct network socket printing, which costs nothing and needs no third party
PrintNode as a fallback for hosted installs whose server cannot reach the printer
ZPL product labels, 100 by 50 and smaller, with barcodes
Per-printer receipt layouts, including a kitchen ticket with large type and no prices
Automatic printing when an invoice or payment is created
An offline queue with retry, so a printer that is switched off does not lose the job or block the invoice from saving
Job history and a nightly prune
Security, since this module connects outward
The socket transport refuses loopback, link-local and unroutable addresses, and allows only printer ports. API keys are encrypted at rest. Layout definitions run through a whitelist, so an unknown block is dropped rather than executed. A printing module that lets someone point your server at an internal service is a worse problem than a crooked receipt.
Requirements
Perfex CRM 3.2 or newer, PHP 8.1 or newer. An ESC/POS thermal printer with an Ethernet or wifi port for the free path, or a PrintNode account for hosted installs. USB and Bluetooth printers need PrintNode, because a server cannot reach them directly.
Try it first
Demo: https://crmdemo.lumadro.com/admin
Sign in with demo@lumadro.com and the password demo. The demo account cannot send jobs or change settings, which is why some buttons are hidden there.