Skip to main content
iVentureTeam

tour_start_widget

The Onboarding and Testing buttons on Odoo's Tours screen are one widget: tour_start_widget, a char field that never shows its value and instead launches the tour in manual or automated mode.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 25, 2026Updated August 25, 20266 min read
Technical nametour_start_widget
Field typeschar, text
Viewsform, list
Moduleweb_tour, present in every Odoo database
Used in core2 occurrences in 1 module: the tour form header and the Tours list, both on the name field
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. It ships wired into the Tours screens; Studio does not expose it
AlternativesCopyClipboardURL, documentation_link, XML header buttons

What the tour start widget does

Odoo ships an interactive tour engine: sequences of pointer steps that walk a user through a flow, used for onboarding and, in automated mode, for testing. Since Odoo 18, tours can live in the database, including custom ones captured with the tour recorder, and they get a management screen under Settings, Technical, Tours when developer mode is on. This widget is that screen's play control.

It is technically a char field widget placed on the tour's name, but it never renders the name. The template replaces the value with two buttons. Onboarding calls startTour in manual mode: the pointer appears and waits for the user to perform each step, starting at the tour's configured URL. Testing runs the same tour in auto mode, the engine performing every step itself with a 250 millisecond pointer delay so a human can watch it work.

Both runs are built from the record's own data: the tour name, its starting URL, whether it is a database-defined custom tour, that is the fromDB flag, and the rainbow-man congratulations message shown at the end, an HTML field defaulting to Good job! You went through all steps of this tour.

What this means for your team

Two audiences meet on this screen. For operations and training teams, the Tours list plus the recorder is a no-code way to build guided walkthroughs of your own processes: record the flow once, and every new hire can replay it against the real UI with the Onboarding button. It will not replace documentation, but for how do I create a credit note type questions it beats a PDF by a wide margin.

For teams maintaining customizations, the Testing button is a cheap smoke test. An automated tour that walks your quotation flow and ends in the rainbow man is a regression check anyone can run after an upgrade, no test framework knowledge required. We record exactly such tours as part of custom Odoo delivery so clients can self-verify core flows after every update.

The practical caveat: tours run against the live database. An automated tour that creates a quotation really creates one. Run Testing on a staging copy, or make the tour clean up after itself.

Supported options in Odoo 19

Verified against tour_start.js in the Odoo 19.0 web_tour module. The option surface is stranger than it looks: the descriptor spreads the char field, keeping its declared options, then replaces extractProps wholesale, so most inherited knobs are dead. The table lists what actually works, and what only appears to.

OptionTypeWhat it does
linkbooleanUndocumented: read in extractProps, never declared. Renders both buttons as quiet btn-link text instead of solid btn-primary. Core sets it only in the Tours list. Removed on the Odoo 20 branch, where list views get the styling automatically.(default: false)(since Odoo 18.0)
placeholder_fieldfield nameInherited declaration from the char field, but dead here: the replaced extractProps never reads it and the value is never rendered. Listed because tooling that reads declarations will still offer it.

Inherited but dead. Because the custom extractProps returns only link, the char field's placeholder, password, autocomplete and dynamic-placeholder handling never reach the component, and the value itself is never rendered anyway. Yet placeholder_field still shows up as a supported option in tooling that reads declarations, a textbook case of Odoo's declared-versus-extracted option gap.

Working examples

How core uses it (tour form header)

<header>
    <field name="name" widget="tour_start_widget"/>
</header>

In the Tours list, link-styled

<list js_class="tour_list" create="0" edit="0">
    <field name="name"/>
    <field name="url"/>
    <field name="custom"/>
    <field name="rainbow_man_message" column_invisible="1"/> <!-- Invisible to get the data in JS -->
    <field name="name" widget="tour_start_widget" options="{'link': true}" string=""/>
</list>

Core's own comment on the invisible column is the documentation: the widget reads rainbow_man_message, url and custom from the record without declaring dependencies, so the view must load them. The list also demonstrates the trick of placing name twice, once as text, once as the buttons.

Manual versus auto, and where the styling comes from

The two modes differ by three parameters. Both buttons call tour_service.startTour with the tour name, the starting URL and fromDB: custom. Onboarding passes mode: "manual"; Testing passes mode: "auto" plus showPointerDuration: 250 so each step's pointer flashes visibly. Odoo 18's Testing also sent stepDelay: 500, a half-second pause between steps, dropped in 19, so automated runs are noticeably faster after the upgrade.

fromDB decides where steps come from. Code-defined tours are looked up in the client-side registry; database tours, the recorder's output, are fetched from the server. The widget wires that switch to the record's custom boolean, which is why the column sits in the list view.

The link option's whole implementation is a class swap. With link truthy the buttons render btn-link py-0 instead of btn-primary. It is undocumented, never declared in supportedOptions, and exists solely so the list view can show quiet text-style actions while the form header gets solid buttons.

