
“How much do we actually still owe you?” Every customer base asks this question regularly, usually shortly before the end of the quarter, before the annual audit, or when the customer’s accounts department is preparing payments. If you don’t answer it yourself, it reaches you by email or phone, and someone has to export an open items list from the accounting system and send it. Odoo 19 Community doesn’t do this out of the box: the customer portal does show individual invoices, but no list of the open items for the whole company, and certainly not as of a freely chosen date.
So we wrote the module Open Items in the Customer Portal (portal_open_items) for Odoo 19. Customers who have been given access see a list in the portal of all open invoices, credit notes and unallocated payments for their company, can choose an as-of date, can download the list as a PDF and see at a glance how their payment discipline stands. The module is free software under the AGPL-3 licence and is on GitHub:
github.com/Alex0176/odoo-portal-open-items
We installed the module on our production system on 5 November 2026. There, the option is switched off by default and is only set after agreement with individual customers. Operating experience is therefore still short; we tested it with thirteen automated tests and a test database with sample customers. If you adopt the module, you should read the sections on as-of date calculation, payment discipline and limitations carefully.
Contents of this article
- The problem: open items lists on request
- The solution at a glance
- Release per contact: the option
- The list in the customer portal
- Open items as of an as-of date
- PDF export
- Payment discipline: the rating at a glance
- Who may see what? The access model
- Technical implementation
- Tests
- Installation and setup
- Limitations and notes
- Frequently asked questions
- Support from Biricon IT Services
The problem: open items lists on request
An open items list shows which of a customer’s invoices are still unpaid, how much of that is overdue and what the balance is. For the supplier, it is a tool for liquidity planning and dunning. For the customer, it is the basis for planning payments, reconciling invoices with their own accounts and clearing up queries without opening each invoice individually. Typical occasions:
- Quarter-end and year-end closing: The customer’s accounts department wants to know which liabilities existed on 31.12. This is an as-of date in the past.
- Reconciliation: The customer believes they have paid an invoice, while we still see it as open. A shared list with date, due date and amount settles this faster than an email chain.
- Payment runs: Anyone who prepares payments weekly or monthly needs all of a supplier’s open invoices at a glance, with the overdue ones at the top.
- Several contacts: In a company, one person orders and another pays. The open items belong to the company, not to an individual person.
Until now, we pulled these lists from the accounting system by hand and sent them by email. That takes time and ends up as a snapshot that is out of date the next day. It is better to have a list that the customer can open in the portal themselves at any time, always showing the current position.
The solution at a glance
The module adds a page Open items to the Odoo customer portal, plus a tile on My Account. The scope of features:
- Option per contact: “Show open items in portal”. Only when it is set does the portal user see the tile and the page. It is switched off by default.
- Whole company: The list contains the open items of all the company’s contacts, not just those of the logged-in user.
- As-of date: The customer chooses a date and sees what was open on that day.
- PDF export: The list as a PDF in your company’s layout, with letterhead, balance and total of overdue items.
- Payment discipline: share of invoices paid on time, slightly late and late, the longest open invoice and a rating of good or poor, in the portal and in the PDF.
- Overdue items are highlighted in colour and show the number of days past the due date.
- Credit notes and credit balances appear in the list with a negative amount and reduce the balance.
- Linking: Each invoice in the list leads to the invoice view in the portal.
- Multilingual: The interface and the PDF follow the user’s language; a German translation is included.

The tile appears on the My Account home page next to orders and invoices. Anyone without the option does not see it.
Release per contact: the option
An open items list shows the business data of an entire company. That is why the module does not enable it for all portal users, but only where you explicitly want it. On the contact form, under Website, there is the checkbox “Show open items in portal”. It is visible to users with invoicing rights (group account.group_account_invoice) and applies to that one contact.

This fits how companies work in practice: in a company, management or the accounts department should see the list, while an employee who only looks at tickets should not. The option applies to the contact, but the items shown belong to the whole company. So set the option for the person who is meant to have an overview of the company.
The list in the customer portal
A click on the tile opens /my/open-items. The page shows the company name, the as-of date selector and the table of open items:

