KedaiPOS

F&B point of sale — dine-in · takeaway · online

⏱ Clock in / out

Enter your PIN — the till knows if you're starting or finishing. Your boss sees your hours in NiagaKit for payroll: the back office is part of this same site, so your PIN and your hours pass between them on this device with nothing to send.

On shift now

Nobody clocked in.

Today's clock-ins

No clock-ins today.
No products yet — import your menu CSV or add items in the Products tab.

Custom / off-menu item

Current order

Tap menu items to add.
Service charge 10%
SubtotalRM 0.00
TotalRM 0.00

Tap ✎ on a cart line to note which item it's for (e.g. "less sweet" on the matcha, not the chocolate). Payment opens on its own screen with change calculation.

Dine-in tables

No tables set up yet — add them below.

Manage tables

Tap a free table to start its order. Tap a busy table to add items, take payment, or print its ticket. A table frees automatically when its bill is paid.

Open orders & pre-orders

#WhenTypeCustomerItemsTotalPaidActions
No open orders.

📅 Team calendar: click GCal on a pre-order, switch the calendar dropdown to your shared team calendar and save — the whole team sees what to prepare and when. Or export the .ics and import it into the team calendar (Google Calendar → Settings → Import & export); re-importing updates events instead of duplicating.

Completed today

Orders0
TakingsRM 0.00
#TimeTypeItemsTotalPaid via
Nothing completed yet today.

Receipt history

Receipt / OrderDate & timeTypeCustomerItemsTotalPaid via
No receipts match.

Every completed transaction lives here — search it, reopen it, reprint or email the receipt.

Start a shift

Open a shift at the start of the day, then close it at EOD to settle the drawer against the card terminal, cash, and online transfers.

Past shifts

ClosedBySalesOver/Short
No closed shifts yet.

📦 Products

Import menu from CSV

Works with a StoreHub-style product export — it reads Product Name, Category, Tax-Exclusive Price and Price Type columns. Variable-price items (e.g. delivery fee) will ask for the price at the till. "Service Charge" rows are skipped — KedaiPOS computes that itself.

Add product manually

🍰 Track slice stock for this item

Sizes with their own price (Pandan Yam 6"=145 / 8"=170) go above. Modifier options for this product appear once you create modifier groups below — tick only the options this product offers (e.g. an iced-only drink: tick just "Ice"). Leave all unticked to use the category default. Cost feeds the profit report.

Modifier groups (variants)

GroupTypeOptionsCategories
No modifier groups yet. Same idea as StoreHub's: one "Sweetness" group can serve all 30 drinks.

Single choice = pick exactly one (Sweetness: Standard / Less / Extra). Multi choice = pick any (Add-ons). Tapping a product in a linked category opens the options sheet; the first option of a single-choice group is the default (usually "Standard"). ✎ edits a group. To make a drink ice-only or hot-only, edit the product and tick just the options it offers.

Product list

ProductCategoryPrice
No products yet.

🎁 Combos / bundles

ComboItemsPriceSaves
No combos yet — bundle a cake with a drink at a small saving to nudge bigger baskets.

Combos appear as 🎁 tiles on the sell screen. Tapping one adds its items to the cart at the combo price — the discount is split across the items so per-item COGS, stock counts and reports stay accurate.

📊 Reports

Sales summary

By payment method

No completed orders.

By order type

No completed orders.

By category

No completed orders.

Top items

No completed orders.

The CSV export is line-level (one row per item with the order's charges) — it opens in Excel/Google Sheets and can be keyed or imported into your accounting flow, including NiagaKit's records.

Profit & basket analysis (selected date range)

☕🍰 Sales mix & margin by category

📋 Menu engineering — what to push vs fix

Most/least profitable items

Add product costs to see margins.

Popular mix & match (item pairs)

Need multi-item bills.

Insights — how to lift sales & basket size

COGS comes from each product's Cost field (set it in Products, or pull it from NiagaKit's recipes — the back office is a folder of this same site, so it is readable from this device with nothing to export). This is the profit lens — high revenue with thin margins is the trap; the insights look for attach-rate and bundle opportunities to raise sales per bill.

⚙️ Settings

Business / receipt details

Charges

