POS Cashier Shift Control
Purpose
POS Cashier Shift Control records who is responsible for the cash drawer during each part of a native Odoo POS session. It captures an opening float, outgoing and incoming physical counts, handover decisions, cash adjustments and attribution exceptions. The native POS session remains the accounting boundary.
This guide is based on the Odoo 19 source for addon version 19.0.1.0.1. It is a source review, not a completed installation or browser test.
Watch the demonstration video linked by the module's Live Test setting. This destination is a video, not an interactive demo database. View the Odoo 19 purchase listing.
Prerequisites and dependencies
- An Odoo deployment that permits custom addons: Odoo.sh or private/on-premise hosting. The module README excludes Odoo Online and describes Community and Enterprise use where the dependencies are available.
- Native Point of Sale (
point_of_sale) and employee/cashier support (pos_hr). The manifest also requires the Python packagexlsxwriterfor XLSX export. - A configured POS, cash payment method, allowed cashier employees and a separate manager who can review handovers without being either cashier involved.
- An open native POS session and an online connection for authentication, opening counts, handovers, adjustments, manager decisions, final counts and emergency takeover.
Install the addon through your normal deployment process and complete the fictional test below in a test database before enabling it in an operating store.
Access roles
| Role | What the role does |
|---|---|
| Allowed cashier | Authenticates in the POS, opens their shift, counts each cash method, requests a handover or adjustment, and submits their final count. The named incoming cashier accepts a handover. |
| Manager for POS drawer actions | An allowed employee in the POS advanced employee list, or an allowed employee whose linked user has POS Manager rights, can perform manager actions after authentication. A handover reviewer must be different from both the outgoing and incoming cashier. |
| Odoo user with POS Manager access | Uses the backend shift/handover queues, difference analysis, cash adjustments, exception resolution, X reports and exports within the user's allowed companies. |
Backend record access for ordinary POS users is limited to their linked employee's records and handovers involving that employee. Backend expected cash, outgoing/incoming/final count totals and difference totals are manager-restricted. Drawer actions occur in the POS dialog; backend shift and handover forms display the resulting audit records and disable direct creation, editing and deletion.
Setup and menus
As a POS manager, open the participating POS configuration form from Point of Sale → Configuration and find Cashier Shift Control.
- Enable Cashier Shift Control for this POS.
- Set Handover Difference Tolerance in the POS currency. It cannot be negative; zero requires the incoming total to match expected cash at the currency's precision for automatic acceptance.
- Keep Blind Cash Counts enabled to hide expected cash from ordinary cashiers while a shift is open or awaiting acceptance. Managers can see expected cash.
- If using Count by Denomination, set Cash Denominations to the correct comma-separated positive values for this currency. Values must be numeric and unique. Otherwise, enter one physical total per cash payment method.
- Configure allowed cashier employees and the advanced employee list using the native POS employee settings. Confirm each employee belongs to the POS company and can authenticate.
In the POS product screen's additional controls, the module adds Cashier Shift. After a shift is loaded, the control can show the cashier name and state.
Manager backend menus are:
- Point of Sale → Orders → Cashier Shifts, Shift Handovers, Shift Exceptions and Cash Adjustments.
- Point of Sale → Reporting → Cashier Difference Analysis and Export Cashier Differences.
Numbered workflow
-
Authenticate and open the drawer shift. Select the correct cashier in the POS and open Cashier Shift. Enter their Cashier PIN and select Authenticate. A cashier linked to the signed-in Odoo user can leave the PIN blank. Authentication changes the dialog to the action screen; review it before selecting Confirm. With no active shift, enter the opening float for every cash payment method and confirm. The shift becomes Open.
-
Record normal POS activity. Continue normal POS sales, refunds and cash in/out operations. Supported attributed cash payments, refunds, cash movements and approved adjustments contribute to expected cash. Authenticate again when authorization expires or after switching cashier. Cash in/out requires the active cashier to be authorized on the shift's device.
-
Request a handover. The outgoing cashier opens Cashier Shift, authenticates if prompted, and selects Hand over drawer. Choose a different Incoming cashier, physically count every cash payment method, and confirm. The shift moves to Pending Acceptance. The outgoing count and expected snapshot are retained.
-
Accept as the named incoming cashier. Switch to that cashier, open Cashier Shift, authenticate, and enter an independent physical count for every cash method. Select Confirm. Automatic acceptance requires the incoming total to be within the configured tolerance of the expected snapshot and to match the outgoing total at currency precision. A mismatch between the two cashiers' totals requires review even when the difference from expected cash is within tolerance.
-
Resolve Manager Review when required. A separate authorized manager selects their cashier identity, opens Cashier Shift, and authenticates. In Manager Difference Review, enter a Manager decision reason. Confirm approves the handover; Reject rejects it. Approval closes the outgoing shift and opens a new shift for the incoming cashier using the incoming count as its opening float. Rejection marks the handover Rejected and reopens the outgoing shift. Approval and rejection occur in the POS dialog; the backend handover form displays the decision evidence.
-
Request and review an adjustment if needed. On their open shift, the cashier selects Request approved adjustment, chooses an Adjustment reason, enters a non-zero Signed adjustment amount, adds a useful note, and confirms. An independent manager can select Review pending adjustment in the POS manager actions, enter a decision reason and confirm or reject. Only approved adjustments affect expected cash; requesting an adjustment does not itself approve it.
-
End the last cashier shift. The active cashier selects Submit final count and end cashier shift, counts every cash method, and confirms. This records the final count and difference and closes the cashier shift. Then use native Odoo POS closing. Native session closing is blocked while a cashier shift remains open, pending acceptance or in manager review. The handover tolerance does not automatically route a final-count difference to manager review; managers must review final differences through the records and reports.
-
Review the audit results. A POS manager opens Cashier Shifts or Shift Handovers and reviews the relevant cashier, POS and session. Use Print X Report on a shift for an operational report. Use Cashier Difference Analysis for pivot/graph analysis, and Export Cashier Differences for CSV or XLSX with opening-date range and optional POS/cashier filters. Review Shift Exceptions for attribution issues. The X report does not close or post the native session and does not replace its closing report.
Safe fictional test scenario and expected results
Use a disposable test database with one cash method and no real customers, payments or outbound integrations. The values below are illustrative amounts in the POS currency. Use fictional employees Avery and Blair, plus independent manager Morgan. Enable blind counts and set tolerance to 0.00. No sale is needed for this first test.
| Step | Expected result from the reviewed source |
|---|---|
| Avery authenticates and opens a shift with 100.00. | One open cashier shift exists with opening float 100.00. |
| Avery requests handover to Blair and enters 100.00. | The shift awaits acceptance; the outgoing count is stored. |
| Blair authenticates, counts 100.00 and confirms. | The handover is accepted; Avery's shift closes; Blair's shift opens with 100.00. |
| Blair requests handover back to Avery with a count of 99.00; Avery also enters 99.00. | Expected cash remains 100.00 because there was no intervening cash activity. The 1.00 shortage exceeds zero tolerance and causes Manager Review. |
| Morgan authenticates, enters “Fictional shortage review” and approves. | Blair's shift closes, the accepted difference is -1.00, and Avery's next shift opens with 99.00. The manager decision is retained. |
| Avery submits a final count of 99.00. | The last shift closes with no difference for that shift, allowing the normal native session closing process to continue. |
Run the scenario yourself on the target release. These are expected results derived from the code; no runtime test was performed for this guide.
Troubleshooting
| Symptom | Check and next step |
|---|---|
| Cashier Shift control is missing. | Confirm the feature is enabled on this POS configuration. After installing or upgrading the addon, refresh the POS assets through your deployment procedure. |
| Cashier is not allowed, or authentication fails. | Check the selected employee, POS company, allowed employee configuration and PIN. Blank PIN authentication requires the employee to be linked to the signed-in Odoo user. |
| Authorization expired or is for another device. | Open the dialog and authenticate again on the authorized device. Switching cashier clears the loaded shift authorization. |
| “Count every cash payment method before continuing.” | Enter a physical count for every configured cash method, including zero where appropriate. Counts cannot be negative; denomination quantities must be valid. |
| Handover enters review despite a non-zero tolerance. | Compare the two cashiers' totals as well as expected cash. Different outgoing/incoming totals trigger review independently of the expected-cash tolerance. |
| Manager cannot review a handover. | Use an allowed manager who is neither the outgoing nor the incoming cashier, authenticate again and provide a decision reason. Backend reporting rights still require the POS Manager group. |
| Shift changed on another terminal. | Refresh the current state and review it before trying the intended action again. |
| Native POS session cannot close. | Complete pending acceptance or manager review, then have the active cashier submit and close the final count. |
| Late reconciliation or attribution exceptions appear. | A manager should inspect the shift and related order evidence. Late synchronized activity can change reconciliation totals without replacing an accepted count snapshot. |
For support, provide the addon version, Odoo version/edition, POS configuration, user role, connectivity state, reproduction steps and sanitized logs. Do not send cashier PINs or authorization tokens.
Limitations and version coverage
- The qualified release set supplied for this guide is Odoo 15, 16, 18, 19 and 20. Detailed source verification here covers Odoo 19 / addon 19.0.1.0.1 only. The other versions' screen labels, menus and behavior were not independently compared or tested.
- Counts, handovers, authentication, adjustments, decisions, final closure and emergency takeover require an online server connection. Native offline paid orders can synchronize later; this module does not provide an offline count or handover queue.
- Emergency takeover is a separate manager operation requiring a different incoming cashier, a physical count and a reason. The manager cannot approve a takeover involving their own shift, and the operation is restricted to the shift's authorized device. It is not part of the ordinary handover sequence above.
- Cash in/out movements and approved adjustments contribute to the first cash payment method in the shift calculation. The handover comparison uses the total across methods. Validate your operating procedure carefully when one POS has multiple cash drawers or cash methods.
- This module does not provide payroll/scheduling, bank-deposit reconciliation, cash-drawer hardware control, foreign-exchange gain/loss accounting, biometrics or a replacement for native POS accounting.
- Source-backed video and purchase destinations are provided above; availability, video playback, installation, reports and UI behavior were not tested during this review.
Interactive Live Test entry
Open the Odoo 19 Live Test selection. The catalogue entry and selection-link format were checked on 28 October 2026. No demo was launched and no customer workflow was tested for this guide. Review the selected module and Odoo version before continuing.