Skip to main content
iVentureTeam

phone

Phone numbers in Odoo are plain char fields until the phone widget makes them callable: a tel: link in lists, a Call button on forms, and, courtesy of the sms module, an SMS button you can switch off.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 12, 2026Updated August 12, 20266 min read
Odoo 19 contact form showing the phone widget: an editable number with Call and SMS links beside it.
Studio namePhone
Technical namephone
Field typeschar
Viewsform (form.phone variant), list, kanban
Form variantform.phone, which keeps the input and adds the Call link
Moduleweb; the SMS button comes from the auto-installed sms module
Used in core21 occurrences across 10 modules, including hr, crm, hr_recruitment, event_booth, calendar, payment
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupYes, via Odoo Studio (Enterprise), including the Enable SMS toggle
Alternativesemail, url, sms_widget

What the Phone widget does

The phone widget turns a char field into a callable phone number. In readonly contexts, list rows and readonly forms, the whole value becomes an anchor with a tel: href, which desktops hand to a configured softphone and phones hand to the dialer. In edit mode on forms, the form.phone variant renders a text input plus a separate Call link so the number stays editable and callable at the same time.

A precise source detail: the href is built as tel: plus the value with every whitespace character removed, while the displayed text keeps the value exactly as typed. Users can format numbers for humans (+91 98765 43210) without breaking the link.

The input itself is type="tel", which mobile browsers answer with the numeric keypad. The widget performs no number validation and no formatting of its own in 19.0; what you type is what is stored.

What this means for your team

For any team that lives on the phone, sales, recruitment, field service dispatch, the difference between a text column and a tel link is measured in seconds per call and errors per day. No copying numbers into a dial pad, no misdials from misread digits.

The widget also plugs into telephony infrastructure. Because it emits standard tel: hrefs, whatever handles that protocol on the user's machine picks up the call: a VoIP softphone, a browser extension, or Odoo's own VoIP module in Enterprise. Pairing Odoo with an Asterisk or other PBX so that clicks dial through the company system is exactly the kind of integration we build.

The SMS side matters for volume workflows: order confirmations, interview reminders. The button next to every number makes ad hoc SMS a two-click action, and because it is an option (enable_sms), you can switch it off on screens where texting a customer would be wrong.

Setting it up in Odoo Studio (no code)

Studio documents this widget for Text fields.

  1. Open the form in Studio and select the field holding the number (a Text field).

  2. In the Properties tab, set Widget to Phone.

  3. Tick Enable SMS if the Send SMS action should appear next to the number (it is on by default).

  4. Click Close to leave Studio.

What Studio cannot do here

Studio exposes the widget and the SMS toggle, which in 19.0 is the entire option surface. What Studio cannot do is anything beyond the widget itself: number normalization on save, click-to-call through your PBX instead of the OS handler, or call logging back into the chatter. Those are server and integration work.

Supported options in Odoo 19

Verified against phone_field.js in the Odoo 19.0 web module, plus the patch in sms/static/src/components/phone_field/phone_field.js. The base widget declares one option; the second row below exists only when the sms module is installed, which it is on effectively every database because it is auto-installed.

OptionTypeWhat it does
placeholder_fieldfield nameReads the input's placeholder text from another char field on the record instead of a static placeholder attribute.(since Odoo 19.0)
enable_smsboolean<strong>Added by the sms module's patch, not the base widget.</strong> Shows the Send SMS button next to the number. On by default; set false to remove SMS from screens where it does not belong.(default: true)

enable_sms belongs to the sms module, not the base widget. Its default is true, so the SMS button appears everywhere unless you explicitly set options="{'enable_sms': false}". If the sms module were absent the option would simply be ignored.

Working examples

List view: clickable numbers

<field name="phone" widget="phone"/>

Each cell renders as a tel link; clicking hands the whitespace-stripped number to the OS.

Form without the SMS button

<field name="phone" widget="phone"
       options="{'enable_sms': false}"/>

Placeholder from another field

<field name="work_phone" widget="phone"
       options="{'placeholder_field': 'company_phone'}"/>

The empty input shows the company number as gray placeholder text, a 19.0 addition.

Where the SMS button actually comes from

Reading only phone_field.js in web, there is no SMS anywhere. The button arrives through a patch: the sms module imports the widget and extends it in place, adding the SendSMSButton component, an enableButton prop defaulting to true, and the enable_sms option that controls it. Both the base and the form.phone variant are patched.

This layering explains two things that otherwise look odd. First, why the option does not appear in the base widget's source: it genuinely is not there. Second, why the button exists on every database anyway: sms is flagged auto_install, so it is present unless someone deliberately removed it.

