ZMI – People:

Time tracking cloud

ZMI time tracking in the cloud

200.000+

daily users

Highlights of cloud time tracking with ZMI - People

Efficient time tracking for companies and organizations in all industries in the cloud.

Mandatory time tracking? Legally prepared with ZMI.

The ECJ ruling and the decision of the Federal Labor Court clearly show that mandatory time tracking is coming. With ZMI – People, you are already prepared today – automatically, digitally and without additional effort. This means you can meet the requirements in a legally compliant manner and rely on a system that has already proven itself in the day-to-day operations of many companies.

Time tracking made easy.

With ZMI – People, you can record working times in seconds – whether you’re in the office, working from home or on the move.

A fair start: from just €1.16 per user.

With ZMI – People, you can get started with time tracking in a cost-effective and legally compliant way. Ideal for small and growing teams – full performance at fair conditions.

ZMI - People allrounder
/* ---- Farbschema & Größen (leicht anpassbar) ------------------------ */ :root { --slice-a: #F5D085; /* gelb : Geplant/Genommen */ --slice-b: #A0DA6C; /* grün : Verfügbarer Urlaub*/ --slice-c: #E4E7EA; /* grau : Übertrag Vorjahr */ --size : 260px; /* Durchmesser des Donuts */ --thickness: 75px; /* Breite des Rings */ --bg : #FCFCFC; /* weißes Karten‑/Hintergrund‑Weiß */ --tooltip-bg: #4b4d52; /* dunkles Grau */ } .wrapper { /* Donut + Legende nebeneinander */ display: flex; align-items: center; gap: 3rem; flex-wrap: wrap; justify-content: center; } /* ---- Donut‑Grundform --------------------------------------------- */ .donut { width : var(--size); height: var(--size); border-radius: 50%; /* runde Scheibe */ background: var(--bg); /* wird per JS überschrieben */ /* leichter Schatten */ filter: drop-shadow(0 4px 12px rgba(0,0,0,.08)); transition: transform .2s ease, filter .2s ease; position : relative; flex: none; } .donut:hover { /* dezent vergrößern */ transform: scale(1.03); filter: drop-shadow(0 6px 16px rgba(0,0,0,.10)); } /* Loch in der Mitte (weiß) */ .donut::after { content: ""; position: absolute; inset: calc(var(--thickness)/2); background: var(--bg); border-radius: 50%; z-index: 1; /* über Gradient */ } /* ---- Zahl in der Mitte ------------------------------------------- */ .donut__label { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-weight: 700; /* Bold */ font-size : clamp(2.8rem, 4.5vw, 3.4rem); /* responsive */ color: var(--e-global-color-text); pointer-events: none; z-index: 2; } /* ---- Legende ------------------------------------------------------ */ .legend { display: flex; flex-direction: column; gap: 1rem; font-size: .9rem; color: #3A3B47; user-select: none; } .legend__item { display: flex; align-items: center; gap: .5rem; cursor: pointer; transition: opacity .2s ease; } .legend__item:hover { opacity: .8; } .legend__swatch { width: 1rem; height: 1rem; border-radius: 4px; flex: none; } .legend__swatch--a { background: var(--slice-a); } .legend__swatch--b { background: var(--slice-b); } .legend__swatch--c { background: var(--slice-c); } /* ---- Tooltip Skin ------------------------------------------------- */ .tooltip { position: fixed; transform: translate(-50%, -100%); /* Pfeilspitze am Mouse‑X */ background: var(--tooltip-bg); color: #fff; font-size: .9rem; padding: .45rem .8rem; border-radius: 6px; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity .15s ease; z-index: 1000; } .tooltip.visible { opacity: 1; } .tooltip::after { content: ""; position: absolute; left: 50%; bottom: -4px; transform: translateX(-50%) rotate(45deg); width: 8px; height: 8px; background: inherit; /* Pfeil */ } .tooltip__dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
Planned/taken (16) Available vacation (14) Carried forward from previous year (1)
/* -------------------------------------------------------------------- 1. Datenmodell (Werte + Farben) -------------------------------------------------------------------- */ const seg = { a: { v: 16, l: 'Geplant/Genommen', c: getVar('--slice-a') }, b: { v: 14, l: 'Verfügbarer Urlaub', c: getVar('--slice-b') }, c: { v: 1, l: 'Übertrag Vorjahr', c: getVar('--slice-c') } }; const order = ['a', 'b', 'c']; // feste Reihenfolge (CW) const vis = { a: true, b: true, c: true }; // aktuell sichtbar? function getVar(name) { return getComputedStyle(document.documentElement).getPropertyValue(name).trim(); } const bg = getVar('--bg'); /* -------------------------------------------------------------------- 2. DOM‑Referenzen -------------------------------------------------------------------- */ const donut = document.querySelector('.donut'); const label = document.querySelector('.donut__label'); const legend = { a: document.querySelector('.legend__item--a'), b: document.querySelector('.legend__item--b'), c: document.querySelector('.legend__item--c') }; const tooltip = document.getElementById('tooltip'); /* -------------------------------------------------------------------- 3. Gradient‑Renderer → liefert CSS‑Gradient + Slice‑Grenzen -------------------------------------------------------------------- */ let slices = []; // [{ k, start, end }] /** * Bau den conic‑gradient String + fülle das globale `slices`‑Array. * @param {string[]} keys – sichtbare Segmente (Reihenfolge wie order) * @param {number[]} sweeps – Winkel (deg) für jedes Segment * @returns {string} – CSS `conic-gradient(...)` oder bg‑Farbe */ function buildGradient(keys, sweeps) { const visible = keys.map((k,i)=>({ k, sw: sweeps[i] })).filter(o => o.sw > 0.05); if (!visible.length) { slices = []; // leer → Tooltip findet nichts return bg; // komplett weißer Ring } slices = []; let cur = 0; // aktueller Startwinkel const parts = []; visible.forEach((o, idx) => { // letztes sichtbares Slice bis 360° -> garantiert lückenlos const sw = idx === visible.length-1 ? 360 - cur : o.sw; const end = cur + sw; slices.push({ k: o.k, start: cur, end }); parts.push(`${seg[o.k].c} ${cur}deg ${end}deg`); cur = end; }); return `conic-gradient(${parts.join(',')})`; } /* -------------------------------------------------------------------- 4. Animation (lerp zwischen zwei Zuständen) -------------------------------------------------------------------- */ const DUR = 400; // ms Animation function tween(fromKeys, toKeys) { // Hilfsfunktionen const sum = k => k.reduce((s,x)=>s+seg[x].v,0) || 1; const sweeps = (k,total) => k.map(x => seg[x].v / total * 360); const fSum = sum(fromKeys), tSum = sum(toKeys); const fSw = sweeps(fromKeys, fSum); const tSw = sweeps(toKeys, tSum); const allKeys = order.filter(k => fromKeys.includes(k) || toKeys.includes(k)); const t0 = performance.now(); (function step(now) { const p = Math.min(1, (now - t0) / DUR); const cur = allKeys.map(k => { const a = fSw[fromKeys.indexOf(k)] || 0; const b = tSw[toKeys.indexOf(k)] || 0; return a + (b - a) * p; // linear interpolation }); // Normieren, damit Summe 360° (schließt Ring auch während Tween) const factor = 360 / (cur.reduce((x,y)=>x+y,0) || 1); donut.style.background = buildGradient(allKeys, cur.map(x => x * factor)); if (p order.filter(k => vis[k]); const updateLabel = () => label.textContent = activeKeys().reduce((s,k)=>s + seg[k].v, 0); const updateLegend = () => order.forEach(k => legend[k].style.opacity = vis[k] ? 1 : .4); function toggle(k) { const before = activeKeys(); vis[k] = !vis[k]; const after = activeKeys(); tween(before, after); updateLabel(); updateLegend(); } legend.a.onclick = () => toggle('a'); legend.b.onclick = () => toggle('b'); legend.c.onclick = () => toggle('c'); /* -------------------------------------------------------------------- 6. Initialer Render -------------------------------------------------------------------- */ (function init() { const keys = activeKeys(); const total = keys.reduce((s,x)=>s + seg[x].v, 0); const sweeps = keys.map(k => seg[k].v / total * 360); donut.style.background = buildGradient(keys, sweeps); updateLabel(); })(); /* -------------------------------------------------------------------- 7. Tooltip (Mouseover) -------------------------------------------------------------------- */ function showTip(x, y, k) { tooltip.innerHTML = `${seg[k].l} : ${seg[k].v}`; tooltip.classList.add('visible'); const h = tooltip.offsetHeight; tooltip.style.left = `${x}px`; tooltip.style.top = `${y - h - 8}px`; } const hideTip = () => tooltip.classList.remove('visible'); donut.addEventListener('mousemove', e => { const rect = donut.getBoundingClientRect(); const cx = rect.left + rect.width / 2; const cy = rect.top + rect.height / 2; const dx = e.clientX - cx; const dy = e.clientY - cy; const dist = Math.hypot(dx, dy); const outer = rect.width / 2; const inner = outer - parseFloat(getVar('--thickness')); if (dist outer) { hideTip(); return; } // Winkel: 0° = 12 Uhr, positive Werte im Uhrzeigersinn const deg = (Math.atan2(dx, -dy) * 180 / Math.PI + 360) % 360; // Slice suchen (beachtet ggf. umklappende Endwinkel >360) const slice = slices.find(s => s.end = s.start && deg = s.start || deg <s.end - 360) ); if (slice) showTip(e.clientX, e.clientY, slice.k); }); donut.addEventListener('mouseleave', hideTip);

Time tracking with all the functions you need.

From overtime calculation to vacation planning – ZMI – People bundles all important functions in one solution. Simple, clear and can be used anywhere.

The ZMI People team calendar

Sounds good? Try ZMI - People for free with just two clicks:

Our packages

Monatliche Abrechnung Jährliche Abrechnung
0 Mitarbeiter
ZMI People Basic
0€

monthly

ZMI People Basic
0€

monthly

Test ZMI - People now for 14 days free of charge

    ZMI GmbH will only use your personal data to manage your account and to provide the information, products and services you have requested. From time to time we would like to inform you about interesting topics.

    You can unsubscribe from this information at any time. For more information on how to unsubscribe, our privacy practices and how we protect and respect your privacy, please see our Privacy Policy. By clicking on "Send request" below, you agree that ZMI GmbH may store and process the personal data provided above in order to provide you with the requested content.

    This website is protected by reCAPTCHA, and Google's Privacy Policy and Terms of Service apply.

    Extension options

    • Time tracking terminal 889,00 €

      A compact and cost-effective terminal for time tracking. Full range of functions at the best price-performance ratio.

    • RFID transponder 11,00 €

      RFID badge media to match the time recording terminal. Maximum security thanks to the Mifare DESfire RFID process.

    • Planner add-on on request

      Cloud time tracking x staff scheduling. Schedule employees to changing work locations such as department, workplace or cost center.

    All prices plus any applicable statutory value added tax.
    pages of paper saved per month*
    200
    You can choose from interfaces for expansion (e.g. DATEV).
    0 +
    faster than manual time tracking in Excel
    0 x

    *for 100 employees compared to paper-based recording with weekly time sheets

    Over 1,700 customers at
    have already opted for ZMI at
    .

    Frequently asked questions

    Answers to your most important questions

    Is ZMI - People GDPR-compliant?

    Yes, ZMI – People meets the requirements of the General Data Protection Regulation (GDPR) and ensures secure processing of personal data.

    Yes, ZMI offers a free trial period during which you can try out the functions of ZMI – People without obligation.

    ZMI – People can be connected to the DATEV payroll systems and supports the export of relevant transaction data for payroll accounting.

    As a cloud solution and thanks to its intuitive user interface, ZMI – People is quickly up and running and requires no extensive training or IT effort to install.

    ZMI – People is a modern and scalable solution that, unlike Excel, avoids input errors and incorrect calculations. Thanks to automated processes, work becomes more efficient and the administrative workload is significantly reduced. ZMI – People also supports compliance with legal requirements and is sustainably future-proof.

    Question not answered?