Home / Help Center / pos-app / Admin / Shift Management
🕒 Admin

Shift Management

Shift Management tracks a cashier's till from the moment they declare an opening float to the moment they count and close the drawer, so every rupee that goes in or out during a shift is accounted for.

📍 Menu path: Admin → Shift Management
👤 Who uses it: Cashiers and Managers open/close their own till shift; Admin can review any shift — requires the Advanced plan tier or above
🏷️ Plan tier: advanced+

Overview

A "shift" begins when a cashier opens the till with a declared opening cash float and ends when they close it and count the actual cash in the drawer. In between, the system silently tracks every sale, payment method and any cash removed from the drawer.

This page always shows the state of the currently selected store + terminal combination. If no shift is open on that terminal, you see an "Open Shift" prompt; once one is open, you see live totals, quick actions and a payment-method breakdown.

Because this is a till-based workflow, it is scoped per terminal — a shop with three checkout counters runs three independent shifts side by side, each with its own float, sales and expected cash.

Before You Start

Step-by-Step Guide

1 Open a shift at the start of the day

Every cashier should open a shift before ringing up the first sale so cash reconciliation is accurate at closing time.

  1. If no shift is active, click Open Shift on the empty-state card.
  2. Enter the Opening Float — the cash you are starting the drawer with (e.g. change for the day).
  3. Optionally add a note (e.g. "Counted by Rajesh, 2x ₹500 short due to no change available").
  4. Click Open. The page switches to the live shift view with four stat cards: Shift Duration, Total Sales, Transactions, and Expected Cash.

2 Record a cash drop mid-shift

Use a cash drop whenever cash is removed from the drawer before closing — for a bank deposit, a safe deposit, or paying out an expense — so the "Expected Cash" figure stays accurate.

  1. Click Record Cash Drop under Actions.
  2. Enter the Amount removed from the drawer.
  3. Choose a Reason: Safe Deposit, Bank Deposit, Payout, or Other.
  4. Add optional notes, then submit. The drop is immediately reflected in the shift's expected cash calculation.

3 Generate an X report mid-shift

  1. Click Generate X Report at any time during an open shift.
  2. An X report is a read-only snapshot of sales so far — it does not close or reset the shift, so you can pull one any number of times during the day (e.g. for a manager spot-check).

4 Close the shift and generate a Z report

Closing a shift is a one-way action — once closed, a new shift must be opened for further sales on that terminal.

  1. Click Close Shift.
  2. Physically count the cash in the drawer and enter it as Actual Cash Count.
  3. The dialog shows an Over (green) or Short (red) amount — the difference between what you counted and the system's Expected Cash.
  4. If there is a variance, use Close Notes to explain it (e.g. "₹40 short — customer given wrong change").
  5. Click Close & Generate Z Report. The Z report is the final, permanent summary of the shift and cannot be edited afterward.
💡 Over/short amounts are calculated as Actual Cash − Expected Cash, so a positive number means you have more cash than expected, and a negative (short) number means less.

Every Field & Button, Explained

Field / ButtonWhat it does
Opening FloatCash amount the drawer starts with when the shift opens; required before a shift can be opened.
Shift DurationLive-updating hours and minutes since the shift was opened.
Total SalesSum of all sales rung up on this terminal during the current open shift.
TransactionsCount of completed sales during the current shift.
Expected CashOpening float + cash sales − any recorded cash drops; this is what the drawer should physically contain at any moment.
Record Cash DropOpens a dialog to log cash removed from the drawer mid-shift, with Amount, Reason (Safe Deposit / Bank Deposit / Payout / Other) and Notes.
Generate X ReportProduces a non-destructive, repeatable snapshot report of the shift's sales so far — does not close the shift.
Close ShiftOpens the closing dialog where you enter the counted cash and permanently end the shift with a Z report.
Actual Cash CountThe cash you physically counted in the drawer at close time — compared against Expected Cash to compute over/short.
Over / Short indicatorLive-calculated difference (Actual − Expected) shown in green (over) or red (short) as soon as you type an actual cash amount.
Close NotesFree-text explanation for any cash variance found at closing — useful for later audits.
Payment BreakdownFour cards showing Cash, Card, UPI and Other sales totals collected during the current shift.
RefreshRe-fetches the active shift's live totals without closing or reopening it.

Tips & Best Practices

Troubleshooting & FAQ

I can't open a new shift on this terminal.
Only one shift can be open per terminal at a time. Check whether a previous shift was left open (perhaps from a shift the cashier forgot to close) and close it first.
The "Expected Cash" figure looks wrong.
Expected Cash = Opening Float + Cash Sales − Cash Drops. If a cash drop was not logged through this page (e.g. cash removed informally), the figure will not reflect reality — always log drops here.
Can I edit or reopen a shift after closing it?
No — closing a shift is final and generates a permanent Z report. If a mistake was made, document it in a note on the next shift or via the Audit Log rather than trying to reopen it.
Why don't I see this page in the sidebar?
Shift Management requires the Advanced plan tier or above. On the Free or Basic plan this menu item is hidden entirely rather than shown disabled.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/ShiftManagementPage.jsx

Backend endpoints used:

  • GET /shifts/active?terminalId=&storeId=
  • POST /shifts/open
  • POST /shifts/:id/cash-drop
  • POST /shifts/:id/close
  • GET /shifts/:id/x-report

Related tables (db-core repositories):

  • Shift (best-effort — shift open/close, opening float, expected/actual cash)
  • ShiftCashDrop (best-effort)

Redux slices:

  • auth (selectedStoreId, selectedTerminalId, user)

Feature flag key: billing (requires advanced plan tier or above)

A 404 from GET /shifts/active is treated as "no active shift" rather than an error. Cash-drop and close amounts are parsed with parseFloat client-side before being posted; server-side validation of the shift totals happens in the shifts controller.