Open the app

Restaurant POS Starter

Point of sale, kitchen display and back office for restaurants with one or many branches: tables, orders, payments, recipes and stock, purchasing, loyalty, delivery orders and tax documents.

Spring Boot 4 · Java 17+ · Microsoft SQL Server

User Guide · Version 1.0.0

Contents

  1. What the system does
  2. Install and start
  3. Demo accounts and PINs
  4. Set up a terminal
  5. Open a shift
  6. Take orders
  7. Send to the kitchen
  8. Take payment
  9. Approvals, voids and refunds
  10. Kitchen display
  11. Customer display
  12. Close the shift and the day
  13. Back office: dashboard
  14. Menu, prices and recipes
  15. Stock
  16. Purchasing
  17. Members, points and promotions
  18. Delivery orders
  19. Reports
  20. Tax and accounting
  21. Users, roles and security
  22. Settings
  23. Rules the system always keeps
  24. Going live
  25. Troubleshooting

1. What the system does

Restaurant POS Starter is a complete web application. Every device only needs a browser: a tablet or touch PC at the counter, a tablet in the hands of a waiter, a screen in the kitchen, a small screen facing the guest.

PartWho uses itWhat it does
POSCashiers, waiters, managersFloor plan, dine-in / take-away / delivery / drive-thru bills, options and notes, courses, split and merge, all payment types, receipts, shift and cash drawer.
Kitchen displayKitchen and barTickets per station with timers, Start / Bump, recall, sold-out items.
Customer displayGuestsThe bill as it is built, the total and a payment QR code.
Back officeManagers, store, purchasing, accountingDashboard, menu and recipes, stock at FIFO cost, purchasing, members and promotions, delivery platforms, reports, tax documents, journal export, users and audit log.

One installation serves any number of branches. Each branch has its own tax rate, service charge, prices, floor plan, terminals, stock and document numbers.

2. Install and start

You need

Create the database

Open database/01-create-database.sql, change the password in it, and run it as a SQL Server administrator (SQL Server Management Studio, Azure Data Studio or sqlcmd):

sqlcmd -S localhost\SQLEXPRESS -E -i database\01-create-database.sql

It creates the database RestaurantPosDB with a UTF-8 collation and a login restaurant_pos. The application creates all tables itself on the first start (Flyway migrations).

SQL Server must accept TCP connections. For a named instance (for example SQLEXPRESS) the SQL Server Browser service must run, or use a fixed port in the URL.

Start

Set the connection and start the application (Windows example; on Linux or macOS use export and ./mvnw):

set DB_URL=jdbc:sqlserver://localhost;instanceName=SQLEXPRESS;databaseName=RestaurantPosDB;encrypt=true;trustServerCertificate=true
set DB_USERNAME=restaurant_pos
set DB_PASSWORD=the-password-you-chose
mvnw.cmd spring-boot:run

Or build once and run the jar: mvnw.cmd package then java -jar target\restaurant-pos-starter-1.0.0.jar. Open http://localhost:8080. On an empty database the demo data is created (about 20 seconds): two branches, a menu with recipes, stock, staff, members and two weeks of sales.

All settings are environment variables; env.example lists every one of them.

3. Demo accounts and PINs

Back-office password for every demo account: Demo@2026. Staff who work on terminals also have a PIN.

UserNameRolePINBranches
adminAlex AdminSystem admin9024all
avery.collinsAvery CollinsBranch manager2580Riverside, Old Town
jordan.leeJordan LeeCashier1470Riverside
sam.riveraSam RiveraWaiter3690Riverside
riley.chenRiley ChenWaiter4826Riverside
morgan.patelMorgan PatelKitchen5173Riverside, Old Town
drew.santosDrew SantosCashier6284Old Town
casey.brooksCasey BrooksStore keeper-Riverside, Old Town
quinn.hayesQuinn HayesPurchaser-Riverside, Old Town
taylor.kimTaylor KimAccountant-all (read)
jamie.fordJamie FordExecutive-all (read)
robin.valeRobin ValeAuditor-all (read)

Two demo branches show both tax styles: Riverside adds 7% tax and a 10% service charge on dine-in; Old Town has prices that include tax and rounds cash to 0.05.

Before real use, switch off the demo data (SEED_DEMO_DATA=false) on a new, empty database and set ADMIN_INITIAL_PASSWORD. See chapter 24.

4. Set up a terminal

For security, staff sign in with a PIN only on devices that a manager has registered. A registered browser keeps a signed device cookie; another browser cannot use the PIN screen.

  1. On the device, sign in to the back office as an admin or branch manager.
  2. Open System > Terminals & stations and press Use this browser next to the terminal (POS1, KDS1...).
  3. The device now shows the staff sign-in screen. The manager is signed out of the back office on that device.
