Skip to main content
iVentureTeam

account_file_uploader

The Upload action on the Accounting dashboard is a view widget: account_file_uploader. It files whatever you drop as attachments, then asks the journal to turn them into draft invoices or bills.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 25, 2026Updated August 25, 20265 min read
Technical nameaccount_file_uploader
Viewskanban (view widget, element on the journal dashboard)
Moduleaccount (Invoicing)
Used in core3 occurrences, all on the Accounting dashboard kanban in account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. Added in view XML; end users just use the Upload action it renders
Alternativesmany2many_binary, binary, Chatter attachments

What the account file uploader does

Digitizing incoming documents is the highest-traffic path into Odoo Accounting, and this widget is its front door. account_file_uploader renders an upload trigger, by default a plain Upload link, and handles everything after the file picker closes.

The flow it runs, verified in the source: every selected file is first created as an ir.attachment, stripped of any default_* keys from the surrounding context so the create cannot fail on unknown defaults. When the batch is complete, it calls create_document_from_attachment on account.journal with all attachment ids and opens the action the server returns, which lands you on the freshly created draft documents. Any per-file notices the server sends back are shown as sticky notifications, one per file.

Because it extends the account module's shared DocumentFileUploader component, the same machinery also powers the Upload buttons of the invoice list and kanban views; the widget documented here is the journal-dashboard incarnation that reads its journal from the kanban record.

What this means for your team

This is the workflow that decides whether accounts payable likes Odoo. Drop twenty supplier PDFs on the purchase journal and you get twenty draft vendor bills, each with its source document attached, ready for the OCR or AI digitization step to fill in amounts and partners. No manual encoding, no lost originals, a clean audit trail from file to posted move.

The journal awareness is the subtle part. The same widget on a sale journal creates customer invoices instead, and on a bank or miscellaneous journal it creates plain journal entries. Teams that understand this route documents by dropping them on the right card, which makes the dashboard itself the sorting desk.

Supported options in Odoo 19

As a view widget it takes attributes on the element, not an options dictionary. All three below are read in extractProps, verified in Odoo 19.0. It also declares fieldDependencies on id and type of the journal record, so those are loaded automatically wherever the widget is placed.

OptionTypeWhat it does
templatestring (attribute)QWeb template name rendered as the upload trigger. Replace it to restyle the whole toggler; your template receives btnClass and linkText and must re-add any group gating.(default: account.JournalUploadLink)
btnClassstring (attribute)CSS classes applied to the default link. Core passes file_upload_kanban_action_a on the sale card and btn btn-primary oe_kanban_action elsewhere.
titlestring (attribute)Text of the default link. Odoo 17 also read a linkText attribute; 18 and later read title only.(default: Upload)

The rendered link is group-gated. The default account.JournalUploadLink template wraps the anchor in groups="account.group_account_invoice", so users outside Billing see nothing at all. If you supply your own template via the template attribute, that gating is yours to re-add.

Working examples

The dashboard usage, verbatim from core

<widget name="account_file_uploader" title="Upload Invoices"
        btnClass="file_upload_kanban_action_a"/>

From the sale-journal card. The purchase and miscellaneous cards use the same element with btnClass="btn btn-primary oe_kanban_action" and the default Upload text.

A custom toggler template

<widget name="account_file_uploader"
        template="my_module.BigDropButton"/>

The template attribute replaces the whole toggler with your own QWeb template, which receives btnClass and linkText as props. This is how you turn the small link into a large drop target without touching the upload logic.

How one widget creates bills, invoices or entries

The context assembly explains the routing. getExtraContext reads the kanban record's data and returns default_journal_id set to the journal's id plus default_move_type computed from the journal type: sale becomes out_invoice, purchase becomes in_invoice, and everything else falls back to entry. That context rides along on the create_document_from_attachment call, which is why the same widget produces different document types per card. Outside a record, the widget still works, it simply sends no journal defaults and lets the server pick.

Two more details from the source: the attachments are created with a cleaned context, every key starting with default_ is filtered out before the ir.attachment create, a guard against dashboard contexts leaking invalid defaults into the attachment model. And the keyboard shortcut people associate with this feature, shift+i, belongs to the sibling account.AccountViewUploadButton template used by the invoice list and kanban toolbars, not to the dashboard widget itself.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Widget file unchanged; its base class is refactored. See below.
Odoo 19.0VerifiedVerified against the shipped source; byte-identical to 18.
Odoo 18.0VerifiedSplit into its own file with the DocumentFileUploader base; linkText attribute removed.
Odoo 17.0VerifiedLives inside bills_upload.js; additionally accepts the linkText attribute.
Odoo 16.0VerifiedLives inside bills_upload.js with the same registration and behavior.

