Skip to main content
iVentureTeam

statusbar

The stage strip at the top of Odoo forms is the statusbar widget. It shows where the record stands, lets users click to move it, and hides two keyboard shortcuts almost nobody uses.

August 11, 2026Updated August 11, 20266 min read
Odoo 19 sales order form header with the statusbar widget showing Quotation, Quotation Sent and Sales Order stages, the current one highlighted.
Studio name(set up via Studio's Stages feature on custom models)
Technical namestatusbar
Field typesmany2one, selection
Viewsform (header)
Moduleweb, present in every Odoo database
Used in core67 occurrences across 39 modules, including sale, purchase, account, stock, mrp, hr_recruitment
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupPartly: Studio's Stages feature creates the standard setup; options are XML
Alternativesbadge, state_selection, radio, priority

What the statusbar does

Every Odoo record with a lifecycle announces it in the same place: the arrow-shaped stage strip in the form header. Quotation to Sales Order, Draft to Posted, New to Hired. That strip is this widget, rendering either a selection field's values or the records of a many2one to a stage model.

It is not just display. With clickable on, its default, clicking a stage writes the value and saves the record on the spot; the source calls record.update followed by record.save. That immediacy is what makes pipelines feel alive, and also what surprises teams whose automations fire the moment someone clicks.

On many2one stage fields the widget fetches the stages itself, and does one subtle thing verified in the source: the search domain is OR-ed with the currently selected stage's id, so a record sitting in a stage your domain excludes still displays honestly instead of showing blank.

What this means for your team

The statusbar is your process, drawn on every record. When the stages match how work actually flows, nobody needs training to know what happens next; when they do not, users invent parallel tracking in spreadsheets and the ERP quietly stops being the source of truth.

Two design decisions matter more than any option. Keep the visible strip short, three to five stages, and fold the exceptional ones behind fold_field; a ten-arrow strip reads as bureaucracy. And decide deliberately whether clicking should move records: clickable defaults to on, which is right for sales pipelines and wrong for states that only buttons with checks should reach, like Posted on an invoice. Odoo itself renders account move states non-clickable for exactly that reason.

The immediate save is a process fact worth briefing: a click is a commit, not a suggestion. Stage-change automations, emails, timestamps, all fire right then.

Setting it up in Odoo Studio (no code)

Studio's Stages feature builds the standard setup on custom models.

  1. Open your custom model's form in Studio.

  2. Toggle Stages in the model properties. Studio creates the stage model, the many2one field, and places the statusbar in the header.

  3. Add or reorder stages from the kanban or the stage model's list.

What Studio cannot do here

Studio stops at the standard setup. Making the bar read-only (clickable: False), folding stages behind a fold_field, or limiting visible selection values with statusbar_visible are XML attributes on the field, shown below. The header placement itself is also XML if you are not using the Stages feature.

Supported options in Odoo 19

Verified against statusbar_field.js in the Odoo 19.0 web module. Two declared options plus one attribute the widget reads from the field element.

OptionTypeWhat it does
clickablebooleanWhether clicking a stage moves the record. Clicking updates and saves immediately. Set False for states only workflow buttons should reach.(default: true)
fold_fieldfield nameBoolean field on the related stage model; stages with it set collapse into the trailing dropdown. Same flag kanban columns fold on, so both views stay consistent.
statusbar_visibleattribute (comma list)Field-element attribute, not an option: comma-separated selection values to show inline. The current value is always added, so hidden states still display when active.

statusbar_visible is an attribute, not an option, a distinction that trips people up: it goes directly on the field element, takes a comma-separated list of selection values, and the source always adds the current value to it, so a record in a hidden state still shows where it is.

Working examples

Selection states in the header

<header>
    <field name="state" widget="statusbar"
           statusbar_visible="draft,posted"/>
</header>

Only draft and posted render inline; cancel appears only when a record is actually cancelled.

Read-only states (buttons move the record)

<field name="state" widget="statusbar"
       options="{'clickable': False}"/>

The strip shows position; workflow buttons with their validations do the moving. The pattern for anything accounting-adjacent.

Many2one stages with folding

<field name="stage_id" widget="statusbar"
       options="{'fold_field': 'fold'}"/>

Stages whose fold boolean is true collapse into the trailing dropdown, the same convention kanban columns use, so both views fold consistently from one flag.

The keyboard shortcuts nobody knows

The source registers two commands on every form-view statusbar, and they are the fastest way to move records that exists in Odoo.

Alt+X: move to the next stage. One keystroke advances the record, disabled only when the last stage is reached or the bar is read-only. For anyone processing a queue, screening applicants, confirming orders, this replaces a mouse trip per record.

Alt+Shift+X: move to any stage. Opens the command palette pre-filtered with every stage; type a few letters, hit enter. It respects the same rules as clicking, including the immediate save.

(On Mac these are Control+X flavored per Odoo's hotkey mapping; the command palette itself lists the exact keys.)

The other invisible machinery is responsive folding. The source documents a 4-scenario algorithm: everything inline when it fits; then stages before the current one collapse into a leading dropdown; then stages after it join the trailing one; and when nothing fits, the whole bar becomes a single dropdown, which is also the permanent behavior on small screens. Knowing this saves a bug report the first time a narrow window swallows your stages.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The development branch shows no behavior changes; see below.
Odoo 19.0VerifiedVerified against the shipped source and tested on a clean database.
Odoo 18.0VerifiedSame options and behavior. No XML changes needed.
Odoo 17.0VerifiedSame options and behavior. No XML changes needed.
Odoo 16.0VerifiedSame options and behavior. No XML changes needed.

Upgrade note. Options and attributes are unchanged from Odoo 16 through 19. The responsive folding internals were reworked along the way, so JavaScript patches on the old DOM structure need review; XML carries over untouched.

What is changing in Odoo 20

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

Nothing changes for this widget. The development version declares the same two options, the same statusbar_visible handling, and the same pair of commands. Internal component syntax moves to the new Owl props system, affecting JavaScript patches only. We re-verify once Odoo 20 ships.

Common problems and fixes

SymptomCause and fix
Clicking a stage does nothingclickable: False is set, or the record/field is readonly in this state. Check the options and any readonly conditions; non-clickable is often intentional.
A stage is missing from the barstatusbar_visible excludes it, a fold_field tucks it into the dropdown, or a domain filters the stage record. Check all three in that order; folded stages live in the trailing dropdown.
Stage change fired emails/automations instantlyClicking saves immediately by design (update + save in the source). Expected; gate heavy automations on additional conditions, or make the bar non-clickable.
Stages collapsed into a dropdownThe container is too narrow; the responsive algorithm folds stages progressively, and small screens always get one dropdown. Widen the window, shorten stage names, or fold rare stages deliberately with fold_field.
Record shows a stage outside my domainThe source always includes the current value in its stage search, even when the domain excludes it. Expected honesty; fix the record's stage or widen the domain if that state should be reachable.
Alt+X does nothingThe commands register on form views only, and not when the bar is disabled or already at the last stage. Use it on the form (not lists), and check clickable/readonly state.

Statusbar vs the alternatives

WidgetBest forKey difference
statusbarThe record's lifecycle, shown and moved in the form headerClickable stages that save instantly, folding, and built-in Alt+X shortcuts
badgeRead-only status color in listsDisplay-only pill, no interaction
state_selectionQuick status flips from lists and kanbanColored dot with a small inline menu
radioMutually exclusive choices that are not a lifecyclePlain form control, no header placement, no save-on-click
priorityImportance level rather than process positionStars, orthogonal to workflow stages

The practical test: the record's lifecycle belongs in the header statusbar, once. A status you want colored inside lists is a badge; a status users flip casually in place is state_selection; and mutually exclusive attributes that are not a lifecycle are plain radio or selection fields, not stages.

Frequently asked questions

How do I add a statusbar to my custom model in Odoo?+
With Studio, toggle the Stages feature on the model: it creates the stage model, the field and the header statusbar. In code, put a selection or many2one stage field inside the form's <header> with widget="statusbar".
How do I stop users changing state by clicking the statusbar?+
Set options="{'clickable': False}". The bar keeps showing position while your workflow buttons, with their validations, remain the only way to move the record. This is how core renders invoice states.
What does statusbar_visible do?+
It is an attribute on the field element listing which selection values render inline, e.g. statusbar_visible="draft,posted". Verified in the source: the record's current value is always added to the list, so an excluded state still shows when the record is in it.
How do folded stages work?+
Point fold_field at a boolean on the stage model; stages with it set collapse into the trailing dropdown. It is the same flag kanban uses to fold columns, so one checkbox folds both views.
Is there a keyboard shortcut to change stage in Odoo?+
Two, registered by this widget on form views: Alt+X moves to the next stage, Alt+Shift+X opens a "Move to ..." palette listing every stage. Both respect clickable/readonly rules and save immediately.
Does clicking a stage save the record?+
Yes. The source updates the field and calls save in the same handler, so the change, and any automation watching it, happens the moment you click, even with other edits pending on the form.

Do your stages match how work really flows?

Pipelines that mirror your process, folded edge cases, and states that only validated buttons can reach: statusbar design is process design. We build both, from stage models to the automations behind them, on Odoo 16 through 19.

Book a free consultation

How this page was produced

The options, the statusbar_visible merge with the current value, the immediate save on click, both command-palette shortcuts and the 4-scenario folding algorithm were all read from the Odoo 19.0 web module source (statusbar_field.js) and confirmed on a clean Odoo 19 database, where the screenshot was captured. The Odoo 20 statement comes from the same file on the public development branch, where it is unchanged. Spotted an error? Tell us and we will correct the page.