Skip to main content
iVentureTeam

hr_presence_status

The colored dot next to every employee, green for present, hollow for archived, a plane when on leave, is hr_presence_status. One tiny widget, layered by three modules, with a pill-shaped form variant that is new in Odoo 19.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 19, 2026Updated August 19, 20267 min read
Odoo 19 employee kanban cards showing hr_presence_status dots: green for present employees and an outlined pill status on the form view.
Technical namehr_presence_status
Field typesselection (the hr_icon_display field)
Viewsform (pill variant), list, kanban
Form variantform.hr_presence_status (rounded pill, 19.0)
Also registered ashr_presence_status_private, form.hr_presence_status_private
Modulehr, patched by hr_holidays, hr_homeworking and hr_holidays_homeworking
Used in core6 occurrences across 2 modules, including hr and hr_org_chart, on the employee form, list and kanban
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0
No-code setupNo: presence display is wired into the HR views
Alternativesmany2one_avatar_employee, label_selection, badge

What the Presence Status widget does

Open the Employees app and every card carries a small status mark: a filled green circle for someone currently logged in, a muted circle outside working hours, a hollow circle for an archived employee. That mark is hr_presence_status, rendered over the hr_icon_display selection field that HR computes from login activity, contracts and leaves.

The widget itself is minimal: it picks a Font Awesome icon and a color class from the selection value and prints the selection label as text. The interesting part is what the rest of the HR suite does to it. hr_holidays patches the same component so employees on approved leave show a plane icon and a label like "On leave, back on Aug 24". hr_homeworking patches it again so the icon becomes a house, a building or a map marker depending on today's work location. The stack of patches is why the same widget shows different things on different databases: what you see depends on which HR modules are installed.

Odoo 19 added a second face: in form views the registered form.hr_presence_status variant renders a rounded outline pill (btn-outline-success and friends) instead of the small dot, so the employee form header gets a proper status chip while lists and kanbans keep the compact circle.

What this means for your team

Presence display sounds cosmetic until you manage a hybrid team from Odoo.

It answers "can I reach this person right now" without a chat app round trip. Reception, dispatch and team leads use the kanban dots dozens of times a day; with hr_homeworking installed, the same glance also answers "are they at home or in the office today", straight from the work location schedule.

What it is not: a time tracker. The status derives from technical presence signals (logins, IP or IM presence depending on configuration) plus leave records. Treating the green dot as attendance data leads to bad conclusions; that is what the Attendances app is for. We make this distinction explicit in every HR rollout, because conflating the two is the most common misreading of this widget.

Note that both employee views ship with it already wired; the customization conversation is usually about adding it to custom views (helpdesk assignment boards, planning dashboards) where knowing who is present changes who gets the work.

Working examples

As the employee kanban uses it

<field name="hr_icon_display" widget="hr_presence_status" invisible="not show_hr_icon_display or not id"/>

The pill on a form header (Odoo 19)

<!-- In a form view, the same widget name resolves to the pill variant -->
<field name="hr_icon_display" widget="hr_presence_status"/>

No XML difference: the form view automatically picks the form.-prefixed registration, which is how Odoo serves the dot in lists and the pill on forms from one widget name.

On a custom assignment view

<field name="employee_id" column_invisible="1"/>
<field name="employee_icon_display" widget="hr_presence_status" string="Presence"/>

Expose the employee's hr_icon_display through a related field and the dot works anywhere.

The patch stack, and the bug we found in it

Reading the full patch stack turned up one finding no documentation mentions.

The pill's holiday colors are dead code in 19.0. The hr_holidays_homeworking bridge module patches all four presence components. For the two base components it calls its patch factories: patch(HrPresenceStatus.prototype, patchHrPresenceStatus()). But for the two pill components it passes the factory itself, without the parentheses: patch(HrPresenceStatusPill.prototype, patchHrPresenceStatusPill). The patch helper copies properties off what it receives, and a function carries no color getters, so on databases with Time Off plus Remote Work installed, the form pill never shows the holiday color override that the small dot shows. Nothing crashes, which is why it went unnoticed.

Label logic is layered by super calls. Base label = the selection label. hr_holidays wraps it with "back on" plus leave_date_to. The private variants prefer the leave type's display name via current_leave_id. Each patch adds its own field dependencies so those extra fields load with the view.

The private variants exist for confidentiality. hr_presence_status_private renders the same visuals but is patched to show the actual leave type (Sick Leave versus Legal Leave) only where the viewer is allowed to see it; public employee views keep the generic label.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Pill variants deleted, homeworking folded into the base widget, new oi icon set. See below.
Odoo 19.0VerifiedVerified against the shipped source. Adds the form pill variants.
Odoo 18.0Partial / changedBase and private widgets only, no pill variants; same dot rendering.
Odoo 17.0Partial / changedPresent with different selection values (presence_absent_active, presence_to_define) and hollow-icon rule.
Odoo 16.0Not availableNo JavaScript widget at this path; presence display predates the current component.