Upgrade note. Odoo 17 also accepted a linkText attribute with a source TODO admitting it was not translatable; 18 removed it. Views that used linkText must switch to title when leaving 17. Everything else carries over unchanged from 16 through 19.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We read the widget and its base component on the public development branch at the time of writing; the branch is unstable and can still change before release.

account_file_uploader.js itself is byte-identical to 19. The shared base is refactored: DocumentFileUploader becomes a mixin-style AbstractDocumentFileUploader factory, attachment payloads switch from the datas key to raw, and the upload-complete context is rebuilt through new getters. XML usage is untouched; custom modules that extend the base class or patch onFileUploaded will need a review. We re-verify once Odoo 20 ships.

Common problems and fixes

SymptomCause and fix
The Upload link is missing for some usersThe default template is wrapped in the account.group_account_invoice group. Grant the user Billing access, or ship a custom template without the gate.
Documents come in as journal entries instead of billsThe widget sits on a journal whose type is neither sale nor purchase, so default_move_type falls back to entry. Drop the files on the purchase journal card, or set the journal type correctly.
Upload works but no digitization happensThe widget only creates draft moves with attachments; OCR or AI extraction is a separate service. Enable the digitization service, or pair the flow with a custom extraction step.
Custom template renders but nothing happens on clickThe replacement template does not trigger the FileUploader input the component wraps. Model your template on account.JournalUploadLink so the click reaches the file input.
shift+i does not trigger the dashboard widgetThat hotkey belongs to the invoice list's upload button template, a sibling component. Use the list or kanban view's Upload button for the keyboard path.

Account file uploader vs the alternatives

WidgetBest forKey difference
account_file_uploaderTurning dropped files into draft invoices, bills or entries from the journal dashboardA view widget that creates new documents; the journal's type decides what kind
many2many_binaryAttaching multiple files to the record being editedA field widget writing ir.attachment links; it never creates accounting documents
binaryOne file stored in a binary field on the recordStores file content in a field; no document creation, no journal context
Chatter attachmentsFiling reference documents on any recordAttaches without creating anything; the uploader widget exists precisely to go one step further

The distinction to keep straight: this widget creates new documents from files. Attaching files to an existing record is the job of the binary and many2many_binary field widgets, and the chatter's paperclip.

Frequently asked questions

Which document type does an upload create?+
It follows the journal under the widget: sale journals create customer invoices (out_invoice), purchase journals create vendor bills (in_invoice), and any other journal type creates a plain journal entry. The mapping is hardcoded in getExtraContext.
Can I upload several files at once?+
Yes. Each file becomes its own ir.attachment, and the server call receives the whole batch, creating one draft document per file before opening them for review.
Where does the original file end up?+
As an attachment linked to the created move, so the source PDF stays with the bill through validation and posting. The per-file notifications after upload report anything the server wants you to know.
Can I reuse this widget on my own model?+
Not directly: getResModel is hardcoded to account.journal, and the server method create_document_from_attachment must exist on the target. The pattern to copy is subclassing the shared DocumentFileUploader, which is exactly what the purchase module does for its own uploader.
Does the widget do the OCR itself?+
No. It creates the draft documents and attaches the files; extraction is done by Odoo's digitization service or a custom AI pipeline afterwards. The widget is the intake, not the reader.

Drowning in supplier PDFs every month end?

Upload is only the first step: the payoff comes when every dropped bill is read, coded and matched automatically. We build AI document processing pipelines on top of Odoo's intake flow, so accounts payable stops retyping invoices.

Book a free consultation

How this page was produced

Verified by reading account_file_uploader.js, the shared document_file_uploader.js and their QWeb templates in the Odoo 19.0 account module, plus the three dashboard usages in account_journal_dashboard_view.xml. History was checked against bills_upload.js on the 16.0 and 17.0 branches and the split files on 18.0; the Odoo 20 section comes from the public development branch. Spotted an error? Tell us and we will correct the page.