PIN sign-in
Staff tap their name and type their PIN. Five wrong PINs lock the user for 15 minutes.

The POS locks itself after 60 seconds without use (Settings). Press Lock to hand the device to a colleague; open bills stay as they are.

5. Open a shift

Payments are always booked into the shift of the terminal. The first cashier of the day opens the shift with the opening float (the change in the drawer). The Shift tab shows the payments taken, cash drops, cash in and the cash that should be in the drawer. Waiters can take orders without a shift; only taking payment needs one.

6. Take orders

Floor plan
The floor plan: free, occupied (guests, minutes, total), bill asked, reserved and cleaning tables. Food that is ready shows on the table.
Order screen
Menu by category with options, sold-out items and time-limited items (breakfast). The bill on the right shows tax and service exactly as the receipt will.

Tap an item to add it. Items with options (size, doneness, extras) open a choice dialog; required choices must be made. Add a note for the kitchen ("no peanuts"). Tap a line on the bill to change the quantity, add a note, give an item discount or void it.

The More menu of a bill: guests & name, move to another table, merge bills, split by items, send a held course, reopen a bill to add more, delivery status and void the whole bill. Add a member with their phone number or member number to earn and use points.

Two people can work on the same bill. If someone else changed it in the meantime, the POS reloads the bill instead of overwriting their change.

7. Send to the kitchen

Send prints a kitchen ticket per station (hot kitchen, cold, bar, pastry) and shows it on the kitchen display. Items can be held for a later course and sent with Send a held course. Unsent items are sent automatically when the bill is paid.

8. Take payment

Payment
Payment: choose one or more methods, quick cash buttons, change, split equally and an e-mailed receipt.
MethodNotes
CashQuick buttons, change is calculated. Only cash gives change. Cash rounding follows the branch.
Credit / debit cardCard type, the last 4 digits and the approval code from the card terminal. Full card numbers are refused everywhere.
QR payShows a dynamic QR code (also on the customer display); the bill closes when the payment notice arrives. The included gateway is a test simulator.
E-wallet, voucherWith a reference.
PointsMember points at the value set in Settings.
Credit salePay later (house account); needs a manager approval.

Mix methods freely ("$20 cash, the rest by card"). Split equally shows each guest's share; Split by items (in More) moves items to a new bill. After payment the receipt prints and, if set, a QR code on it opens the e-receipt. A full tax invoice with the buyer's name, address and tax ID can be issued from a paid bill.

Receipt
80 mm receipt with member discount, coupon, points, change and e-receipt QR.
Pressing Pay twice (a double tap, a slow network) never charges twice: every payment carries a unique key and a repeated request returns the first result.

9. Approvals, voids and refunds

Some actions need a manager: voiding an item already sent to the kitchen, a discount above the cashier's limit, a credit sale, opening the drawer without a sale, a refund, and closing a shift with a large cash difference. The POS asks for the manager to tap their name and type their PIN on the same screen; the manager is recorded in the audit log.

10. Kitchen display

Kitchen display
Tickets per station; they turn yellow and red with time. Notes stand out. A sold-out item is announced at the bottom.

Register a kitchen screen as a KDS terminal and sign in with a kitchen PIN. Filter by station, press Start when cooking begins and Bump when the food is ready (the waiter sees "ready" on the floor plan). Recall brings back a ticket bumped by mistake. The kitchen can mark items sold out; every POS greys them out immediately.

11. Customer display

Each POS has a customer display link (System > Terminals > Customer display). Open it on a second screen facing the guest: it shows the items as they are added, the total and the payment QR code.

12. Close the shift and the day

In the Shift tab, count the cash by notes and coins. The system compares it with the expected cash and shows the difference. A difference above the limit needs a manager. Closing prints the Z report (sales by method, refunds, discounts, voids, cash movements), which is final and numbered. An X report can be printed at any time without closing. When all shifts of a branch are closed, a manager closes the business day (Back office > Shifts & end of day).

Shifts
Shifts and end of day in the back office.

13. Back office: dashboard

Dashboard
Today compared with the same day last week: sales, bills, guests, food cost, open bills, voids and discounts, refunds, low stock and best sellers.

The branch selector at the top switches between branches (for users allowed in several). The search box finds a bill by receipt or bill number. The theme button switches between light and dark.

Dark theme
Dark theme.

14. Menu, prices and recipes

Menu items
Menu items with category, price, station and status.

15. Stock

Stock
Stock on hand at FIFO cost, next expiry and reorder levels.

Every paid bill takes its ingredients from stock automatically (recipe × quantity, plus options). Cost is calculated first in, first out: the oldest received goods are used first, so food cost is exact even when prices change.

