Skip to main content
iVentureTeam

bill_upload_guide

The panel that offers three ways to get a bill into Odoo: upload a file, email it to an alias, or type one in.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 31, 20264 min read
Technical namebill_upload_guide
Viewskanban, list, form (view widget, <widget> element)
Moduleaccount, the Invoicing and Accounting apps
Used in coreThe vendor bills and customer invoices views in account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0
No-code setupNo. It is set in view XML and depends on module-specific data
Alternativesaccount_onboarding, purchase_file_uploader, attach_document

What the bill upload guide does

The first vendor bill is the hardest one, because the question is not how to fill the form but how bills are supposed to arrive at all. Odoo supports three answers: drop the file in, forward the email to an alias, or type it by hand.

This widget puts all three in one panel, at the point where someone is looking at an empty bill list. It embeds the shared document uploader for the first, surfaces the journal's alias for the second, and links to a blank form for the third.

It also offers a sample bill, but only after asking the server whether one is available.

What this means for your team

How bills arrive determines how much of accounts payable is manual forever. The email alias is usually the right answer for a business with recurring suppliers, because it removes the step where a human decides to upload something.

Setting the alias up is a small task that pays continuously, and the fact that this panel shows it prominently is a hint about how Odoo expects the process to work.

Supported options in Odoo 19

The widget accepts any props rather than a declared set, which the source notes is because it may receive view widget props. What it reads and derives is listed below. Read from the bill guide source, Odoo 19.0.

OptionTypeWhat it does
the journal recordoptional propWhen present, a full context is built. When absent, the search context is used instead.
the journal typefield read from the recordDerives the default document type: customer invoice, vendor bill or journal entry.
the aliasfield read from the recordShown only when an alias domain is configured on the journal.
the sample availability callserver methodAsked before the sample bill option is offered at all.

It behaves differently in two places. On a journal record it builds a full context including the document type derived from the journal. In a filtered list with no record, it falls back to the search context and only carries the journal through.

Working examples

Placing it

<widget name="bill_upload_guide"/>

No attributes. It adapts to whether a record is present.

The type it derives

sale      -> customer invoice
purchase  -> vendor bill
otherwise -> journal entry

From the journal's own type.

The alias

# shown only when the journal has an alias domain

Otherwise that path is hidden.

Two contexts, depending on where it sits

The setup work happens before the first render, and it splits on whether a record is available.

With a journal record, the widget builds a context naming the journal as the default, deriving the default document type from the journal's type, and setting the journal as the active record. That derivation is a three-way choice: a sales journal produces a customer invoice, a purchase journal a vendor bill, and anything else a plain journal entry.

Without a record, which happens when the panel sits in a filtered list rather than on a journal card, it falls back to the search context and carries only the active identifier through as the default journal. That is a narrower context, and it is why the panel offers slightly less in that position.

The alias is read from the journal and only surfaced when an alias domain is configured, so an unconfigured database does not advertise an address that does not work.

Finally, the sample bill option is gated behind a server call asking whether a sample is available, which keeps the offer out of databases where it would fail.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Reworked alongside the accounting onboarding changes.
Odoo 19.0VerifiedVerified against the shipped source.
Odoo 18.0VerifiedSame three paths.
Odoo 17.0VerifiedSame three paths with older component conventions.
Odoo 16.0Not availableWidget does not exist in this form.

Upgrade note. Present since Odoo 17. The three paths have been stable across those versions, though the sample bill check and the alias display were refined.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this may still change; we re-verify this page after the release.

Reworked. The development branch changes the component alongside the wider accounting onboarding rework. The three paths, upload, email and manual, are what to expect to survive.

Common problems and fixes

SymptomCause and fix
No email address is shownThe journal has no alias domain configured. Configure the alias domain in accounting settings.
The wrong document type opensThe type is derived from the journal's own type. Open the panel from the correct journal.
The sample option is missingThe server reported no sample is available. Expected in databases where sample data was not installed.
The panel offers less in a list viewWith no journal record it falls back to a narrower search context. Open it from a journal card for the full context.
Uploading does nothingThe embedded uploader needs the context that setup builds. Check the journal is resolvable from the record or the search context.
Props warnings in the consoleThe component accepts any props deliberately. Expected; the source notes it may receive view widget props.

Bill upload guide vs the alternatives

WidgetBest forKey difference
bill_upload_guideShowing a team the three ways bills can arrive in OdooAdapts its context to whether it sits on a journal or in a filtered list
account_onboardingThe accounting setup checklistSteps rather than upload paths
purchase_file_uploaderUploading against a purchase orderA single upload path, no guidance
attach_documentAttaching a file to a recordAn action rather than a guide

The document uploader on its own gives the upload path without the guidance, which is right once the team knows the process. This panel exists for the period before that.

Frequently asked questions

Why does the panel behave differently in different views?+
With a journal record it builds a full context including the document type; without one it falls back to the search context and only carries the journal through.
Why is no email address shown?+
The alias is only surfaced when an alias domain is configured on the journal, so an unconfigured database does not advertise an address that would not work.
How is the document type chosen?+
From the journal's type: a sales journal offers a customer invoice, a purchase journal a vendor bill, and anything else a plain journal entry.
Why is the sample bill sometimes missing?+
The widget asks the server whether a sample is available before offering it, which keeps the option out of databases where it would fail.
Why does it accept any props?+
The source notes it may receive view widget props, so the declaration is deliberately open rather than a fixed set.

Accounts payable that runs itself

Email aliases, document capture and approval rules turn bill entry from a daily task into an exception queue. We implement Odoo Accounting and automate what arrives, on versions 16 through 19.

Book a free consultation

How this page was produced

The two context branches, the three-way document type derivation from the journal type, the alias display condition, the sample availability server call and the open props declaration were read from the bill guide source on the Odoo 19.0 branch. Version coverage comes from comparing the file across the 17.0 and 18.0 branches and its absence on 16.0, plus a comparison against the public development branch. Spotted an error? Tell us and we will correct the page.