Skip to main content
iVentureTeam

signature

The Sign button on Odoo delivery orders is the signature view widget: a button that opens the drawing dialog and writes the image straight into a binary field. Not to be confused with the field widget that shares its name.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 26, 2026Updated August 26, 20265 min read
Technical namesignature
Viewsform (view widget, element, typically in the header)
Also registered assignature in the fields registry is a different component (the drawing pad field widget)
Moduleweb, present in every Odoo database
Used in core2 occurrences in stock: the Sign button on outgoing deliveries, before and after Done
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupPartial. Studio's Signature field adds the field widget; this Sign button variant is XML-only
Alternativesbinary, image, attach_document

What the signature widget does

Odoo has two things called signature, and this page covers the view widget: a header button labeled Sign that opens the standard signature dialog and saves the drawing into a binary field of the current record. It is how a warehouse operator captures a customer's signature on an outgoing delivery.

The other signature lives in the fields registry, the drawing pad you get with <field name="signature" widget="signature"/>, which renders inline and follows normal field editing. The two share a name and a dialog but nothing else: this one is a <widget> element, holds no value, and decides for itself how the image is stored.

What this means for your team

Signature capture is usually about proof: proof of delivery, proof of handover, proof that an inspection happened. Putting the Sign button in the form header makes the capture a one-click step at the moment of truth, on a tablet at the customer's door in the core scenario, and the image lands on the record itself where reports like the delivery slip can print it.

The full_name attribute matters for defensibility. Pointed at the partner field, it stamps the signer's name into the signature block, so the printed document shows who signed rather than an anonymous scribble. Teams using deliveries, rentals, equipment handovers or visitor logs get a legally cleaner document for the cost of one attribute.

Supported options in Odoo 19

A view widget takes attributes on the element, not an options dictionary. All four verified in signature.js, Odoo 19.0 web module.

OptionTypeWhat it does
stringstring (attribute)The button label, Sign in core. Required by the component's props.
signature_fieldstring (attribute)Name of the binary field on the model that receives the image. The field does not need to be present in the view; the widget writes it directly.(default: signature)
full_namestring (attribute)Field whose value seeds the signature name block: display_name for a many2one, the raw value otherwise. An empty value leaves the dialog's default name.
highlightboolean (attribute)Renders the button as btn-primary instead of btn-secondary. Core highlights Sign once the delivery is done.(default: false)

The write bypasses the form. Confirming the dialog runs orm.write on the target field and then reloads the record. Unsaved edits elsewhere on the form are untouched but the signature itself never passes through onchange logic, and on a record that does not exist yet there is nothing to write to, which is why core guards every usage with invisible="not id".

Working examples

Core's delivery Sign button

<widget name="signature" string="Sign" highlight="1"
        full_name="partner_id"
        invisible="not id or picking_type_code != 'outgoing' or state != 'done' or is_signed"
        groups="stock.group_stock_sign_delivery"/>

From stock_picking_views.xml. Highlighted once the delivery is done, plain before; both write into the picking's default signature field.

Signing into a custom field

<widget name="signature" string="Sign Inspection"
        signature_field="inspector_signature"
        full_name="inspector_id"
        invisible="not id"/>

inspector_signature must be a binary field on the model; it does not need to be in the view.

Hardcoded dialog, dead defaultFont, direct write

Three source-level details separate this widget from its field namesake. First, the dialog configuration is hardcoded: draw mode, a 3:1 display ratio, and noInputName, so the signer cannot switch to the typed-font or upload modes that the field widget offers. The name seeding is the only flexible part: with full_name set, a many2one contributes its display_name and any other field its raw value.

Second, there is a genuine piece of dead code. The 19 source assigns nameAndSignatureProps.defaultFont = this.props.defaultFont, but defaultFont is neither declared in the widget's props nor produced by extractProps, so it is always undefined. The development branch declares the prop, yet still never extracts it from XML, so as of now the default font remains unsettable from a view in every version.

Third, the save path: orm.write followed by record.load() and a model notify. That makes the signature durable even if the user then discards the form, a surprise if you expected discard to undo it, and it is why the widget shows nothing useful on unsaved records.

Version compatibility