Upgrade note. The pill variants (form.hr_presence_status and form.hr_presence_status_private) exist only in 19.0. Coming from 18, form views gain the pill automatically; custom CSS targeting the old small dot in forms may need review. The selection values also changed across versions: 17 used presence_absent_active and presence_to_define, 19 uses presence_out_of_working_hour and presence_archive, so Python extensions of the compute need remapping.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The notes below are read from the public development branch and are not final until release.

This widget is heavily reworked on master. The pill files are deleted after a single release, so form.hr_presence_status disappears again. The hr_homeworking patch is gone too: its home, office and other locations move into the base widget in hr, now drawn with the new oi icon set (circle, home, business, location_on) instead of Font Awesome. The component gains an isActive getter with an active field dependency, bakes hr_presence_state and the work location fields into its dependencies, and styles itself as an absolutely positioned round badge via additionalClasses. A new hr_attendance patch file appears as well. Anything styled or patched against the 19 structure will need review. We re-verify against the shipped release.

Common problems and fixes

SymptomCause and fix
No dot appears on your custom viewThe widget renders from a selection field like hr_icon_display; a missing or unloaded field renders nothing. Point the widget at hr_icon_display (or a related field to it) and make sure the record is saved; core hides it on unsaved records.
Everyone shows as away even when logged inPresence is computed from technical signals; on self-hosted setups the IM presence or hr_presence configuration is missing. Check the hr_presence settings (login, IP or email based detection) and that the compute's cron runs.
The form shows a pill but your list shows a dotIntended: Odoo 19 registers a separate form. variant that renders the pill; other views use the base component. Nothing to fix. To force the dot on forms you would have to re-register the base component under the form. name.
Holiday colors show on the kanban dot but not on the form pillThe hr_holidays_homeworking bridge passes its pill patch factory uncalled, so the pill color override never applies in 19.0. Apply the one-character fix (call the factory) in a custom module, or accept the cosmetic gap until Odoo patches it.
After upgrading, custom presence statuses stopped renderingThe selection values the widget switches on changed between 17 and 19 (presence_out_of_working_hour, presence_archive are current). Remap your compute extension to the current selection values and re-test each color case.

Presence Status widget vs the alternatives

WidgetBest forKey difference
hr_presence_statusShowing whether an employee is present, remote, on leave or archivedPresence semantics with module-layered icons; a pill on forms, a dot everywhere else
many2one_avatar_employeeShowing which employee, with their photoRenders the person; no presence state at all
label_selectionGeneric colored status labels on any selection fieldMaps selection values to Bootstrap labels with no HR dependency
badgeRead-only state chips in listsDecoration-driven colors, works on any field type it supports

This widget is for presence semantics specifically. For a generic status on your own selection field, label_selection or badge gives you colored labels without HR dependencies; many2one_avatar_employee shows who, while this widget shows whether they are around.

Frequently asked questions

What does the green dot next to an employee mean in Odoo?+
It is the hr_presence_status widget rendering the presence_present state: Odoo has detected the employee as currently active based on the configured presence signals (login, IP or IM presence). Muted means outside working hours; a hollow circle means the employee is archived.
Why does one employee show a plane icon?+
The hr_holidays module patches the widget: an employee on approved leave shows a plane and a label with the return date, read from leave_date_to. With hr_homeworking installed you may also see house, building or map-marker icons for today's work location.
Can I use hr_presence_status on my own model?+
Yes, via a related field to the employee's hr_icon_display. The widget has no options, so it is a one-line view change; the hr module must be installed.
Is the presence dot the same as attendance?+
No. Presence is a technical online/away signal plus leave data, for reachability at a glance. Attendance (check in, check out) is a separate app with its own records; do not use the dot for time tracking.
Why is the status pill on the employee form new?+
Odoo 19 registered a form. variant of the widget that renders a rounded outline pill instead of the small icon. On the Odoo 20 development branch that variant is removed again, so treat form-specific styling as version-sensitive.
How do I change when an employee counts as present?+
Extend the Python compute of hr_icon_display (and the hr_presence settings). The widget only renders the selection value it receives; none of the logic lives in JavaScript.

Rolling out Odoo HR for a hybrid team?

Presence dots, remote work locations, leave visibility and privacy-correct status labels all depend on wiring hr, hr_homeworking and hr_holidays together properly, and on knowing where the sharp edges are, like the pill patch bug documented above. We implement Odoo HR end to end and make the org's real working model visible in it.

Plan our HR implementation

How this page was produced

This page was verified by reading hr_presence_status.js and its pill and private siblings in the Odoo 19.0 hr module, plus all three patch files in hr_holidays, hr_homeworking and hr_holidays_homeworking, where the uncalled patch factory described above is visible in the source. Version differences were confirmed against the 16.0, 17.0 and 18.0 branches and the Odoo 20 section against the public development branch, marked as unreleased. Spotted an error or a version difference? Tell us and we will correct the page.