ZKTeco Fingerprint Attendance in Odoo, Syria 2026: Setup to Payroll
Connect ZKTeco fingerprint terminals to Odoo in Syria: pull or ADMS push, the Odoo Online bridge, Damascus UTC+3 clocks, power-cut planning, and Labour Law 17 overtime in new SYP.
Published 2026-11-07 · METCH
Connect a ZKTeco fingerprint device to Odoo: pull or push
To connect a ZKTeco fingerprint, face or card terminal to Odoo Attendances, you choose one of two methods for each device: Odoo pulls the punch log from the device over the office network, or the device pushes every punch to a server the moment it is made. Either way you need an integration module, because Odoo 20's own ZKTeco BioTime integration connects to BioTime Cloud software, not to the terminals. Odoo Online also needs a small bridge program, covered in section three.
Compare the two methods:
- Question | Pull (ZK protocol) | Push (ADMS / Cloud Server)
- Who connects | Odoo, or a bridge, calls the device | The device calls the server over HTTP or HTTPS
- Network | LAN, VPN or port forwarding | Internet access only
- Port | TCP or UDP 4370 by default | Usually 443 or 80
- Timing | Scheduled or on demand | Real time
- Device identified by | IP address, port, communication key | Serial number
- Best for | Odoo on a server in the same office | Odoo.sh, cloud hosting, several branches
The rule of thumb: with Odoo on a server inside your office, both methods work. On Odoo.sh or any cloud server, use push, because a cloud server cannot reach a device behind your office router without port forwarding or a VPN. On Odoo Online, the bridge does the work.
Do you need a terminal at all? Odoo's own Attendances kiosk turns a PC, tablet or phone into a check-in point using a badge barcode, an RFID key fob, or by name, with an optional PIN. It needs no extra module, but it has no fingerprint or face check, and as a web page of your Odoo database it depends on the connection at the moment of the punch. It can suit a small office with stable internet; where cuts are frequent, or buddy punching is a worry, a biometric terminal that stores punches itself is the safer choice.
Before you connect: serial number, key, Damascus time and 4 more checks
Most failed connections come down to a few settings on the terminal. Check each device and record the answers in a device sheet for HR.
- Push support: look for a Cloud Server Setting menu, usually under COMM. and called ADMS on some models. Without it the firmware cannot push and you are limited to pull. Support varies by model and firmware, so confirm with your supplier before you buy.
- HTTPS: if Odoo is served only over HTTPS, as on Odoo.sh, the firmware must support HTTPS for push; older firmware speaks only HTTP.
- Serial number: it identifies a push device. Find it under System Info ‣ Device Info or on the back label.
- Communication key: the pull password, often labelled Comm Key. 0 means none; set your own and keep it out of shared files.
- Network: a fixed LAN IP address for pull. For push, a fixed public IP from your internet provider lets the server accept punches from your office only, since a push device is recognised by its serial number alone.
- Clock and timezone: Syria has stayed on UTC+3 all year since 28 October 2022, according to the IANA time zone database (zone Asia/Damascus), as of November 2026. Set the device clock to Damascus time, switch off any daylight-saving option on it, and use Asia/Damascus for the device, the employees and their working schedules in Odoo. A device still applying the old winter rule will run one hour behind in winter.
- Power: put the terminal and the router on a UPS. The device keeps its punch log in memory, but nobody can punch while it is off.
Copy this device sheet:
- Device | Location | Model and firmware | Serial number | Mode | IP address | Timezone
- Main entrance | Damascus office | (System Info) | (back label) | Push | 192.168.1.201 | Asia/Damascus
- Warehouse | Adra | (System Info) | (back label) | Pull | 192.168.1.202 | Asia/Damascus
Odoo Online needs an office bridge; Odoo.sh and your own server do not
Where your Odoo runs decides the setup. Our Odoo Online vs Odoo.sh guide for Syria compares the hosting options in general; for attendance terminals the difference is this:
- Odoo.sh or your own server: install an integration module and let push devices call your Odoo address directly. On a server inside the office, pull also works over the LAN.
- Odoo Online: it cannot install modules that contain Python code, and it cannot reach devices inside your office. The usual pattern is a data-only module imported into Odoo, plus a small bridge program on an office computer that stays on. The devices push to the bridge, or the bridge pulls them, and the bridge sends the punches to Odoo through the external API, which the Odoo pricing page lists under the Custom plan.
The bridge also rides out internet and Odoo outages: a punch made while the line is down waits on the device or in the bridge's local queue, reaches Odoo once the connection is back, and is processed in time order. Keep the bridge computer and the router on the same UPS as the terminals.
Three ways to get there:
- An integration module. One option is ZKTeco Biometric Attendance from METCH, at USD 199, with editions for Odoo 18, 19 and 20 on Odoo.sh or on-premise (not yet listed on the Odoo Apps Store as of November 2026, so ask us for them) and an Odoo Online edition with the office bridge for Online 19.0 to saas~19.3 and saas~19.4 and later. It keeps punches in your own database and leaves fingerprint and face templates on the device.
- Odoo 20's own ZKTeco BioTime integration, if you already run BioTime Cloud: it reads punches from the BioTime server and syncs every 12 hours, or on demand.
- A custom integration built around your network.
Whichever you choose, test it with your exact model and firmware at one branch before rolling it out to the others.
Map device IDs to employees, then handle duplicates and missing check-outs
Every punch reaches Odoo as a device user number and a time. Odoo has to know which employee that number belongs to, so the mapping is the step that makes or breaks your data.
- One number per person on every terminal. Enrol each employee with the same user ID on all devices, ideally their employee number, so they can punch at any entrance or branch.
- Store that ID on the employee record in Odoo, in the field your integration reads. Odoo's BioTime integration, for example, matches on a ZKTeco employee ID field in the employee's Settings tab.
- Never reuse a number. When someone leaves, remove them from the devices and archive the employee; the next hire gets a new number.
- Keep unmatched punches. A punch from a number with no employee should wait in a list until HR links it, not vanish.
Then set rules for the messy cases:
- Duplicates: people often press twice. A short duplicate window, such as 3 minutes, ignores the second punch.
- Missing check-outs: if someone forgets to punch out, tomorrow morning's punch must not become a 24-hour shift. A maximum shift length, such as 16 hours, should close the old attendance without hours and flag it for HR, rather than invent time.
- Odoo's own settings: in Attendances ‣ Configuration ‣ Settings, Automatic Check-Out closes open attendances once the working schedule ends plus a tolerance, and Absence Management logs absences not covered by a time off request. After a long cut, Odoo may close an attendance before the device's real check-out arrives, so set a generous tolerance, or leave Automatic Check-Out off where outages are common.
Ten minutes a week keeps payroll clean. Review:
- Punches with no employee
- Missing check-outs
- Days over 10 hours of actual work
- Devices that have gone silent
- Attendances Odoo closed automatically
From clean attendance to overtime and payroll under Labour Law No. 17
Clean attendance pays off in overtime and payroll. Labour Law No. 17 of 2010, published in full by the Ministry of Social Affairs and Labour, sets these rules, as of November 2026:
- Article 106: at most 8 hours of actual work a day or 48 a week, breaks excluded, and at most 10 hours at the workplace a day.
- Article 109: a paid weekly rest of 24 consecutive hours after six working days at most.
- Article 110: going beyond these limits is allowed only in listed cases, such as unusual work pressure or stock-taking, and never past 10 hours of actual work a day, two of them overtime.
- Article 111: overtime pays the hourly wage plus 25% by day and 50% by night (7 pm to 7 am, under Article 1), with the percentages doubled on weekly rest days and public holidays.
At an illustrative hourly wage of 200 new Syrian pounds:
- Overtime hour | Rate | Pay, new SYP
- Working day, 7 am to 7 pm | 125% | 250
- Working day, 7 pm to 7 am | 150% | 300
- Rest day or holiday, by day | 150% | 300
- Rest day or holiday, by night | 200% | 400
Six daytime and three night overtime hours in a month add 2,400 new pounds to the payslip.
In Odoo 20, model this as an overtime ruleset: a Quantity rule for hours beyond the contract at 125%, Timing rules for nights and non-working days, and Maximum Rate so the highest rate applies. Approved hours are paid as Overtime Hours work entries or given back as time off; test the ruleset on a past month with your accountant. Article 78 requires wages in the national currency, so keep payroll in new Syrian pounds; our hiring and payroll guide covers social insurance.
Next step: list your devices and branches, then tell us about your setup. METCH, an official Odoo partner serving Syria, can connect them and set up these rules with your team in Arabic.
Frequently asked questions
How do I connect a ZKTeco fingerprint device to Odoo?
Through an integration module that either pulls the punch log from the device over the office network, using the ZK protocol on TCP or UDP port 4370 by default, or receives the punches the device pushes in real time through its ADMS / Cloud Server setting. Push suits Odoo.sh and cloud servers; pull suits Odoo on a server in the same office. Odoo Online also needs a bridge program on an office computer. Then set the device clock to Damascus time and map each device user ID to an employee.
Does Odoo Online work with a fingerprint attendance device?
Yes, but not directly. Odoo Online cannot install modules that contain Python code or reach devices inside your office, so a small bridge program on an office computer reads or receives the punches and sends them to Odoo through the external API, which Odoo includes in its Custom plan. Odoo 20 also documents a ZKTeco BioTime integration, which reads punches from BioTime Cloud software rather than from the terminals. Check your Odoo plan before buying any connector.
What happens to fingerprint punches during a power cut?
As long as the terminal has power, it keeps recording punches in its own memory while the internet or Odoo is down: a pull integration reads them at the next download, and a push device or an office bridge sends them when the connection is back. If the terminal itself loses power, nobody can punch, so put the device and the router on a UPS. After a long outage, check for attendances Odoo closed automatically before the real check-out arrived.
How is overtime calculated under Syrian labour law?
Under Article 111 of Labour Law No. 17 of 2010, an overtime hour pays the normal hourly wage plus 25% by day and plus 50% by night, which Article 1 defines as 7 pm to 7 am, and the percentages double on weekly rest days and public holidays. At 200 new Syrian pounds an hour, that is 250 by day and 300 by night. Article 110 allows going beyond normal hours only in listed cases, capped at 10 hours of actual work a day, two of them overtime.
Connect your fingerprint devices to Odoo Attendances
METCH, an official Odoo partner serving Syria, connects ZKTeco terminals to Odoo, sets up overtime rules for Syrian labour law and payroll in new pounds, and trains your HR team in Arabic.
Start your Odoo plan