| Column | Content |
|---|---|
| Document | Document number of the invoice or credit note, linked to the invoice view in the portal; below it the reference, if there is one |
| Date | Invoice date or posting date, respectively |
| Due on | Due date; for overdue items, “n days overdue” below it in red |
| Amount | Original amount of the item |
| Open | Amount still open (after partial payments) |
Below the table are the balance, i.e. the sum of all open amounts, and the total of overdue items. Overdue rows are shaded in colour so that they stand out immediately at a glance. Credit notes and payments not yet allocated to an invoice appear with a negative sign and reduce the balance; a note below the table explains this to the customer. If your company works in several currencies, the balance is shown per currency.
Open items as of an as-of date
Above the table is “Open items as of date”, next to it a date field and the Show button. With an as-of date in the past, the list shows what was still unpaid on that day. This is exactly the report needed for closings, audits and reconciliations: “Which liabilities did we have to this supplier as of 31.12.?”

How the as-of date is calculated
For each item: open as of the as-of date = invoice amount minus all payments that had been reconciled up to and including the as-of date. An item belongs on the list if it had already been posted on the as-of date and still had a remainder at that point. An invoice dated 7 September for 1.250,50 €, partly paid with 500,00 € on 20 October and settled with the remainder on 5 November, therefore appears on the list with 750,50 € for an as-of date of 2 November and no longer appears at all for an as-of date of 5 November.

Overdue status is likewise assessed as of the as-of date: an item is overdue if its due date is before the as-of date and the remainder is positive. The days past due are counted up to the as-of date, not up to today. An as-of date in the future is treated as today, as is an empty or invalid date in the address bar. The list therefore cannot feign a forecast.
What “date of payment” means here
What counts is the date on which the invoice and the payment were reconciled with each other in Odoo (the later of the two posting dates), not the invoice date. This is the usual case: the payment is posted on the day it is received and allocated to the invoice. If you allocate payments only days later, the invoice correspondingly appears as open for longer. The section limitations goes into this in more detail.
PDF export
Via Download PDF, the module generates the list as a PDF file for the selected as-of date. The Print button opens the same list in the browser’s print dialog. The PDF uses the document layout of your Odoo company (logo, address, footer from the settings) and the European paper format:

- Heading with as-of date: “Open items as of 02.11.2026”, even if the as-of date is today. If there are no open items, it says “There are no open items.”
- The customer’s address in the address field of the company layout, so that the list also fits the matter when printed out.
- Overdue items in bold, so that they stand out even in black-and-white printing.
- Balance and total of overdue items at the end of the table, per currency if there are several.
- File name with company and date, for example
Open_items_Muster_Handels_GmbH_2026-11-02.pdf.
Payment discipline: the rating at a glance
Since version 19.0.1.1.0, a short evaluation above the table shows how punctually the company pays its invoices. The same evaluation appears in the PDF. This lets customers see for themselves where they stand, and you no longer have to explain it to them separately.

- Green: “47 % were paid within the payment period.” This refers to invoices paid on the due date or earlier.
- Orange: “29 % were paid in the week after the payment period expired.” These are payments one to seven days after the due date.
- Red: “24 % were paid later, on average after 39 days (25 days after the payment period expired).” The first number counts from the invoice date, the number in brackets from the due date. The line appears only if there are such invoices.
- “Invoices are open for up to 60 days.” This is the age of the oldest invoice that is still open on the as-of date, counted from the invoice date.
Below that is the payment discipline rating: good or poor, and at the bottom of the page, in the PDF at the end of the page, the note “Customers with poor payment discipline are switched to prepayment.” The PDF shows the same lines in the letterhead layout:

What is counted
- Invoices are rated that were issued to the customer and posted. Credit notes and drafts do not count. With payment in instalments, each instalment counts separately.
- Period: the invoices of the last twelve months and all invoices that are still open, even if they are older.
- Payment day is the date of the last reconciliation with a payment, as with the as-of date.
- Open invoices: If an invoice is overdue on the as-of date, it counts as if it had been paid on the as-of date, that is, orange or red. An open invoice that is not yet due is not rated.
- With an as-of date in the past, the position on that day applies: payments after the as-of date do not count yet.
- If there is nothing to rate, it says “No invoices from the last 12 months to rate.” and there is no rating.
When is the payment discipline “good”?
The rating is good if at least 70 % of the invoices are green or orange (on time or at most one week late) and no open invoice is more than 30 days overdue. Otherwise it is poor. The thresholds (7 days, 70 %, 30 days, 12 months) are constants at the top of models/res_partner.py and can be adjusted there.
Important: the module does not switch anyone to prepayment. The note in the footer is fixed text that shows customers with a poor rating what may follow from it. Whether and when you decide that is up to you. If the sentence does not suit you, change it in the two templates (portal page and report) or in the translation.
Who may see what? The access model
Open items are sensitive data, which is why access mattered more to us than any additional feature. The model is deliberately simple:

