Norra POS (Point of Sales)

F&B SaaS · iPad / phone / desktop

Role
Sole Product Designer
Worked with
PO, BA, and developers. The CEO made the final call.
Users
Waiters, cashiers, and managers. The kitchen uses its own KDS (the kitchen screen).
Problem
Restaurants used the POS only for payment. Taking orders, moving tables, and tracking tables still ran on pen and paper. I improved the POS to be the one place that helps the different roles work together.

Shared root cause

At first, the staff in a restaurant solved everything with paper, pen, and talking. There was no system. Each role (waiter, cashier, manager, and kitchen staff) had to talk to the others. When a problem came up with food or payment, they had to talk again and fix things by hand.

I did not design screen by screen. I had to design around the work of the different roles.

1

Merging, splitting, and moving tables: the bill did not know who to follow

Problem

When a guest wanted to merge tables, the waiter had to write it down on paper first. Then the waiter told the cashier and the manager. At payment, the cashier had to check whether the bill had already been updated for the right table. If not, the cashier fixed it by hand.

What I noticed

The mistake did not show up at payment. It could happen when a table was moved or merged and the system did not know.

What I considered

When tables are merged, the bill moves with the table. Nobody has to do it by hand. It only has to be updated in the POS, and every other role in the system sees it too.

When a table or a bill is split, the system supports 3 ways: 50/50 (equal), by percentage, and by hand.

At first, the developers suggested equal and percentage splits. They thought these were simple and helped staff split bills faster.

But guests do not always want an equal split, because there are cases where:

  1. A guest wants to split a bill to get a separate invoice
  2. A guest only wants to split off the takeaway dishes and pay for them separately
  3. A guest wants to split off the pricier dishes and pay for those on their own

And in these cases, an equal split or a percentage split cannot do what the guest wants.

Working with the team

Merging, splitting, and moving tables (the bill) was a requirement for the POS. So nobody argued about whether to build it.

I took the guest stories above to the team. After that, adding the manual split was approved.

The developers did not mind building more. In the end, it is just picking dishes and moving them to another bill.

With the table-split stories approved, the dev team also understood how important this feature was and did not object to the extra work.

Decision

I decided that merging, splitting, and moving tables would be updated on the bill. A table can have 2 or more bills split off from it. Keeping the table information on each bill helps when we go through the end-of-day reports. And it helps with management.

What happened next

I tested it directly with restaurant staff, using the wireframe version. Before, staff who often split bills had to fix the dishes and the bill by hand. What impressed them most was splitting by percentage or in half. But when they saw they could split however the guest wanted, they found it much handier. It helped them get the job done faster.

Before this, if a guest wanted certain dishes split off, staff had to create a new table first. Only then could they note the dishes to split off. This is why I needed to make it simpler.

Split Bill: adding a new bill
After moving dishes to bill 1234-2
Table menu on a phone: Combine Bill, Split Bill
2

Table status and floor map: you had to walk over to find out

Problem

At peak hours, some guests came in to eat without booking a table. At that time, the system had no floor map. So the manager could not see which tables were free. The manager had to walk around the restaurant to check.

The system also could not estimate how long until a busy table would be free. For example, table A started service at 5 pm. With the number of guests and the dishes ordered, the system could have worked out when the table would be free. But at that time, the system did not go that far.

What I noticed

This is something most POS users need. They want to know the state of the whole floor, so they can make decisions in time.

What I considered

The system is designed with 9 table statuses: empty, reserved, guest arrived, guest arrived late, being served, served, waiting for payment, paid, and cancelled or no-show.

The main screen is a list of tables, with a button to switch to the floor map.

I chose the list as the main screen because most staff use it to serve guests when they arrive. The list shows which tables are being served, based on what the guest booked.

The floor map is for when you need to know which tables are free or reserved. It lets the manager see the state of the whole restaurant.

Working with the team

At first, the dev team did not agree with having so many statuses in the system. But each status helps staff see what is really happening at the table. That helps staff do their work as well as they can.

Decision

I kept all 9 statuses. I did not drop any.

The main screen is still the table list, and the floor map is a view you switch to when needed. Real‑time (updating right away) moves to a later phase, because of the developers' technical worry.

What happened next

Right now, statuses update with a reload button. I once suggested adding an in-app notice to say something new arrived, and to remind staff to reload. But I still think the system should update by itself. Staff should only reload when the network or the system has an error. Real‑time is still in the plan for later. It was not dropped.

List, filtered by status
Floor map by area, with a status legend
Gantt view by time
3

Permissions: who can see what, who can do what

Problem

In a restaurant, several roles look at the same order. If everyone can edit it, mistakes are easy and it is hard to control. If the manager can only look, they cannot handle the real situations that come up.

What I noticed

I saw that I needed to separate the right to see from the right to act. I also set one general rule: the person who does an action cannot be the person who approves it. On top of that, each role gets its own rights to see and to act.

What I considered

Each role does only its own part of the job. Waiters create and edit their own orders, and merge, split, and move tables. Managers can see everything and approve the sensitive actions. Cashiers have full control of the money. The kitchen stays outside the POS and uses its own KDS screen. The full details are in the permission table below.

Working with the team

At first, the product team wanted the manager to know everything and to edit directly.

I argued the opposite. Whoever does the job owns it. The manager should only confirm and watch how staff work. The manager must not edit on their own.

The reason: at that time, the system had no audit log (a record of every action). If managers could edit or delete dishes, a manager could quietly delete dishes for a table they know. Then, when a problem came up, the blame would go back to the staff. A manager could also apply a discount code to a table they like, without anyone confirming it. The safest way was to not give them any power that could lead to that.

Decision

