QZ Tray serves as an intermediary between the iVendNext web application and connected printers, enabling seamless direct printing from iVendNext POS without browser-imposed restrictions. This guide covers installation, configuration, and advanced management of QZ Tray to achieve reliable, silent printing for receipts, labels, and reports.
Browser Agnostic: Works with Chrome, Edge, Safari (Firefox requires extra setup)
Secure Printing: Certificate-based authentication prevents unauthorized access
Advanced Features: Supports raw ESC/POS commands, PDF printing, and auto-retry
Java 8+ (64-bit recommended)
2GB RAM minimum
Admin rights for installation
Download QZ Tray from https://qz.io
Run installer (keep default settings)
Launch application - appears as in system tray
Note: For enterprise deployments, use silent install flags:
qz-tray.exe --silent --autostart
Log in at https://qz.io/login with Premium Support credentials
Navigate to QZ Tray > Certificate Generator
Complete CSR form with:
Organization details
2048-bit key strength
2-year validity (default)
Download:
digital-certificate.txt (public)
private-key.pem (keep secure!)
Note: Currently, you cannot generate the certificate/keys in Safari. Other major browsers are all supported.
Place digital-certificate.txt in iVendNext's /public folder
Configure iVendNext to reference the certificate:
qz.security.setCertificatePromise(function(resolve) {
resolve("/path/to/digital-certificate.txt");
});
Security Tip: Never expose private-key.pem to frontend code.
In Hardware Profile:
Set Printer Name to "QZ Tray"
Enable Raw Mode for ESC/POS support
Test connection:
qz.printers.find("QZ Tray").then(console.log);
Use 72mm width for best compatibility
Avoid CSS floats (use tables for layout)
Set margins ≥5mm to prevent clipping
qz.print({
printer: 'Primary',
altPrinters: ['Backup-Receipt'],
data: [...]
});
Inject real-time data with:
data: [{
type: 'raw',
format: 'escpos',
data: '1B 40 1D 57 80 31' // Open drawer command
}]
Process multiple jobs sequentially:
qz.websocket.connect().then(() => {
return Promise.all([printReceipt(), printLabel()]);
});
Log in before expiration
Click Renew Certificate (preserves settings)
Replace only digital-certificate.txt
Here’s a quick look at some common issues you might run into.
Enable verbose logging:
Right-click tray icon > Advanced > Logging
Reproduce issue
Share qz.log with support
Deploy MSI via Active Directory
Lock settings with override.properties:
allow.unsigned.messages=false
allowed.addresses=192.168.1.*
Install on print server with Always-On mode
Configure load-balanced instances:
start qz-tray.exe --cluster=printers1,printers2