One more layer exists in Odoo Enterprise, where the VoIP module adds its own click-to-call handling on top of the same widget. That is out of scope for this Community-source page, but it is the same extension pattern: the base widget stays a clean tel link, and modules stack behavior onto it.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Adds formatted_field and dial_field, removes the form.phone registration; see below.
Odoo 19.0VerifiedVerified against the shipped source, including the sms module patch.
Odoo 18.0VerifiedIdentical behavior; only placeholder_field is missing (added in 19.0). Verified against the 18.0 source.

Upgrading from Odoo 18? The only option-level change: placeholder_field did not exist in 18.0; it was added in 19.0. Everything else, the tel href, the whitespace stripping, the form variant, the sms patch, is identical between the two versions.

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.

Two new options appear: formatted_field, naming a char field that holds a pre-formatted display version of the number, and dial_field, naming a char field whose value is used for the actual dial link instead of the displayed one. Store E.164 in the dial field, show a human format on screen.

The registration model changes. The separate form.phone registration is gone; a single phone registration decides internally to show its action buttons only on form views, and the buttons move into a dropdown component. XML using widget="phone" is unaffected; JavaScript patches targeting form.phone will break. The sms patch and its enable_sms option carry over. We re-verify after release.

Common problems and fixes

SymptomCause and fix
Clicking the number does nothing on desktopNo application is registered for the tel: protocol on the user's machine. Install or register a softphone (or the OS phone app) as the tel: handler; the widget only emits the link.
No SMS button next to the numberenable_sms is set to false on that field, or the sms module was removed. Drop the option or set it to true; check that the SMS gateway module is installed.
The dialed number is wrong but looks right on screenThe href strips whitespace only; other characters users type (letters, double zeros instead of +) are dialed as stored. Clean the stored values; the widget does not normalize numbers in 19.0.
Number is not clickable in edit modeThe input itself is never a link; on forms the separate Call link beside the input carries the tel: href. Use the Call link, or save the record and use the readonly link.
Keyboard shows letters instead of digits on mobileThe field is rendered without the widget, as a plain char input. Set widget="phone"; its input type tel triggers the numeric keypad.

Phone widget vs the alternatives

WidgetBest forKey difference
phonePhone numbers your team dials or textstel: link with whitespace-stripped href plus patched-in SMS action
emailEmail addresses with a mailto linkSame pattern, mailto instead of tel, envelope icon on forms
urlWeb links that open in a new tabPrefixes http:// and can display custom link text
sms_widgetComposing the SMS text itselfA text body widget with SMS character counting, not a number renderer

The choice is about what the value is, not how it looks. A number someone will dial: phone. An address someone will write to: email. A link someone will open: url. All three share the same pattern, readonly link plus form-variant input with an action beside it.

Frequently asked questions

How do I make phone numbers clickable in Odoo?+
Set widget="phone" on the char field in the view, or pick the Phone widget in Studio. Readonly values become tel: links; forms get a Call link beside the input.
How do I remove the SMS button?+
Set options="{'enable_sms': false}" on the field. The button is added by the sms module with a default of true, so it must be switched off explicitly per view.
Does Odoo validate or format phone numbers?+
Not in this widget. It stores exactly what is typed and only strips whitespace inside the tel: href. Normalization (E.164, country prefixes) is server-side work; the Odoo 20 branch adds a dial_field option to separate display and dial values.
Can Odoo call through our PBX when users click a number?+
The widget emits a standard tel: link, so anything registered for that protocol answers: a softphone connected to your PBX, a browser extension, or Odoo Enterprise's VoIP module which integrates the call into Odoo itself.
Why does the link dial a different string than what I see?+
By design the href is the stored value with whitespace removed, while the visible text keeps formatting. If the dialed number is wrong, the stored value contains more than formatting, and needs cleaning.
Is there a separate widget for mobile numbers?+
No. Any char field can use widget="phone"; core applies it to both phone and mobile fields across hr, crm and recruitment views.

Want click to call wired into your PBX?

tel: links are the easy half. We connect Odoo to Asterisk and other VoIP systems so calls dial through your lines, get logged on the customer record, and feed your follow-up activities, alongside SMS flows that respect consent. Telephony inside Odoo is one of our specialties.

Book a free consultation

How this page was produced

The option table was read from phone_field.js in the Odoo 19.0 web module and from the sms module patch file that adds enable_sms, including its default. The QWeb templates were read for the tel href and whitespace behavior. The same files were compared on the 18.0 branch and the development branch, which is where the dial_field and formatted_field additions and the form.phone removal were found. Spotted an error or a version difference? Tell us and we will correct the page.