Button captions are hardcoded. The template says Onboarding and Testing, translatable but not configurable. Renaming them means inheriting web_tour.TourStartWidget.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. The link option is removed; styling derives from the view type. Everything else unchanged. Re-verified after launch.
Odoo 19.0VerifiedVerified against the shipped source. Testing runs faster than 18: the 500 ms step delay was removed.
Odoo 18.0VerifiedIntroduced with database tours and the Tours screen. Same buttons; automated runs insert a 500 ms delay between steps.
Odoo 17.0Not availableThe widget does not exist; tours are code-defined and launched from the developer tools menu.
Odoo 16.0Not availableThe widget does not exist.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The following reads the public development branch, which is unstable until feature freeze; this page is re-verified against the shipped release.

The link option is deleted, replaced by view-type detection. On the branch, extractProps ignores options entirely and returns link: viewType === "list": list views automatically get the quiet link styling, forms get solid buttons, and the Tours list drops its options="{'link': true}" accordingly. Custom views passing the option will not break, the key is simply ignored, but forcing link styling on a form, or solid buttons in a list, stops being possible without inheriting the template.

Everything else holds. Same two buttons, same modes, same record fields, with the prop plumbing migrated to the new typed-props API. A tour-based smoke suite should survive the upgrade untouched; re-record any tour whose underlying flow your Odoo 20 migration changes.

Common problems and fixes

SymptomCause and fix
Tour starts on the wrong pagestartTour uses the record's url field, defaulting to /odoo. Set the tour's Starting URL to the screen the first step expects.
Custom recorded tour does nothing when startedfromDB comes from the custom flag; if the record is miscategorized the engine looks in the wrong place for steps. Check the Custom checkbox state and that the tour has step records.
No rainbow man at the endrainbow_man_message is empty, or the view running the tour did not load it, since the widget declares no field dependencies. Fill the message on the tour form; keep the invisible column if you customized the list.
Buttons look like plain text in my custom viewThe link option is set, or on Odoo 20 the view is a list, where link styling is automatic. Drop the option on 19; inherit the template if you must restyle on 20.
Automated test tour modifies real dataTesting mode performs every step against the live database. Run it on staging, or design the tour to clean up what it creates.
The Tours menu is missing entirelyThe screen is a developer-mode Technical menu. Enable developer mode, then Settings, Technical, Tours.

Tour start widget vs the alternatives

WidgetBest forKey difference
tour_start_widgetLaunching a stored tour in onboarding or testing modeChar widget that hides its value and renders two startTour buttons wired to the record's fields
CopyClipboardURLThe tour's Sharing URL column on the same screenAlso a char widget with custom chrome, but copies the value instead of acting on the record
documentation_linkPointing users at help contentA view element linking to documentation rather than an interactive walkthrough
XML header buttonsOrdinary record actionsDeclared per view with their own strings and methods; no access to the tour service

Nothing else in core launches tours from a record. The alternatives below are the neighboring patterns people actually mix this up with: action buttons defined in XML, and clipboard-style char widgets that also ignore normal char rendering.

Frequently asked questions

What is the difference between the Onboarding and Testing buttons?+
Same tour, different mode. Onboarding starts the tour in manual mode, the pointer guides and waits for the user. Testing starts it in auto mode: the engine performs every step itself with a 250 millisecond pointer flash, which is how you smoke-test a flow. In Odoo 18 automated runs also paused 500 milliseconds between steps; 19 removed that delay.
Which fields does tour_start_widget read from the record?+
Four, with no declared dependencies: name, url, custom and rainbow_man_message. The view must load them itself, which is why core's Tours list carries rainbow_man_message as an invisible column with the comment "Invisible to get the data in JS".
Why is the widget on the name field if it never shows the name?+
It needs to sit on some field to exist in the view, and name is the natural host. The template renders only the two buttons; the char value is ignored entirely. Core's list even places name twice, once as a normal column and once as this widget with an empty label.
What does the link option do, and should I use it?+
It switches both buttons from solid to link styling; core uses it in the Tours list. It is undocumented, extractProps-only, and the Odoo 20 development branch deletes it in favor of automatic view-type detection, so treat it as 18 and 19 only.
Do inherited char options like placeholder work here?+
No. The descriptor spreads the char field but replaces its extractProps with one returning only link, so placeholder, password and dynamic placeholder are silently dead, even though declarations-based tooling still lists placeholder_field as supported.
Can I use automated tours as regression tests after upgrades?+
Yes, that is precisely what Testing mode is for: recorded or coded tours replay real flows in the browser. Keep them on staging data, since steps genuinely create and modify records, and re-record tours whose flows change between versions.

Onboarding tours for your own Odoo processes?

Recorded walkthroughs cut new-hire questions and double as upgrade smoke tests, but only when the tours mirror your real flows. We script and record guided tours for custom Odoo processes on 18 and 19, cleanup steps included.

Get guided tours built

How this page was produced

Verified by reading tour_start.js and tour_start.xml in the Odoo 19.0 web_tour module, the web_tour.tour model definition for the fields the widget consumes, and both view usages including core's invisible-column comment. The 18 comparison (stepDelay) and the Odoo 20 findings (link option removal) come from diffing the same file across branches. Both buttons were exercised on a clean Odoo 19 database with developer mode on, where the screenshot was captured. Corrections welcome via our contact page.