I decided to set permissions by action, not by screen. I also decided that nobody can approve their own action. The manager needs to see everything, but must not change an order while staff are serving. Money is handled only through the cashier. Each manager has their own confirmation code. Sometimes staff need an approval, for example for a void (cancelling a dish that is already made) or a dish cancel. Then they bring the POS device over. The manager types their own code right on it. This way, we know exactly which manager approved what.

Entering a confirmation code when adding a voucher
Refunding one payment

Permission matrix

Permission matrix
ActionWaiterCashierManager
See the floor map and table status—ViewView
See dish details (served yet, being made yet)ViewViewView
Create orders and take orders for guests (including by note or voice)DoNoNo
Edit dishes freely while staff are servingDo (own orders)NoNo
Change a dish when the guest changes their mindRequestNoApprove
Merge, split, and move tablesDoNoDo
Cancel a dish or an order (dish not started yet)Request: presses cancel, needs the manager's confirmation codeNoApprove: gives the confirmation code
Cancel a dish that is being madeNo, the system blocks it—No
Void a dish (cancel a dish that is already made or served)RequestNoApprove and write a reason
Apply a discount codeNoApprove: confirms the codeRequest: applies the code, needs the cashier to confirm
PaymentNo, it must go through the cashierDoDoes not take payment alone. Can confirm, but it still goes through the cashier.
RefundNoDo (cashier only)No

Do = can do it alone · View = can only look · Request = starts a request, someone else approves · Approve = confirms the request · No = not allowed

4

Changing a dish mid-order: walking to the kitchen to ask

Problem

When a guest changed their mind, the waiter had to go down to the kitchen to ask if the dish was made yet. Order slips also had to be passed back and forth between the kitchen and the cashier.

What I noticed

This idea came from my own experience eating out.

When I want to change a dish, I ask the waiter if it has been made yet. If not, it can be changed. If it has, I usually wait. But if the wait is too long, for example over 30 minutes after ordering, I can ask to cancel. Then it is up to the manager, the staff, and the kitchen to sort it out.

I realized the kitchen already knew the answer to "how far along is the dish?". The POS just never asked.

What I considered

I did not build a separate "change dish" flow. Instead, I let the dish status on the KDS decide if it is cancelled or changed:

  • A dish that has not been started: it can be cancelled or changed, with the manager's confirmation code.
  • A dish that is being made: the system says it cannot be cancelled.
  • A dish that is ready to serve or already served: it becomes a void. The manager confirms and writes a reason.

The KDS status shows right on that table's dish line. The system also counts the time since the order. A guest may wait too long, like the 30 minutes above. Then you can check right in the POS if the time has really run out. That way the manager, the staff, and the kitchen each handle their own part.

Working with the team

Nobody on the team argued against this direction.

Decision

I decided to let the dish status on the KDS decide if a dish can be cancelled or changed. The reason: the waiter needs to answer the guest right away, without walking to the kitchen. A dish that is already made needs the manager's approval and a reason, so it can be checked later.

What happened next

The void flow (the flow for a dish that was already served) now has its screens designed. It is no longer just an idea.

Order details with dish-status tabs
Order details on a phone
Entering a code to remove a dish already sent to the kitchen
Order details, with a delete button on each dish line
Void dialog: no reason chosen yet
A reason chosen for the dish to void
The voided dish: struck through, with the reason shown

Deep dive: taking orders with notes or voice

Opening story

I went out to eat like a normal guest. The waiter listened to our order and wrote it on a phone or on paper. Only then did they type it into the POS. The product I made was not helping at that most important moment.

Problem

The POS has hundreds of dishes to tap. But guests order faster than staff can find a dish in the system. So staff write a note first and type it in later. That is doing one job twice.

What I got wrong at first

At first, I thought the problem was making the dish list easier to search. But the real problem was that staff should not have to search for dishes while the guest is still talking. An order also takes longer to handle, because finding a dish takes time and each person works at a different speed.

Options I considered

  1. Improve the menu and the search. Staff would still have to find dishes while the guest talks. This does not fix the root of the problem.
  2. Write a free note, even just the first few letters of a dish. The system turns it into dishes, and it is faster for staff to confirm them with the guest.
  3. Voice note, read by the same system. I chose this too, and we built it together with the note.

Working with the team

The developers worried about whether it could be built.

I did not offer a fallback. I convinced them with three things:

  1. The real difficulty staff face
  2. What I found when I looked at the AI tools on the market
  3. A clear answer on the time and cost needed, so they could judge for themselves

After that, the developers took it on and finished the feature.

Decision

I decided to let staff write a short note or speak. Then the AI suggests dishes, and staff confirm them. Staff no longer have to search the menu.

The reason: guests order faster than staff can find dishes. Staff were also already writing by hand and typing it in again.

The trade-off: one more step to confirm, and it depends on how accurate the AI is.

Outcome

I tested it on Maze with 10 restaurant staff.

They said the "smart note" feature felt more comfortable for choosing dishes. This is what the staff told me, not a number. There are no before-and-after numbers, because the free Maze plan no longer keeps the original data.

The feature is still in development and has not been released yet.

Before: searching and tapping in the menu

Menu List: find and tap each dish

After: write a note, the system suggests dishes, staff confirm

Smart Note: a free note
Choosing among matches for "cá hồi"
Choosing among matches for "bò nướng"
Review the order, then send it to the kitchen

What I learned

I used to believe voice would be the biggest difference. But the test showed that staff mostly still used notes. They were used to writing notes on their phones. And they felt shy about speaking in front of guests.

After the test, I decided to keep voice as an option. I did not force it, and I did not remove it. That gives staff time to get used to the new technology. In practice, notes are still the main way people use it.