| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Point of Sale (point_of_sale)
• Discuss (mail) • Inventory (stock) • Invoicing (account) |
| Lines of code | 2144 |
| Technical Name |
pos_qz_tray |
| License | OPL-1 |
| Website | https://www.muhammadumarshahzad.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Point of Sale (point_of_sale)
• Discuss (mail) • Inventory (stock) • Invoicing (account) |
| Lines of code | 2144 |
| Technical Name |
pos_qz_tray |
| License | OPL-1 |
| Website | https://www.muhammadumarshahzad.com |
POS QZ Tray Printing
Receipt, kitchen & label printing for Odoo 18 Point of Sale via QZ Tray.
An alternative to the Odoo IoT Box for businesses already running Windows-based POS machines.
Screenshots
Enable QZ Tray printing in POS Settings:
Configure receipt printer, template and paper size:
Set up kitchen printers with category routing:
Configure label printers with full print options:
Multiple printer types supported (Label Printers):
Multiple printer types supported (Kitchen Printers):
Features
🧾 Receipt Printing
Print receipts via ESC/POS thermal or PDF mode. Fully customisable Jinja2 HTML templates with company logo, QR codes, tax breakdown, and more.
🍳 Kitchen Tickets
Send kitchen tickets to multiple printers simultaneously. Filter by product category per printer. Supports new orders, updates, and cancellations.
🏷️ Label Printing
Print product labels on ZPL or ESC/POS label printers. Configurable width, height, barcode, price, and name per printer.
📄 Jinja2 Templates
Design receipts in HTML with full access to every Odoo database field. Use {{ order.partner_id.name }}, QR codes, logos — no JS changes needed.
📶 Auto-Connect
Connects to QZ Tray automatically when the POS session opens. No manual steps for the cashier.
🔌 IoT Box Alternative
Works with any USB or network printer connected to the POS machine via QZ Tray. A software-based alternative for setups where an IoT Box is not preferred.
IoT Box Alternative
This module uses QZ Tray (qz.io) — a free, open-source desktop application — to communicate with printers directly from the browser. It is designed as a software-based alternative for businesses that prefer not to use the Odoo IoT Box, particularly in environments where a Windows-based POS machine is already in place and printers are locally connected.
The Odoo IoT Box remains the officially supported Odoo printing solution. This module is an independent community alternative and is not affiliated with or endorsed by Odoo S.A.
Setup Guide
-
Download & install QZ Tray v2.2.6 Go to qz.io/download, download version 2.2.6 for your OS, and run it. QZ Tray runs silently in the system tray.
-
Place qz-tray.js in the module Download the
qz-tray.jslibrary from qz.io/api/qz-tray.js and place the file at:
pos_qz_tray/static/lib/qz/qz-tray.js
Then restart your Odoo server or upgrade the module so the asset is picked up. -
Place qrcode.js in the module (optional — required for QR codes on receipts) Download
qrcode.jsfrom github.com/kazuhikoarase/qrcode-generator and place it at:
pos_qz_tray/static/lib/qrcode/qrcode.js
Without this file, all other printing features work normally — only the{{ qr(...) }}template helper will silently produce no output. -
Install the module In Odoo go to Apps, search for POS QZ Tray Printing, and click Install.
-
Configure your printers Go to Point of Sale → Configuration → Settings, select your POS, and scroll to the QZ Tray Printing section. Enable QZ Tray and fill in your printer names exactly as they appear in Windows/OS printer settings.
-
Open a POS session QZ Tray connects automatically. Print a test receipt from the printer settings panel to confirm everything works.
Receipt Templates
A beautiful default receipt template is included and automatically selected. You can customise it or create new ones under Point of Sale → Configuration → QZ Receipt Templates.
Templates are written in Jinja2 HTML and have access to every Odoo field on the order, customer, company, and lines — no developer changes needed:
{{ order.partner_id.name }}— customer name from DB{{ order.table_id.floor_id.name }}— floor name{{ company_logo }}— company logo as base64 image{{ qr(order.name) }}— QR code of any text{{ fmt(amount_total) }}— formatted currency amount
Author
Developed by Muhammad Umar Shahzad.
For support, feature requests, or custom development, contact via the Odoo App Store
or email umar.shahzad.personal@gmail.com.
POS QZ Tray Printing
Receipt, kitchen & label printing for Odoo 18 Point of Sale via QZ Tray. An alternative to the Odoo IoT Box for businesses already running Windows-based POS machines.
Odoo 18 | Point of Sale | ESC/POS | PDF / HTML | ZPL Labels | QZ Tray
Features
- 🧾 Receipt Printing
- Print receipts via ESC/POS thermal or PDF mode. Fully customisable Jinja2 HTML templates with company logo, QR codes, tax breakdown, and more.
- 🍳 Kitchen Tickets
- Send kitchen tickets to multiple printers simultaneously. Filter by product category per printer. Supports new orders, updates, and cancellations.
- 🏷️ Label Printing
- Print product labels on ZPL or ESC/POS label printers. Configurable width, height, barcode, price, and name per printer.
- 📄 Jinja2 Templates
- Design receipts in HTML with full access to every Odoo database field. Use {{ order.partner_id.name }}, QR codes, logos — no JS changes needed.
- 📶 Auto-Connect
- Connects to QZ Tray automatically when the POS session opens. No manual steps for the cashier.
- 🔌 IoT Box Alternative
- Works with any USB or network printer connected to the POS machine via QZ Tray. A software-based alternative for setups where an IoT Box is not preferred.
IoT Box Alternative
This module uses QZ Tray — a free, open-source desktop application — to communicate with printers directly from the browser. It is designed as a software-based alternative for businesses that prefer not to use the Odoo IoT Box, particularly in environments where a Windows-based POS machine is already in place and printers are locally connected.
The Odoo IoT Box remains the officially supported Odoo printing solution. This module is an independent community alternative and is not affiliated with or endorsed by Odoo S.A.
Setup Guide
Note
Requirement: QZ Tray v2.2.6 must be installed on the Windows/Mac/Linux machine where the POS browser runs. QZ Tray is free and available at qz.io/download.
Download & install QZ Tray v2.2.6
Go to qz.io/download, download version 2.2.6 for your OS, and run it. QZ Tray runs silently in the system tray.
Place qz-tray.js in the module
Download the qz-tray.js library from qz.io/api/qz-tray.js and place the file at:
pos_qz_tray/static/lib/qz/qz-tray.js
Then restart your Odoo server or upgrade the module so the asset is picked up.
Place qrcode.js in the module (optional — required for QR codes on receipts)
Download qrcode.js from github.com/kazuhikoarase/qrcode-generator and place it at:
pos_qz_tray/static/lib/qrcode/qrcode.js
Without this file, all other printing features work normally — only the {{ qr(...) }} template helper will silently produce no output.
Install the module
In Odoo go to Apps, search for POS QZ Tray Printing, and click Install.
Configure your printers
Go to Point of Sale → Configuration → Settings, select your POS, and scroll to the QZ Tray Printing section. Enable QZ Tray and fill in your printer names exactly as they appear in Windows/OS printer settings.
Open a POS session
QZ Tray connects automatically. Print a test receipt from the printer settings panel to confirm everything works.
Receipt Templates
A beautiful default receipt template is included and automatically selected. You can customise it or create new ones under Point of Sale → Configuration → QZ Receipt Templates.
Templates are written in Jinja2 HTML and have access to every Odoo field on the order, customer, company, and lines — no developer changes needed:
| Variable | Description |
|---|---|
| {{ order.partner_id.name }} | Customer name from the database |
| {{ order.table_id.floor_id.name }} | Floor name (requires Restaurant module) |
| {{ company_logo }} | Company logo as a base64 inline image |
| {{ qr(order.name) }} | QR code rendered as inline SVG |
| {{ fmt(amount_total) }} | Formatted currency amount |
You can access any field on the order directly using order.<field_name>. Missing or optional fields render empty rather than raising an error.
Author & Support
Developed by Muhammad Umar Shahzad.
For support, feature requests, or custom development, visit muhammadumarshahzad.com or contact via the Odoo App Store.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module