Cash Control and Session Closing in Odoo 20 POS

Every retail day in Odoo Point of Sale begins and ends with the same ritual: open a session, sell, then close the session with the cash drawer counted and the difference explained. That session is Odoo's unit of cash control — the boundary inside which every cash sale, refund, and drawer movement is expected to reconcile. The mechanics of opening counts, cash in/out with reasons, and the Closing Control screen are long-standing Odoo behaviour. What Odoo 20 changes is what happens around the close: a cleaner end-of-session accounting model, payment entries that no longer wait for the session to end, and a new, highly restrictive employee access level for staff who should sell but not be trusted with the drawer unsupervised.

The session is the unit of cash control

Cash control in Odoo POS is not a report you run afterwards; it is a property of the session itself. A session starts from the POS dashboard with New Session, which presents the Opening Cash Control screen before you click Open Session — the moment to confirm the float in the drawer before the first sale. Multiple users can be logged into the same session at the same time (a shared till with several cashiers, for example), but a session can only be opened once on the same browser.

From then on, the system tracks what the drawer should contain. The expected cash for a session is a simple ledger:

  • the opening balance you started with,
  • plus every payment taken with the cash payment method,
  • plus every recorded cash-in,
  • minus every recorded cash-out,
  • minus cash refunds paid out of the drawer.

If the physical drawer and that ledger disagree at closing time, the difference has a cause — and cash control exists to surface it the same day, while the cause can still be found.

During the session: cash in and cash out, with reasons

Drawers leak money through legitimate holes: a courier paid in cash, a cashier breaking a bill for change, a drop to the safe mid-shift. Odoo's answer is that no cash crosses the drawer's edge without a record. To add or remove cash, click the menu icon in the upper right corner of the POS screen and choose Cash In/Out. A pop-up lets you select Cash In or Cash Out, enter the amount and the reason, and confirm.

The reason field is the control. An unexplained difference at closing is a mystery; a cash-out recorded with the reason “paid delivery driver” is an explanation the system already holds, and it moves the expected balance so the count at close still reconciles. Stores that skip this step — cash out now, explain never — are the stores whose closing counts never match and whose staff stop trusting the numbers entirely. Make the reason mandatory in practice, even when it is a few words.

Closing control, step by step

To close, click the menu icon in the upper right corner and choose Close Session. That opens the Closing Control pop-up, which shows the session at a glance: the number of orders made and the total amount taken during the session, and the expected amounts grouped by payment method — cash, card, and any others in use.

For cash, the screen is a three-way comparison: what was expected, what you counted, and the difference. Counting is built in. Click the calculator icon on the cash row and a money-details pop-up opens where you enter the coins and bills actually in the drawer; it computes the total for you. Confirming sets that total in the Counted column and records the denomination breakdown in the session's Notes — useful evidence later, because “counted 412.35” plus the note showing forty ten-dollar bills is a much stronger record than a typed total nobody can reconstruct. Card and other non-cash methods have no physical count; their expected amounts are simply what the session processed.

Two ways out of the pop-up are worth knowing. Discard aborts the close and keeps the session selling — the right choice if you opened it by accident or the count looks wrong and you want to investigate first. The dropdown menu also offers Backend, which takes you to the back office without closing the session at all. When the amounts are controlled, clicking Close Session closes the session and returns you to the POS dashboard.

Odoo's own documentation gives the simplest piece of advice in this whole area: close your POS session at the end of each day. A session left open for a week mixes seven days of cashiers, floats, and mistakes into one unreconcilable number.

When the count doesn't match

A difference between expected and counted cash is handled in the open, not swept away. Depending on how the point of sale is set up, you may only be allowed to close a session when the expected cash revenue equals the counted cash. Where closing with a difference is permitted, Odoo presents a Payments Difference screen: you review the difference and click Ok to close anyway, with the difference recorded against the session rather than hidden. That record is what the back office works from afterwards — once a session is closed and posted, its report shows who initiated the session, every order it contains, and the employee who handled each one, so a difference can be traced to a shift, a cashier, and a set of orders.

In practice, work a difference in this order: recount the drawer with the money-details counter (most differences are counting errors), check that every cash-out during the day carries a reason and a matching amount, look for a refund paid in cash that was rung through as something else, and only then accept the difference and close. A small recurring difference in the same direction is a pattern worth investigating; a one-off is usually a busy hour.

What's new in Odoo 20 at the end of the session

The register workflow above is unchanged, but Odoo 20 reworks what closing produces in the accounting. At the end of the session, a global sale is now generated to simplify the accounting entries and remove the miscellaneous entries that POS closing used to scatter. More importantly for bookkeepers, payment journal entries are generated automatically at the time specified in the settings, without needing to end the session. Until now, the accounting for a day's card and other payments only materialised when someone closed the session, so a forgotten close meant missing entries; in Odoo 20 the payment entries land on schedule whether or not the till was closed on time. Cash control discipline still matters — the count still happens at close — but the books no longer depend on it to stay current.

The second change is about people. Employee access levels in the POS have been renamed, and a new, highly restrictive Supervised access level has been added. For cash control, that is the missing rung: junior staff can be put on a level designed for working under supervision, while opening counts, cash movements, and closing remain with the levels you actually trust. Access levels do not replace the closing ritual, but they decide who is allowed to perform each part of it.

Session-closing checklist

StepWhat to checkWhere in Odoo POS
1. Clear the registerNo open or parked orders left unvalidatedOrders overview in the POS interface
2. Record final cash movementsEvery cash in/out of the day entered, each with a reasonMenu (top right) → Cash In/Out
3. Open Closing ControlOrder count, session total, and expected amounts per payment method look saneMenu (top right) → Close Session
4. Count the drawerCoins and bills entered in the money-details counter; breakdown lands in the session NotesCalculator icon on the cash row
5. Compare expected vs countedDifference per payment method reviewed before closingClosing Control pop-up
6. Resolve or accept differencesRecount first; accept an explained difference explicitly if your setup allows itPayments Difference screen → Ok
7. Close the sessionSession closed; in Odoo 20 a global sale is generated and payment entries post on their configured scheduleClose Session button
8. Review afterwardsSession report checked: orders, totals, who opened the session and who handled each orderPOS dashboard card → Sessions

Habits that keep differences at zero

  • Close daily. The documentation's advice exists because multi-day sessions are where reconciliation goes to die.
  • Reason or it didn't happen. No cash leaves or enters the drawer without a Cash In/Out record and a reason.
  • Count with the counter, not from memory. The denomination breakdown in the session notes is your evidence if a difference is questioned later.
  • Match access levels to trust. Use Odoo 20's renamed levels — including the new Supervised level — so closing and cash movements sit with the right people.
  • Read the session report. After closing and posting, the report ties orders to employees; five minutes with it catches patterns no single count will.

Further reading

  • Odoo 20 Release Notes — end-of-session global sale, automatic payment journal entries, and the new Supervised employee access level in the Point of Sale section.
  • Point of Sale — Odoo documentation — starting a session, Cash In/Out, the Closing Control pop-up, and the session report.

Leave a Comment