- Only with the option set. Without the tick on the contact there is no tile, and a request to
/my/open-itemsredirects to My Account. - Always your own company. The company is determined from the logged-in user, not from a parameter in the address. There is no way to request another company via the address bar.
- The same check for the PDF. Odoo generally also provides PDF reports via a generic address. The module therefore checks again within the report itself: only users with accounting rights, or portal users with the option set for their own company, get a PDF; everyone else gets an access error.
- Posted items only. Drafts and cancelled documents never appear.
- Only your own accounting entities: Only entries of companies to which the user has access are taken into account.
Technical implementation
The module depends only on account and portal, i.e. on components of Odoo Community. It adds a single field to the contact and otherwise consists of a controller, a report class and templates.
| Component | Purpose |
|---|---|
Field portal_open_items on res.partner | Boolean option “Show open items in portal”, not copyable, off by default. |
_open_items_data() | Searches for the company’s posted, not yet reconciled receivable lines and calculates the remainder, overdue status and days for each line. Returns lines, totals per currency and the as-of date. |
_payment_morale() | Evaluates the invoices of the last twelve months and all open invoices as of the as-of date: shares paid on time, up to seven days late and later, average duration, longest open invoice and the rating good or poor. |
_open_items_residual() | Remainder of a line as of the as-of date: amount minus all partial reconciliations dated up to the as-of date, in the invoice currency. |
Controller /my/open-items | Shows the page, evaluates the as-of date (empty, invalid or in the future = today) and redirects to My Account if the option is not set. |
Controller /my/open-items/pdf | Generates the PDF with the same as-of date and delivers it with a file name. |
Report report_open_items | QWeb template in the company layout (web.external_layout) with its own permission check. |
| Portal templates | Tile on My Account, breadcrumbs, page with date form and table. |
| Contact form | Option in the Website section, visible only to the group account.group_account_invoice. |
| Translation | German (de.po) and template (.pot) are included. |
The open items are read from the journal items, not from the invoices. This matters: only this way do credit notes and not yet allocated payments also appear, and only this way can the position on an earlier day be reconstructed from the reconciliations (account.partial.reconcile). The query runs for the whole company (commercial_partner_id) with elevated rights; the check of whether the user may see it comes first.
Tests
The module comes with thirteen automated tests, which pass green on our system:
- access only with the option set, otherwise redirect to My Account,
- list contains the items of the whole company, but never those of another,
- the option applies per contact, not to all users of the company,
- credit notes appear in the list with a negative amount and reduce the balance,
- as-of date: an invoice paid later is on the list before that date, not after,
- page with a future date and with an invalid date,
- PDF address returns a PDF file,
- report as HTML and access check in the report,
- open amount as of the as-of date after partial payments before and after the as-of date,
- payment discipline: classification into on time, up to one week late and later, with the averages, also for an as-of date in the past,
- payment discipline with open invoices and the rating good or poor,
- payment discipline without invoices and never with another company’s data,
- payment discipline in the portal page and PDF.
In addition, we ran through the page in the browser in a test database with sample customers; the illustrations in this article come from there. All names, document numbers and amounts in them are entirely fictitious.
Installation and setup
git clone https://github.com/Alex0176/odoo-portal-open-items.git
ln -s /pfad/odoo-portal-open-items/portal_open_items /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i portal_open_items --stop-after-init
The dependencies are account and portal. After installation, the Odoo service must be restarted because the module contains Python code. If you run a production system, install the module on a copy of the database first. Then:
- open the contact who is to see the list (person with portal access),
- tick the checkbox Show open items in portal in the form and save,
- log in to the portal as this user, or check together with the customer: tile, list, as-of date and PDF.
Before enabling it, check your company’s sender and layout settings, because the PDF takes the logo, address and footer from the document layout. The module does not send any emails itself and does not create any notifications.
Limitations and notes
- Current state for posted documents. The as-of date is calculated from the postings as they stand in the system now. If an invoice was cancelled or reset to draft after the as-of date, the list does not show it. It is not an immutable snapshot “as it was printed back then”.
- Payments count from the day of reconciliation. If a payment is allocated only days after an invoice is received, the invoice stays on the list as open until then. If you want clean as-of-date reports, you should allocate payments promptly. Bank reconciliation against invoices is not included in Odoo Community; for that we use our Bank Statement Matcher module.
- Payment discipline is only as good as your reconciliation. What counts is when a payment was allocated to an invoice. Payments that have gone unreconciled for a long time make a customer look worse than they are. Check the rating for your customers before you draw any conclusions from it.
- The rating is visible to the customer. Anyone who has the option also sees the result and the note on prepayment. The module changes nothing about payment terms.
- Receivables only. The module shows what the customer owes you, not your liabilities towards the customer.
- No dunning levels and no payment link in the list. The customer can open an invoice from the list and pay it there, as your portal otherwise allows.
- PDF and multi-process operation. To generate PDF reports, Odoo internally calls its own web address. If your system runs with only one worker process, this can block. This applies to all PDF reports in the portal, not just to this module. Test the PDF button once under real conditions after installation.
- Tested on Odoo 19.0 Community only. We have not checked it for other versions.
- Not a substitute for dunning and account statements. The list replaces neither an accounting account statement nor your dunning processes; it merely makes the position transparent.
Frequently asked questions
What is an open items list?
A statement of all invoices that are not yet paid, or not paid in full, with invoice date, due date and open amount. It is also called “outstanding invoices”, “customer account” or “statement of account”, although a trial balance strictly speaking means the balances of all accounts.
Why doesn’t the Odoo portal show an open items list out of the box?
The portal shows orders, invoices and payments individually, with status and filters. An overall list for the company with a balance and an as-of date report are not part of the Community scope, as far as we have seen. That is what the module is for.
Do all portal users of a company see the list?
No. Only contacts with the option set. The list shown does cover the whole company, however, not just the invoices of that one contact.
Can I choose an as-of date in the past, for example 31.12. of the previous year?
Yes, any date up to today. The list then shows the items that were posted and not yet paid on that day. Note the notes on the calculation: what counts is the day the payment was reconciled.
Is an as-of date in the future supported?
No. Future dates are treated as today, so that the list does not show a position that does not exist yet.
Do credit notes and down payments appear in the list?
Yes. Credit notes and payments not yet allocated to an invoice appear in the list with a negative amount and reduce the balance. A note below the table explains this to the customer.
How are overdue items identified?
An item is overdue if its due date is before the as-of date and a positive remainder is still open. The days past due are counted up to the as-of date.
Is the PDF also available in other languages?
Yes, the interface and the PDF follow the user’s language. The German translation is included; for further languages, a .po file or translation via the Odoo interface is enough.
Can a customer see another company’s list by changing the address?
No. The company is always derived from the logged-in user. The address contains only the as-of date. Odoo’s PDF report address is also checked again within the report itself.
How is the payment discipline calculated?
From the posted customer invoices of the last twelve months and all open invoices. For each invoice, what counts is how many days after the due date it was paid: at most on the due date (green), up to seven days after (orange) or later (red). The rating is good with at least 70 % green or orange and no invoice that is open and more than 30 days overdue. The details are in the section payment discipline.
Does the module switch customers with poor payment discipline to prepayment?
No. It only shows the rating and the note. Payment terms, prepayment and blocks remain your decision and your process in Odoo.
Does the module send emails or reminders?
No. It only provides the page and the PDF. It does not create messages, notifications or activities.
Does the module work with Odoo Enterprise?
It depends only on account and portal, which exist in both editions. We have tested it only on the Community edition of Odoo 19.
What licence is the module under?
Under the AGPL-3. You may use, modify and distribute it as long as you comply with the licence terms. Bugs and suggestions for improvement are welcome as an issue in the GitHub repository .
Support from Biricon IT Services
We look after Odoo installations for small and medium-sized businesses: from implementation through customisations and migrations to day-to-day operation. If you want to provide your customers with open items, invoices and tickets in the portal, extend accounting in Odoo Community, or bring a module safely into your production instance, we will be glad to help. Further in-house developments: Archiving a company together with its portal users, Company register and address validation for Austrian customers, Document numbers from prefix, year and counter and Product sets in quotations as a section.
As of: 6 November 2026. Module version 19.0.1.1.1. Changes since the first version of 5 November: payment discipline (19.0.1.1.0) and correction of the open amount as of the as-of date after partial payments (19.0.1.1.1). All names, document numbers and amounts in the figures are fictitious.