How to Set Up Windows Virtual IoT with a Zebra Printer on Odoo 19
After setting up Virtual IoT + Zebra printers across several client implementations, I noticed the official documentation for Odoo 19 is missing some critical steps (firewall configuration, PostgreSQL, ZPL printing, and more). More importantly, the existing forum threads cover bits and pieces, but there’s no single end-to-end guide.
This post consolidates everything I’ve learned from hands-on setups and working with our functional experts. Hope it helps.
What Is a Virtual IoT Box?
A Virtual IoT box is a Windows-based application that turns a standard Windows PC into the equivalent of a physical Odoo IoT box. The PC runs a local Odoo server (IoT service only), detects connected devices like printers and scanners, and makes them available to your Odoo database over the local network.
Key point: The Virtual IoT is Windows-only. Mac and Linux are not supported. You can run a Windows VM on Mac/Linux, but Odoo does not support that configuration and won’t troubleshoot it.
Prerequisites
Before you start, make sure you have:
Windows 10 or 11
Odoo 19 SaaS or Odoo.sh database with an active IoT subscription
IoT administrator access on the Odoo user performing the setup (Settings → Users → select user → IoT section → set to Administrator)
Zebra printer connected to the Windows machine with drivers already installed — verify it appears in Windows Settings → Printers & Scanners before touching Odoo
Internet access on the Windows machine (for initial setup and HTTPS certificate generation)
Local network access if other computers need to reach the IoT box
Important Notes on Prerequisites
Printer drivers are a hardware prerequisite, not an Odoo one. If the printer doesn’t show in Windows Printers & Scanners, contact the printer manufacturer’s support. Odoo cannot detect a printer that Windows itself doesn’t see.
Only genuine Zebra printers are supported. Non-Zebra label printers that claim ZPL compatibility via emulation are unreliable and unsupported.
The IoT app must be installed on your Odoo database, and your user must have IoT admin rights.
Step 1: Download the Correct Installer
This is where v19 differs from v17/v18 — don’t use the wrong installer.
Database Version | What to Download |
Odoo 19 | Dedicated IoT installer from odoo.com/page/download — scroll to the Virtual IOT section |
Odoo 17 / 18 | Odoo Community Windows installer → select "Odoo IoT" from the install type dropdown during setup |
For v19, there’s a separate standalone installer. It is NOT the same as the Community installer with an IoT option in the dropdown. If you use the wrong one, the service may not start correctly.
Step 2: Install the Windows Virtual IoT
Run the .exe installer. Follow the standard prompts. Accept the license agreement.
Change the destination folder (critical). Do NOT use the default Program Files path. Instead, create and select C:\ODOO as the destination.
DANGER: Never install into C:\Users\... or C:\Program Files\... — this will prevent the Nginx server from initializing and block HTTPS certificate generation. Always create a new folder at C:\ODOO and install there. |
Install the sub-modules. The installer will prompt you to set up two additional components:
Sub-Module | What It Does |
GPL Ghostscript | Translates print commands into rendered images and text. Used on every print job. |
Sumatra PDF | Parses and processes PDF files for printing to standard (non-label) printers. |
Click Next / Install / Finish through each.
PostgreSQL installation. The installer will prompt you to install PostgreSQL. This is required — proceed with the install. The Virtual IoT runs a local Odoo server that uses PostgreSQL as its database engine. You don’t need to configure or interact with PostgreSQL after installation.
TIP: If the PostgreSQL checkbox appears greyed out, it usually means a previous Odoo or PostgreSQL installation left behind registry keys. Uninstall any old programs, open Registry Editor (regedit), search for “PostgreSQL,” delete all remaining entries, restart the computer, and re-run the installer. |
Complete the setup. Ensure the “Start Odoo” checkbox is selected, then click Finish. The IoT homepage will automatically open at http://localhost:8069. Installation takes about 5 minutes.
Step 3: Configure the Windows Firewall
This step is required if any other computer on the network needs to access the IoT box (which is the typical setup). Without it, the IoT will only work from the same machine it’s installed on.
Open Windows Defender Firewall with Advanced Security (search “Windows Firewall” in Start)
Click Inbound Rules in the left panel
Click New Rule on the right
Select Port as the rule type → Next
Leave TCP selected. In “Specific local ports,” enter: 8069, 80, 443
Select “Allow the connection” → Next
Check all three profiles (Domain, Private, Public) → Next
Name the rule ODOO → Finish
Port | Purpose |
8069 | Odoo server port (primary IoT communication) |
80 | HTTP |
443 | HTTPS |
NOTE: An outbound rule is NOT needed. The IoT box only receives inbound connections from devices on the local network. |
Step 4: Connect the Virtual IoT to Your Odoo Database
Verify the IoT homepage loads. On the same machine, open http://localhost:8069. You should see the IoT box interface with a pairing code. From another machine on the same network, try http://[local-IP]:8069 to confirm remote access.
Find the local IP. It’s displayed on the IoT homepage. Or open Command Prompt and run: ipconfig
Open the IoT app in your Odoo database. Navigate to IoT → IoT Boxes → click Connect.
Enter the pairing code. On v19, the system may auto-detect the IoT box. If not, click “Use Pairing Code” and enter the code from the IoT homepage.
Wait for devices to populate. After connecting, the IoT box will pull all detected devices from Windows Printers & Scanners. This can take up to 5 minutes. Refresh periodically.
TIP: If no devices appear after 5 minutes, restart the Odoo IoT service. Search “Services” in the Start menu, find “Odoo IoT” or “Odoo IoT 19,” right-click, and select Restart. |
Step 5: Print with the Zebra Printer
ZPL Format — The Key Thing to Know
Zebra printers connected via IoT only accept ZPL (Zebra Printing Language) format reports. Standard PDF reports (delivery slips, invoices, pick lists) will NOT print to a Zebra. When selecting a report, always look for options labeled “ZPL” in the name.
Print a Test Label
In the Inventory app, open a product that has a barcode assigned
Click the gear/action icon → Print Labels
Select a ZPL format report from the list
When prompted, assign the correct printer (this is a per-user setting)
Click Print — the label should print immediately
TIP: Users can check “Do not ask me again” to suppress the printer selection prompt. To change the printer later, go to IoT → Devices and reassign it. |
Where ZPL Reports Are Triggered
Manual printing (from the Inventory app):
Product form → gear icon → Print Labels → ZPL option
Inventory → Products → Lots/Serial Numbers → select rows → Print → ZPL
Automatic printing (on operation validation):
Inventory → Configuration → Operations Types → select an operation → Hardware tab → enable Product Labels and/or Lot/SN Labels → select a ZPL format
Once configured, labels auto-print whenever that operation is validated — whether from the Inventory app or the Barcode app
Carrier/shipping labels:
Delivery orders validated with a third-party carrier (FedEx, UPS, etc.) set to ZPL2 label format
What Does NOT Print to Zebra:
Any PDF report
ZPL prints 1 label per job — no native batch printing
NOTE: The Barcode app does NOT have a print button. It only triggers ZPL printing indirectly by validating operations that have auto-print configured on the operation type. |
Step 6: Barcode Scanner (Optional)
If you also have a USB barcode scanner, plug it into the Windows machine. It should be detected automatically via Plug and Play. Open the Barcode app in Odoo and scan a barcode to verify.
Note: barcode scanners may appear intermittently in the IoT device list, but they generally function correctly when connected.
Known Limitations
Customer displays are not supported on Windows Virtual IoT
MRP devices (cameras, measurement tools) are not compatible
Non-Zebra label printers claiming ZPL emulation are unreliable and unsupported
Devices must remain physically connected. If you unplug a printer, it disappears from the IoT device list
Label customization (custom layouts, industry-specific codes) requires custom development or a success pack
Mac/Linux: You can run a Windows VM, but this is unsupported by Odoo
Troubleshooting Quick Reference
Problem | Solution |
IoT homepage doesn’t load at localhost:8069 | Restart the Odoo IoT service via Windows Services |
Devices don’t appear on the database | Wait 5 min, then restart the service. Verify printer appears in Windows Printers & Scanners |
Can’t access IoT from another computer | Check firewall inbound rule for ports 8069, 80, 443. Verify both machines are on same network |
Zebra printer doesn’t print | Confirm you selected a ZPL report (not PDF). Verify the printer driver is installed in Windows |
PostgreSQL checkbox greyed out | Previous install left registry keys. Clean with regedit, restart, reinstall |
“Connection to IoT Box failed” | Check IoT subscription is active. Try https://[IoT-IP] and manually accept the self-signed certificate |
Service name unclear | On v19, look for “Odoo IoT” or “Odoo IoT 19” in Windows Services |
Driver issues | Contact the printer’s hardware support (Zebra). Not an Odoo issue |
Useful Links
Windows Virtual IoT documentation (v19): odoo.com/documentation/19.0/applications/general/iot/windows_iot.html
IoT system connection to Odoo: odoo.com/documentation/19.0/applications/general/iot/connect.html
Connect a printer: odoo.com/documentation/19.0/applications/general/iot/devices/printer.html
Zebra label configuration: odoo.com/documentation/19.0/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.html
Barcodes for lot and serial numbers: odoo.com/documentation/19.0/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots.html
Auto-print settings on operations: odoo.com/documentation/19.0/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.html
Labelary ZPL viewer (for testing label designs): labelary.com/viewer.html
Related Forum Threads
If you’re looking for answers to specific issues, these existing threads may help:
"How to install & connect my virtual IoT?" — v16/v17 focused but general concepts apply
"Virtual IoT Odoo 19" — confirms the separate v19 installer and nightly build URL
"What is the difference between the IoT box and the Virtual IoT?" — physical vs virtual comparison
"Label Code for ZD410 Zebra Printer" — ZPL code customization examples
"Connect your printer & modify ZPL format" — general printer + ZPL setup
Hope this helps someone avoid the headaches I went through. Happy to answer follow-up questions.
Samson Mai
Business Solutions Analyst, Odoo North America