VersionStatusNotes
Odoo 20.0VerifiedNot released. Owl props migration; defaultFont declared but still not settable from XML; see below.
Odoo 19.0VerifiedVerified against the shipped source. Reads relational names via display_name.
Odoo 18.0VerifiedSame attributes; relational names still read as value[1] tuples internally.
Odoo 17.0VerifiedSame attributes and flow. No XML changes needed.
Odoo 16.0VerifiedSame widget in the older class-property style, alongside the then-jSignature stack.

Upgrade note. View XML for this widget is stable from 16 through 19. Only JavaScript patches need attention: 18 and earlier read relational display names as value[1] tuples, while 19 reads display_name, a change that ripples through any patch touching full_name handling.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We read the widget's file on the public development branch at the time of writing; the branch is unstable and this page will be re-verified after release.

No XML-visible changes. The component migrates to the Owl typed-props syntax and finally declares the defaultFont prop, but extractProps is unchanged, so the new prop still cannot be set from a view. Attributes, dialog behavior and the direct-write flow are identical to 19.

Common problems and fixes

SymptomCause and fix
The Sign button is missingCore gates it with invisible="not id ..." and a security group; new records and non-members see nothing. Save the record first and check membership of the gating group, stock.group_stock_sign_delivery on deliveries.
Signature saved into the wrong place, or an error on confirmsignature_field defaults to a field literally named signature, which your model may not have. Set signature_field to the actual binary field name on the model.
The signer's name is empty in the dialogfull_name is unset, or points at a field whose value is empty on this record. Point full_name at a filled field; many2one fields contribute their display name.
Discarding the form did not remove the signatureThe widget writes with a direct orm.write, outside the form's save and discard cycle. This is by design; deleting the signature means clearing the binary field explicitly.
Expected the type-or-upload signature modesThis widget hardcodes draw mode with no name input. Use the signature field widget on a binary field for the full three-mode pad.

Signature widget vs the alternatives

WidgetBest forKey difference
signatureA Sign button in the form header writing into a binary fieldView widget; draw-only dialog and a direct database write outside the form's save cycle
binaryStoring an already produced signature image as a filePlain file upload and download; no drawing dialog
imageDisplaying the captured signature on the formRenders the binary as an image; pair it with this widget to show what was signed
attach_documentUploading supporting documents instead of capturing a signatureUploads to ir.attachment and can call a processing method

The split is simple: use this view widget for a sign-this-record button in the header, and the signature field widget when the pad should sit inline in the form as an editable field.

Frequently asked questions

What is the difference between widget="signature" on a field and the signature view widget?+
Two different components sharing one name. On a <field>, the fields-registry widget renders an inline drawing pad bound to that binary field with normal save semantics. The <widget name="signature"> element covered here is a header button that opens a dialog and writes the image itself.
Which field receives the drawing?+
The one named by signature_field, defaulting to a field called signature. It must be a binary field on the model, but it does not need to appear in the view.
Why does core hide the button until the record is saved?+
The confirm handler writes with orm.write on the record's id. Without an id there is nothing to write to, so every core usage carries invisible="not id".
Can the signer type their signature instead of drawing?+
Not from this widget; it opens the dialog in draw mode with the name input hidden. The inline signature field widget offers draw, type and upload modes.
How do I print the captured signature on a report?+
The image is a normal binary field, so a QWeb report renders it like any image field. Core's delivery slip does exactly that with the picking's signature and the partner name.
Can I set the signature font from XML?+
No. The 19 source assigns a defaultFont prop that is never declared or extracted, dead code, and while Odoo 20 declares the prop, nothing fills it from view attributes either.

Need signatures captured at the right moment in your flow?

Proof of delivery, equipment handovers, inspection sign-offs: we place signature capture exactly where your process needs it, wire the image into reports, and keep the legal trail clean. It is the kind of focused Odoo customization we ship every month.

Get your signature flow built

How this page was produced

Attributes, dialog configuration and the write path were read from signature.js and its template in the Odoo 19.0 web module, compared against 16.0 through 18.0 and the development branch, and both core usages were verified in stock_picking_views.xml. Spotted an error? Tell us and we will correct the page.