Food cost
Food cost report: theoretical (recipes) against actual cost.

16. Purchasing

Purchasing
Purchase orders and goods received.
  1. A purchaser creates a purchase order for a vendor (it can be suggested from the reorder levels).
  2. A manager approves it.
  3. When goods arrive, Receive goods records the quantities, prices, lot numbers and expiry dates. A price above the ordered price by more than the set percentage needs approval. Stock and FIFO cost are updated at once.

17. Members, points and promotions

Members
Members with tier and points. Phone numbers, names and e-mails are stored encrypted.

18. Delivery orders

Orders from delivery platforms arrive by webhook (see docs/API.md). Each platform has its own signing secret, commission rate and menu map (their item codes to your items). An order with unknown items goes to the exceptions list instead of being lost. The demo has two fictional platforms; Simulate sends a test order.

19. Reports

Sales report
Sales by day, channel, payment method and category, with CSV export.
Menu engineering
Menu engineering: stars, plowhorses, puzzles and dogs, with advice.
Busy hours
Busy hours: sales by weekday and hour, to plan staff and prep.

Also: food cost, voids & discounts by staff (the control report) and delivery by platform. Reports can show one branch or all.

20. Tax and accounting

21. Users, roles and security

RoleMay do
CashierOrders, payments, own shift
WaiterOrders
KitchenKitchen display, sold-out items
Branch managerEverything in the branches given: POS approvals, stock, purchasing, members, reports, end of day, finance
Store keeperStock
PurchaserPurchasing and stock
AccountantReports and finance, all branches (read)
ExecutiveReports, all branches (read)
AuditorAudit log and reports, all branches (read)
System adminEverything, including users, branches and settings

Each user can be limited to some branches and given their own discount limit. Back-office users can switch on two-step sign-in with an authenticator app (Profile). Passwords need at least 8 characters with upper and lower case, a digit and a symbol; PINs cannot be simple runs like 1234 or 1111.

Audit log
The audit log records sign-ins, approvals, voids, discounts, refunds, price and permission changes. It cannot be edited.

22. Settings

System > Settings (system admin):

SettingDefault
POS idle lock (seconds)60
Wrong PINs before lock / minutes locked5 / 15
Cashier discount without approval5%
Void after sending needs approval; no sale needs approvalyes / yes
Quick cash buttons5, 10, 20, 50, 100
Kitchen ticket yellow / red / recall (minutes)8 / 12 / 30
Cash over/short needing approval5.00
Receiving price variance needing approval5%
Point value; birthday multiplier; points expiry (months)0.01; 2; 12
QR on receipts; send tax invoices to e-invoice serviceyes; yes
Audit log retention (years)5
Offline receipt number block size500

Per branch (System > Branches): legal name, tax ID, address, tax rate, prices with or without tax, service charge, cash rounding, the time a business day starts and the receipt header and footer.

23. Rules the system always keeps

These rules are enforced by the database itself, so not even a bug or a direct SQL change can break them:

The test suite checks these on a real SQL Server, including 2,000 receipt numbers taken in parallel with failed sales in between (no gaps, no duplicates).

24. Going live

  1. Create a new empty database, set SEED_DEMO_DATA=false and ADMIN_INITIAL_PASSWORD.
  2. Set new secrets: APP_DATA_KEY (openssl rand -base64 32), APP_DEVICE_SECRET, PAYMENT_WEBHOOK_SECRET. Keep APP_DATA_KEY safe: without it encrypted member data cannot be read.
  3. Run behind HTTPS (a reverse proxy such as nginx, IIS or Caddy) and set SESSION_COOKIE_SECURE=true and APP_BASE_URL.
  4. Set CURRENCY_SYMBOL, CURRENCY_CODE and APP_TIME_ZONE; enter your branches, tax rates and menu.
  5. Connect your QR payment and e-invoice providers (implement QrPaymentGateway / ETaxProvider) and a mail server for e-receipts.
  6. Back up the database every day and test a restore.

Step-by-step server notes are in docs/DEPLOY.md.

25. Troubleshooting

ProblemFix
"This browser is not registered as a POS terminal"Register it (chapter 4). Clearing browser cookies removes the registration.
A user is locked on the PIN screenWait 15 minutes, or a manager unlocks them in Users.
"Take payments on a POS terminal"Payments are taken on registered POS terminals with an open shift, not in the back office.
The application does not start: "The database collation is ..."Create the database with database/01-create-database.sql (UTF-8 collation).
Cannot connect to SQL ServerEnable TCP/IP in SQL Server Configuration Manager, start SQL Server Browser for a named instance, check the firewall.
Something went wrongEvery error page and log line has a request id; search the log for it.