Auto-apply to dine-in
8% is a per-line rate, not a bill rate. Set it on the individual product in Products instead.
Menu prices already include SST (show as "included" instead of adding on top)
Round total to nearest 5 sen
Require an open shift before taking orders (failsafe — prevents un-tracked sales)
Suggest a drink at the till when a food order has no drink (attach-rate upsell)

How the till applies SST. Service tax is charged on the food and drink only — (subtotal − discount) — and the service charge is added after that, untaxed. RMCD is explicit: service charge is not subject to service tax and is not part of the tax base (Panduan Makanan & Minuman, para 12 and FAQ 8). Only charge SST if you are SST-registered: registration is mandatory once your taxable F&B turnover exceeds RM1,500,000 over a rolling 12 months, and an unregistered operator must not charge it at all. Takeaway is taxed the same as eat-in — Group B covers food service "whether eaten in or taken away", so the till does not exempt it. A packaging charge you levy is taxable; a delivery charge you levy yourself is not (since 1 Mar 2024), and voluntary tips never are. Keep this rate at 6%. 8% is a per-line rate, never a bill rate — it applies only to alcohol, tobacco/vape and their liquids, corkage and event management (V7 para 19(ii),(iv),(v)). If you sell any of those, set 8% on that product in the Products tab and leave this at 6%; the receipt then prints one SST line per rate. Bottled, canned and carton drinks are 6%, the same as anything you pour yourself — RMCD's V6 guide briefly said 8% and was corrected to 6% three days later in V7, and Service Tax Policy 3/2024 (Amendment No. 1) puts it beyond doubt. Snacks and whole fruit served loose are not taxable at all. All data stays in this browser (localStorage) — nothing is uploaded.

Source: RMCD, Cukai Perkhidmatan 2018 — Panduan Makanan & Minuman V7, 19 April 2024 (published in Malay only; the English guide is withdrawn) and Dasar Cukai Perkhidmatan Bil. 3/2024 (Pindaan No. 1), 29 March 2024. Rules re-checked 4 August 2026 — V7 is still the current F&B guide, and the 6% rate and RM1,500,000 threshold are unchanged.

Manager access

When set, the Products, Reports and Settings tabs ask for this PIN — staff can take orders, run tables and close the shift, but can't change the menu, prices, or see full reports. Tap 🔒 Manager in the top bar to re-lock. Honest limit: this is a convenience gate to stop casual changes, not bank-grade security — anyone technical could bypass it in a browser. True per-user accounts need the hosted version (see note below).

Data safety / backup

All data lives in this browser, against this web address — a cleared cache wipes it, and moving the till to a different address leaves it behind. Keep backups, and take one before any move.

Auto-back up when I close a shift (saves a dated file each day)

Daily summary to owner

Send a sales summary when a shift closes

At shift close, a formatted day summary (sales, orders, by payment, over/short) is sent via your webhook (kind=daily_summary) — or copied for you to paste if no webhook. Route it to WhatsApp/email in your Make scenario. The team stock-count message lists each cake's remaining slices with a prep hint for the kitchen — copy it or send to WhatsApp.

Integrations — auto-calendar & email receipts

Auto-send pre-orders to the calendar (any order with a "Fulfil / pickup at" time)
Send email receipts through the webhook (falls back to your mail app if empty)

One-time Make setup (~15 min): create a scenario starting with Webhooks → Custom webhook (paste its URL above) → add a Router → branch 1: filter kind = preorder_eventGoogle Calendar → Create an Event (map title, startLocal, endLocal, details, your shared team calendar) → branch 2: filter kind = email_receiptGmail → Send an email (map to, subject, text). Failed sends queue here and retry automatically.

Price

Take payment

Total

Paid with

Sold-out & stock for today

Tap 86 to mark an item finished, or type how many are left today and press Save counts. Counts reset every day and drop automatically as items sell.

🍰 Confirm opening slice counts

Count the slices in the display for each tracked cake at the start of this shift. Pre-filled with the last known count — adjust to what's actually there.

Slice move

Reason

Refund

Amount

Reason

What happened to the item?

Close shift — count & settle

Count each payment type and enter the actual amount. Variances are flagged so you can match the card terminal slip and cash drawer before closing.
Cash over / short