Case studies / Tigg POS · Jun – Jul 2026
Count first, compare second
A POS session recorded a time and a person, but not money. I designed the cash layer for web and mobile and built the web frontend: an opening count, cash in and out with reasons, a blind closing count, and a required note when the drawer does not balance.
Role
Timeline
Team
Platform
Not mine
Measured outcome
the key decision
The cashier counts before seeing the expected amount, so the count is not biased toward the target.
how deep do you want to go?
A drawer with no record
A cashier opens a shop's cash drawer in the morning, takes orders all day, pays a supplier for milk out of the till, accepts cash from a regular who is settling last week's credit, and hands the counter over in the evening. At the end of the day the owner has one question: is the right amount of money in the drawer? If not, how much is missing, since when, and why?
Tigg POS could not answer any of it. It already had sessions. Earlier engineers built them in 2023: a person started a session at a location, sold things, and stopped it. But a session recorded a time and a person. It did not record money. There was no opening count and no record of cash taken out or put in. There was no closing count, and nothing to compare one against. When the drawer came up short, the difference had no owner, no timestamp and no explanation. In my own words from the time, shops had no record.
The job was to turn a stopwatch with a name on it into an accountable cash drawer: every session carries an opening count, cash in and out with reasons, a closing count checked against what should be there, and an explanation whenever the two don't match. And shops that don't want any of this shouldn't be slowed down by it.
My part, and the team's
As I remember it, the request came from sales and went to the CEO. The CEO planned the feature and asked me to ideate and design it. I am the only UI/UX designer at Tigg, and I usually work with the CEO and a senior frontend engineer, who both sometimes review my Figma files.
| Area | Who |
|---|---|
| Plan and priority | CEO |
| UX and UI, web and mobile | Me |
| Web frontend (the POS web app) | Me |
| Backend: storage, the expected-cash calculation, history | Backend engineer |
| Mobile app build | Mobile developer (I designed the screens; I didn't build the app) |
| Review and merge of my frontend work | Senior frontend engineer |
| Testing | QA |
The work followed Tigg's usual path from ticket and design through a "Ready for dev" handoff, development, QA and UAT to a production release. My first working version ran on 2 June 2026. The feature reached the production branch in the second half of June, and I kept refining it into mid-July.
What I knew, and how I knew it
I want to be precise here, because this part is thin.
- The brief. The CEO's plan, and conversations with him while I ideated. There was no written requirements document.
- Other products. I looked at the cash-session features of many other POS apps. I didn't write down which ones, so I won't name them as things I studied. Zoho is the product I usually look to for patterns.
- An internal demonstration with real equipment. We walked through the flow in the office with actual cash drawers and the counter hardware. It was a hardware walkthrough, not user research: nobody outside the team took part.
- Indirect signal. I hear about user problems from QA, support and the CEO. During the build, QA's follow-up list was the most concrete feedback I had.
There were no shop visits, interviews, usability tests or analytics. The design rests on the CEO's knowledge of the shops, the patterns other POS products share, and careful reasoning about money: what a number means, what "nothing" means, and who may change what.
The drawer as a ledger
Before drawing screens I wrote down how money moves through one drawer in one shift. Expected cash isn't a number the system should simply assert; it's a sum a manager should be able to re-add from top to bottom:
Expected cash = opening count + cash sales − cash refunds + credit collected in cash + cash in − cash out
Difference = counted cash − expected cash
Writing it as a ledger exposed three gaps a sales report hides:
- Cash that moves without a sale. Change top-ups, a supplier paid from the till, an owner taking money out. Without a record of these, no expected figure can be honest. So cash in and cash out became their own entries, each with a reason.
- Credit settled in cash. In Nepali shops customers often run a tab and pay it later. That cash is real, but it isn't a new sale. It needed its own row, and the backend engineer made sure credit collections reached the session report.
- Cash versus everything else. Shops take QR and wallet payments alongside cash. The drawer should only count what is physically in it, so the Cash Drawer card uses the cash share of sales, refunds and collections, and the other payment methods stay in the Transaction Summary.
Counting also had to fit Nepali money. The default denomination list is Rs 1,000, 500, 100, 50, 20, 10, 5, 2 and 1, in descending order, which is how a cashier counts. The less common Rs 25 and Rs 250 notes are not in the default, but a shop can add them in settings. That is why the list is editable rather than fixed.
Three things that change on their own
The first thing I had to get right was not a screen but a model. A session in this feature varies along three separate dimensions:
- Lifecycle: in progress, or closed.
- Cash result: balanced, short or excess. It exists only for closed sessions at locations that verify cash.
- Who is looking: the session's owner, an admin, or another member of staff.
It's tempting to merge the first two, so that "Closed" implies everything is fine. But a closed session is not necessarily a balanced one, and an owner reviewing last week wants exactly the closed sessions that came up short. So the list filter nests Balanced, Short and Excess under Closed, and only shows them when the location verifies cash. The third dimension decides what each person can do: the owner of a session and admins can record and correct cash; everyone else sees the record but can't change someone else's drawer.
With the dimensions separated, the states followed. Cash verification is a per-location setting called Require Cash Verification, a label the CEO chose. When it's on (internally we called this strict mode), the session has to be opened with a count and closed with one. When it's off (easy mode), start and close are one click each, and counts can still be added later if a shop wants them.
Count first, compare second
The closing flow is the heart of the feature, and the most important decision in it was deliberate from the start: the cashier counts before seeing the expected amount.
If the expected figure sits next to the input, the count is no longer independent. A tired cashier who counts Rs 17,280 and sees Rs 17,600 on screen has every reason to recount until the number agrees, or just type the target. I wanted to reduce that bias toward matching the expected amount. So closing has two phases. In the first, the cashier enters a total or counts by denomination, and nothing on screen says what the answer "should" be. Only after Submit Count does the system fetch the expected cash and show the review: expected, counted, the difference, and a plain-language status.
Asset to add
Figma export: file 'Tigg New Features', page '🟢 Session Management' — the close-session modal, count phase and the review in its short variant, side by side, 2x PNG
Here is one fictional session from its opening count to a close that comes up short. Step through it; every step is also listed below the panel.
One session, from opening count to a short close
Step 1 / 8
The cashier starts a session
At a location that verifies cash, starting a session opens the opening-count modal instead of starting straight away.
- Require Cash Verification
- On
- Opening cash
- Not entered yet
Arrow keys work too
All steps as a table
| # | State | What happens |
|---|---|---|
| 1 | No session | The cashier starts a session. At a location that verifies cash, starting a session opens the opening-count modal instead of starting straight away. |
| 2 | Open | Count what is already in the drawer. The cashier counts by denomination. The total updates as each row changes. Zero would be a valid answer here; a blank field would not. |
| 3 | Open | Money moves without a sale. The owner adds change for the day, and the cashier pays a supplier from the till. Each movement needs an amount above zero and a note. |
| 4 | Open | Sales, a refund and a credit payment. Only the cash share counts toward the drawer. QR and wallet payments appear in the Transaction Summary, not here. |
| 5 | Closing · Count | Count the drawer without a target. Closing starts with a count. The expected amount is not on screen, and there is no note field yet. |
| 6 | Closing · Review | The comparison appears. After Submit Count, the system fetches the expected amount and names the result in words, not only in colour. |
| 7 | Review · Short | An empty note blocks the close. The note label changes from optional to required. Pressing Close Session with it empty shows 'A note is required when the drawer is not balanced.' and scrolls to the field. |
| 8 | Closed · Short | A difference with an owner, a time and a reason. The session closes. The drawer card and the session list now show it as short, with the amount and the explanation beside it. |
The blind count has one honest limit. During an open session, the Cash Drawer card on the session detail does show the running expected cash, because people need to see the drawer build up. A cashier who wants the target can find it. The two-phase close removes the target from the moment of counting; it doesn't make the whole product blind.
Empty is not zero, and a mismatch needs a reason
Two small rules carry most of the feature's integrity.
Empty means forgotten; zero means no cash
A blank opening count and an opening count of zero look alike on a screen, but they mean different things. Blank means someone forgot to enter it: the value is unknown. Zero means someone checked and the drawer really was empty: the value is known. If the interface quietly turned a blank into 0, a forgotten count would look like an honest empty drawer, and every difference after it would be wrong.
So a balance field keeps a typed 0 visible and accepts it, and a blank field is rejected with "Enter an opening amount." A cash movement is different: it is an event, and a movement of zero didn't happen, so cash in and cash out need an amount above zero.
A note is required only when something is wrong
When the drawer is balanced, the closing note is optional. When it's short or over, the note is required, because a mismatch means something went wrong and the record should say what. The same logic applies wherever money changes without a sale: every cash in and cash out needs a note, and so does every edit to an opening or closing balance.
I didn't make the note required on every close. A note that is always mandatory soon becomes "ok" typed forty times a week, and then it carries no information. Asking only when the numbers disagree keeps the request rare, and so it is more likely to get a real answer.
Put the interruption where the money moves
At a location that verifies cash, what happens if a cashier tries to sell before entering an opening count? Something has to stop them. The question was where.
My first version of the check, on 9 June, sat at every entry point: the restaurant order page, the retail order page, quick orders and the payment calculator. It worked, but it could stop a cashier while they were still building an order, with a customer waiting, and it had to be kept consistent across four places. On 18 June I moved it to one place: the payment page. The page asks for the opening count when it loads, and again if the cashier presses Complete Order without one. I made the change for ease of use and a better experience at the counter. Order-building is never interrupted, and cash is asked about at the moment cash is about to be taken.
Moving the gate also meant the interrupted action had to survive the interruption. If a cashier presses Complete Order and is asked for the opening count first, saving that count should finish the order, not dump them back to press the button again. And cancelling the prompt should take them back to the order without a confusing "unsaved changes" warning. Both are small, but they decide whether the gate feels like a checkpoint or a trap. Chapter 14 describes a timing bug this exposed.
What I took out
Most of the decisive changes in this project removed something. I built each of these, used it, and replaced it.
- 2 Jun 2026A working prototype before the APIThe whole open, count and close flow ran in the browser, with settings kept locally, so the team could walk through it before the backend was ready.
- 8 Jun 2026Connected to the real APITwo separate Opening and Closing cards became one Cash Drawer card in ledger order. Drag-to-reorder and per-denomination checkboxes became a plain list sorted by value.
- 9 – 16 Jun 2026HardeningNotes required on cash movements, zero allowed on balances, history per movement, loading and error states, and fixes for bugs found in testing.
- 18 Jun 2026One gate, on the payment pageThe check moved from four order entry points to the payment page, for ease of use.
- 23 – 24 Jun 2026A second switch, removedAn 'Enable Cash Denominations' toggle was added and removed the next day as not necessary: denomination counting is available whenever the location has denominations configured.
- Jul 2026RefinementSettings are loaded only when someone is about to start a session, rather than for every location on screen.
The single ledger card was the change I'm happiest with in retrospect. Two cards, one per count, gave you two numbers and no explanation. One card that lists opening, cash sales, refunds, credit collection, cash in, cash out, expected, closing and difference, in that order, lets a manager re-add the column and see where a gap came from.
The settings label changed too. It began as "Strict Session Cash", became "Session Cash Management", and ended as Require Cash Verification, the CEO's choice, with the helper text "Require users to record opening and closing counted cash for each session." The final version names what staff will have to do, not the mode's internal name.
What shipped, and what isn't measured
Shipped: opening counts by total or by denomination; cash in and out with notes; the blind two-phase close; edits with a visible history; the Cash Drawer card; filtering sessions by cash result; the per-location setting with an editable denomination list; the payment-page gate; and an "Open 12+ hours" label for sessions left open. I designed web and mobile and built the web frontend; the mobile developer built the app.
| Status | Detail |
|---|---|
| Merged to production | June 2026, after QA and UAT |
| In use | Reported to me by the CEO |
| Measured outcome | None |
Live and properly used by real shops.Reported to me by the CEO
That report is my only evidence of use. I don't know how many locations switched verification on, how often drawers close short, or whether closing got faster or slower.
If I could instrument one thing, it would be the share of verified sessions that close with a count, broken down into balanced, short and excess, alongside how many imbalanced closes carry a note that says something. Together those tell you whether the loop works: people count, differences are visible, and differences are explained. I'd also watch the time between the payment page opening and the opening count being saved. A gate that slows the counter too much is the most likely reason an owner would switch verification off, and that would undo the whole feature.
What I learned
- 01
Model the money before the screens
The feature became manageable once opening, movement, closing and difference were separate records. After that, every screen was a view of the same ledger, and the ledger order became the card layout.
- 02
Nothing has two meanings
In anything financial, blank means unknown and zero means known and empty. Keeping them apart is a data-integrity decision, not a detail of the input field.
- 03
Interrupt where the consequence is
The gate got simpler and less disruptive when it moved to the one place where cash is actually taken. Where you ask matters as much as what you ask.
The hardest part wasn't any single screen. It was timing: what the interface shows while the server is still catching up, and whether an interrupted action survives the interruption. Most of what I fixed after the first build was about that, not about how things looked. Designing this flow meant designing its timing too. Next time I'd draw those in-between states in the first sketch rather than discovering them in testing.
States and edge cases
The state machine in chapter 05 is the skeleton. This is the catalogue of situations each screen has to survive, with what the product does in each. Messages are quoted as they appear in the interface.
Input
| Situation | Behaviour |
|---|---|
| Opening count left blank | Blocked. "Enter an opening amount." Nothing is saved. |
| Opening count of 0 | Accepted. The 0 stays visible in the field, so the cashier can see what they confirmed. |
| Closing count left blank | Blocked. "Enter a counted amount." The expected amount is not requested. |
| Cash in or out of 0, or blank | Blocked. "Enter an amount greater than zero." |
| Cash in or out without a note | Blocked. An inline "Note is required." and the form scrolls to the note. |
| Denomination mode, every count at 0 | A valid balance (it sums to zero), but not a valid movement. |
| Location has no denominations configured | The Amount / Denomination switch is hidden and the form counts a total. |
| Editing an old entry whose denomination was later removed from settings | The form shows both the current list and the denominations the entry used, so nothing silently disappears from a historical count. |
Network and timing
| Situation | Behaviour |
|---|---|
| Expected cash fails to load during close | The cashier stays on the count, sees "Couldn't fetch the expected cash. Please try again." and can submit again without leaving the modal. |
| Some cash drawer details fail to load | "Couldn't load some cash drawer details." with Retry. Only the parts that failed are fetched again, so one slow request doesn't blank the whole card. |
| History fails to load, or is empty | "Unable to load history", or "No history yet". |
| Session just started, but the session data hasn't refreshed | The opening prompt doesn't reappear. See chapter 14. |
| Saving | Buttons are disabled while a save or fetch is in flight, and a progress toast says what is happening: "Starting session...", "Closing session...", "Saving...". |
Missing or partial records
| Situation | Behaviour |
|---|---|
| A session exists but has no opening count (started in easy mode, or before verification was switched on) | At a verifying location, the drawer card shows a warning: "Session has not started yet. You need to enter opening balance to start the session." with a button to enter it. The payment page asks for it too. |
| A balance known only from the session summary, with no editable entry behind it | Shown, but not editable: "This opening balance cannot be edited." A display value should never pretend to be a record you can change. |
| Session closed in easy mode, with no closing count | The owner or an admin can add a closing balance later from the drawer card, and the difference is then computed as usual. |
| Verification switched off while the list is filtered by Short | The cash-result filter is removed, because those options no longer exist for that location. |
| Session open for 12 hours or more | An "Open 12+ hours" label on the location card on the home screen, a nudge to close it. |
Denied
People who don't own a session and aren't admins see the drawer and its history, but the add, edit, delete and Close Session controls are not shown to them. Hiding rather than disabling keeps the card readable for the common case, a cashier looking at their own drawer. The cost is that a colleague looking at someone else's session gets no explanation of why they can't act. A short line such as "Only the session owner or an admin can change this drawer" would fix that, and it's one of the first things I'd add.
Corrections, history and who can change what
A cash record that can't be corrected gets worked around; one that can be corrected silently can't be trusted. Cashiers mistype. An owner who spots that the morning count was entered as Rs 50,000 instead of Rs 5,000 needs to fix it, and anyone reading the session later needs to see that it was fixed, by whom, and why.
So every cash entry (opening balance, closing balance, each cash in, each cash out) keeps its own history. Creating, editing and deleting each leave an entry with the person and the time. Edits show before and after for each field that changed: the amount, the note and the individual denomination counts. Fields that didn't change aren't repeated. An edit requires a note, for the same reason an imbalanced close does: a correction should explain itself.
One detail in the history view is specific to Nepal. Nepal is five hours and forty-five minutes ahead of UTC, and timestamps came back with that offset written in more than one form. The history reads both forms, because a quarter-hour slip is enough to make a sequence of corrections look out of order. In June the session times also moved to a 24-hour clock.
Who can do what
| Action | Session owner | Admin | Other staff |
|---|---|---|---|
| See the drawer and its history | Yes | Yes | Yes |
| Add a missing opening balance | Yes | Yes | No |
| Edit an opening or closing balance (note required) | Yes | Yes | No |
| Add, edit or delete cash in and cash out | Yes | Yes | No |
| Close the session | Yes | Yes | No |
| Add a closing balance after an easy-mode close | Yes | Yes | No |
The frontend shows or hides these actions by role. The backend enforces its own rules, which I didn't design.
Building the web frontend
I built the web side of this myself, in the POS web app used on counter desktops and tablets. Being both designer and frontend developer meant I could test a decision in the real product within hours, and it also meant some design problems only appeared once the thing was running. This chapter describes behaviour and tradeoffs in plain language; the code stays with Tigg.
A prototype before the API
The backend and the frontend were being built at the same time, and the field names were still changing. So my first version, on 2 June, ran the whole flow in the browser: the verification setting, the denomination list, the opening modal and the two-phase close. It let me run opening, counting and closing end to end almost a week before the real API was ready, and it's where the blind count and the note-on-mismatch rule first ran. On 8 June I connected it to the backend. I kept a single translation layer between the interface's idea of a count (a mode, an amount, the denominations and a note) and what the server expected, so later renames on the backend touched one place instead of every screen.
The server decides what "expected" is
The expected cash is computed by the backend, not in the browser. The close review shows the server's figure and the server's difference. Doing the sum in two places would eventually produce two answers, and in a cash feature two answers are worse than none. The frontend's job is to show the parts of the sum (the rows of the Cash Drawer card) so the total can be checked by eye.
After every change, the whole drawer is refreshed
Adding a cash out changes the movement list, the expected cash, the session summary and the history at once. After any save, edit or delete, the frontend refreshes all of those together. It costs a few extra requests. The alternative, a card where one row has updated and another hasn't, would make a cashier doubt the numbers in exactly the moment they're checking them.
The prompt that came back
Moving the gate to the payment page exposed a timing problem. The cashier saved an opening count, the server started the session, but the page's copy of "does this cashier have a session?" hadn't refreshed yet. For a moment the page still believed there was no session, so it asked for the opening count again. A cashier who had just counted the drawer was asked to count it again.
The fix had three parts. The gate remembers what the cashier was trying to do, so saving the count completes the order. After a successful start, it holds the prompt back for a few seconds while the session data refreshes. And the automatic prompt waits whenever session data is still loading, rather than deciding on old information. The short hold was added first, as a pragmatic fix; the "wait while loading" rule came later and is the more principled one. Both are in place now. If I revisited this, I would rely on the loading rule alone and remove the timer.
Two related fixes came out of the same area. The success handler had been calling the same "close" path as cancelling, which on the payment page meant navigating back; saving now only resets the form and lets the page decide. And cancelling the prompt used to trigger the page's "unsaved changes" warning, which made no sense to a cashier who hadn't changed anything; cancel now goes straight back to the order.
A form that forgot what you typed
One bug I fixed in mid-June: in the edit modal for a cash movement, the form reset itself on every screen update, so typing into it could be lost. The form now resets only when it's first opened or when a different entry is chosen. It's the kind of fault that's invisible in a design file and very visible at a counter.
Loading settings only when needed
The home screen lists every location, and each location card needs to know whether that location verifies cash, but only when someone starts a session there. In July I changed it so that setting is loaded on intent (when someone presses start, or opens the menu that ends a session) instead of for every card on page load. Nothing looks different, but the home screen does less work.
Things I'd tidy
- Some early components from the two-card layout were left in place after the ledger card replaced them. They're unused and should go.
- The frontend reads several spellings of some fields from the server because the API was changing during the build. That tolerance kept the screens working, but it's complexity that should shrink now the API has settled.
- There are no feature-specific automated tests. Testing was manual, through QA and UAT. The count, review and note rules are the first place I'd add them.
The surfaces, on web and mobile
The feature touches more places than the close modal. I designed the web and mobile screens on one Figma page, "🟢 Session Management" in the "Tigg New Features" file, which carries the team's "Ready for dev" marker. The mobile developer built the app from it; I built the web.
Session list
The list shows who opened each session, when it opened and closed, and its status. The status filter has In Progress and Closed, and, at locations that verify cash, Balanced, Short and Excess nested under Closed. Result chips carry an arrow and an amount as well as a colour, so a short session reads as "short, down Rs 300" without relying on red. To make the nesting possible I extended the shared table filter used across the POS with conditional nested options, so other lists can use the same pattern.
Asset to add
Figma export: file 'Tigg New Features', page '🟢 Session Management', frame 'Sessions List Page' — with the status filter open showing Closed → Balanced / Short / Excess, 2x PNG
Session detail
The detail page is a two-column layout: Overview across the top (opened by, opening and closing time, run time), then Transaction Summary and Cash Drawer side by side, then Notes. The Cash Drawer card is the ledger from chapter 04, with rows that expand to show individual movements and their History, Edit and Delete actions. Add actions sit at the foot of each section ("+ Add Cash In", "- Add Cash Out"), close to the numbers they change. Cash in is shown in green and cash out and refunds in red with a minus sign, and each row is also labelled in words.
Asset to add
Figma export: file 'Tigg New Features', page '🟢 Session Management', frame 'Sessions Detail Page' — a closed session with the Cash Drawer card showing a short difference and a reason; plus one 'Session Detail' variant with the Cash Out row expanded, 2x PNG
Opening and closing modals
The opening modal has an Amount / Denomination switch. In denomination mode each note has a stepper with minus and plus buttons as well as a typed count, and a live total. The same modal is reused when a session exists without an opening count; it then carries a warning and its button reads "Save Opening Balance" instead of "Start Session". The close modal has the two phases from chapter 06.
Asset to add
Figma export: file 'Tigg New Features', page '🟢 Session Management' — the open-session modal in Amount mode and in Denomination mode, and the close-session review in all three result variants (balanced, short, over), 2x PNG each
Mobile
On mobile the session detail becomes a bottom sheet over the session list, designed on iPhone 14 frames at 390 points wide. I designed these screens; I didn't build the app, and I haven't compared the built app against the design in detail.
Asset to add
Figma export: file 'Tigg New Features', page '🟢 Session Management', frames 'Sessions Detail Bottom Sheet' and the iPhone 14 session list frame, side by side, 2x PNG
Settings
Require Cash Verification sits in the location's general settings. When it's on, the denomination editor appears below it: edit a value, delete one, add one (the placeholder suggests "e.g. 25"), reset to the default list, save. The settings live on the location, on the server, so every device at the same counter agrees. That is also why a second, browser-only switch for denominations didn't belong (chapter 09).
Asset to add
Screenshot or Figma export: location settings, General tab — 'Require Cash Verification' switched on, with the denomination editor showing the default list, 2x PNG
Against other products
For this write-up (September 2026, not during the project) I read the public documentation of a few POS and ERP products to place the design. It is a documentation scan, not hands-on testing.
| Capability | Square | Odoo 13 | ERPNext | Tigg |
|---|---|---|---|---|
| Opening count | Starting cash | Opening count | Opening entry | Total or by denomination; zero allowed, blank rejected |
| Cash in and out | Pay in / out, description required | Cash in / out | Not noted | Cash in / out, amount above zero and note required |
| Close against expected | Actual amount at end | Theoretical against counted | Closing entry | Count first, then review expected, counted and difference |
| Reason on a mismatch | Optional | Not noted | Not noted | Required when short or over |
| Correction history | Paid in / out history | Not noted | Not noted | Per entry: created, edited, deleted, with before and after |
The baseline (opening count, cash in and out, counted against expected) is common to all of them, so matching it is table stakes, not a contribution. Where Tigg differs is the accountability layer: the reason required on a mismatch, the per-entry history, and the separation of lifecycle from cash result in the list.
What I'd change, how I'd test it, and sources
What I'd change
Nobody asked me to defend these, so this is my own judgement, grounded in how the feature behaves today.
- Watch real closes first. The biggest gap is research. Before any further change I'd sit with two or three cashiers at shift change, at one verifying shop and one that isn't, and note where they hesitate, what they write in the note, and whether the gate ever gets in the way of a sale.
- An optional blind mode for the whole session. The close is blind; the session detail isn't. Some shops would want cashiers not to see the running expected cash at all. It should be a choice for the owner, because other shops want cashiers to see the drawer build up.
- Say why an action is missing. One line for staff who can see a drawer but can't change it.
- A printed session report. Shops that close on paper would want the drawer summary on the receipt printer.
How I'd test it
Task-based sessions with cashiers. Five tasks, each tied to a risk in the design: start a session with an empty drawer (does zero feel allowed?); record a supplier payment from the till (is the note natural or a nuisance?); close a drawer that's Rs 300 short (does the blind count feel fair, and what do people write?); correct a mistyped opening count as an admin (is the history understood?); and recover when the expected cash fails to load. Five cashiers from two or three shops would be enough to find the large problems.
Instrumentation. The measures I'd add, in order:
| Question | Measure |
|---|---|
| Do people count? | Share of verifying locations' sessions closed with a count |
| Are differences visible? | Balanced, short and excess per week, and the typical size of a difference |
| Are they explained? | Share of imbalanced closes whose note is more than a word or two |
| Are corrections honest? | Edits per session, and edits made after close |
| Is the gate costly? | Time from the payment page opening to the opening count being saved |
| Is anything left open? | Sessions flagged "Open 12+ hours" per week |
The last two are guard rails. If the gate slows the counter, owners will switch verification off, and the feature quietly stops existing.
Accessibility checks. Focus order through the two phases of the close; whether a screen reader announces the change from count to review; and a text label behind every arrow chip in the list. I relied on words rather than colour throughout, but I haven't tested with assistive technology.
Notes on sources
- First-party: my own recollection and answers written for this case in September 2026: the trigger, the lack of any record before, the internal demonstration with cash drawers, the meaning of empty and zero, the reasons for the note rule, the blind count, the gate move and the toggle removal, and who chose the settings label.
- Product behaviour: the shipped web product and my own implementation. Messages in quotation marks are the interface's own copy.
- Design: the "🟢 Session Management" page in the "Tigg New Features" Figma file.
- Dates: my work history for the feature, June and July 2026.
- Feedback: the CEO's report that the feature is live and properly used by real shops. There is no usage data behind it that I can see.
- External: public documentation from Square, Odoo and ERPNext, read in September 2026; the denomination list against the notes and coins in circulation from Nepal Rastra Bank's public material.
- Reconstructions: every redrawn screen and diagram on this page uses fictional names and amounts. Where I give a reason that I didn't record at the time, I say it's in retrospect.