Guide · Infrastructure

Biometric attendance without a static IP: how to solve the network problem once and for all

"We need a static IP" is the sentence that kills half of the biometric attendance projects in Latin America. You don't need one — here's why, and what the options are.

2026-09-14·7 min read·Guía

The industry's most common blocker

A customer wants biometric attendance across 5 franchises. Three use residential internet, one uses 4G and the fifth is on a job site. The local vendor replies: "we need a static IP at every site". And that's where the project dies: a static IP costs extra, sometimes isn't even available, and configuring 5 different networks isn't a plan — it's a ticket list.

The root problem is the connection model: if your software enters the customer's network to read the time clock, the customer's network has to be reachable from the outside. That requirement is what creates the whole problem.

The traditional options (and their real cost)

OptionRequired at the customerTypical costRisk
ISP static IPBusiness contract + IP at each site$10–$40/month per siteNot available everywhere or with every ISP
DDNS + port forwardingRouter configuration, DNS updatesLowFragile with dynamic IP; opens the customer's network to the internet
Site-to-site VPNCompatible router + maintenanceMediumComplex to operate; one misconfigured network device takes everything down
Local PC as bridgeMachine on 24/7 running local softwareMediumSingle point of failure; nobody reboots it when it goes down
Push mode via cloud APIJust internet access (outbound)Included in the APINo network risk: the terminal connects itself

How push mode works (conceptual version)

Modern ZKTeco terminals support a mode in which the device is the one that reaches out: it connects to the cloud server's address and delivers its events — punches, heartbeats, syncs — on its own initiative, without anyone entering the network where it's installed.

The practical consequences:

Golden rule: if the terminal has internet access — any connection — the integration works. If someone tells you "first you have to buy a static IP", they're solving a problem from 1998.

What this means for your software

If you build the system (ERP, payroll, condo management), push mode changes the implementation conversation:

Consuming the events from your backend looks like this:

import { createClient } from 'redis';

const sub = createClient({
  socket: { host: process.env.REDIS_HOST, port: Number(process.env.REDIS_PORT) },
  password: process.env.REDIS_PASSWORD
});

await sub.connect();

await sub.subscribe('punch_YOUR-SERIAL', (message) => {
  const event = JSON.parse(message);
  // mark attendance in your system, notify, trigger rules...
  console.log(event.pin, event.timestamp);
});

And if you'd rather query than listen, the REST API exposes per-terminal reports with date range and pagination.

What if the site's internet goes down?

That's the right question. Terminals store punches in local memory while there's no connection and re-upload them when the network comes back: the device tolerates temporary outages. For your software, the recommendation is simple: use real-time events for what's urgent (notifications, access) and the REST report as the source of truth for reconciliation.

Frequently asked questions

Does my customer need a static IP?

No. In push mode the terminal connects itself to the cloud; the site's IP can be dynamic.

Does it work over 4G?

Yes: any router with a SIM will do. It's the typical case on job sites, franchises and temporary events.

Are punches lost if the internet drops?

No: the terminal stores punches locally and re-uploads them on reconnect. No gaps from short outages.

Connect your first site without touching the customer's network

Test the full flow: terminal, real-time events and reports, for 14 days.