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.

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 from NiagaKit recipes when both apps share a browser). 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
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)

SST applies on (subtotal − discount + service charge), per Malaysian F&B receipt convention — service charge is itself taxable. Service tax registration is mandatory once F&B turnover passes RM1.5m/year; below that it's optional. All data stays in this browser (localStorage) — nothing is uploaded.

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 — a cleared cache wipes it. Keep backups.

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 set how many are left today. 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

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