Merchants
128
MRR
RM12,540
Active
119
F&B merchants86
Retail merchants42
Expiring within 14 days7

Manage every merchant, in one place.

Kaunter merchants, quotations, invoices and the rest of Kelly Studio, in one place.

Dashboard

Essential Customers by State

Customer ID Business Name Contact Type Plan Subscription Ends App Version Account Created Notes GrabFood Bookings
Loading...

Activity

When Who Where Section What changed
Choose a merchant to see their change history.
Latest Backup File
Loading...
Business Name Last Backup Note
Loading...
Order changed but not saved. IDs below show what they will become.
ID Customer Contact Fiuu ID Units Hardware Total Spend Lifetime Fiuu Commission
Loading...

Units Sold by Month

3-month trend Monthly average This month at current pace

Stock Levels

Category Serial Number Received Date Sold Date Dispatch Date Delivery Confirmed Sold To Contact Price Sold Warranty End
Loading...
Shipment ID Partner Item(s) Customer Destination Contact Tracking ID Status POD Signed By
Loading...
DO Number Dispatch Date Customer Item(s) Serial Number Address Assigned To Status
Loading...
Agreement No. Date Merchant Original S/N Loaner S/N Stage Due
Loading...

Onboarding

Send form
Reference Received Business Key contact Rate card Documents Status
Loading...
Checking...

Dataset health

New leads by month and business type

* this month so far

Conversions by business type

Conversions by state

Latest unconverted leads

See all unconverted →

Latest conversions

See all conversions →
Date Customer Name Phone Status Value (RM) Comments Product Follow Up Meta Events
Loading...
Quote # Date Customer Total (RM) Status Valid Until
Loading...
Invoice # Date Customer Total Status Due
Loading...

AI Agent

Configuration

Clearly define what this AI Agent is responsible for and how it supports your business.

Instructions

Describe the AI Agent's role, communication style, and the actions it should perform.

Actions

Assign actions the AI Agent can take during a conversation. Each action only works once an LLM provider is connected — for now this just saves your configuration.

Close conversation
AI Agent can mark a conversation as closed based on your guidelines.
Assign to human
AI Agent can hand the conversation off to you or your business partner.

Knowledge Sources

Documents and links for the AI Agent to reference. Storage only for now — nothing is fed to a model until an LLM is connected.

Loading...
Test AI Agent
💬
Test your AI Agent
Save some instructions above, then send a message to try it out. Nothing here reaches real customers.

Support Tickets

Ticket ID Merchant Issue Priority Status Created Last Updated
Loading...

Email Campaigns

Campaign Send Date Recipients Open Rate Status
Loading...

Template Library

Merchant Paid At Amount Plan Channel Transaction ID
Loading...

Fiuu Commission

Merchant Type Channels Txns Sales (MYR) Eff. Rate Commission (MYR) vs Prev
Loading...

Signups (Month-over-Month)

Revenue by Month

Plan Mix

F&B vs Retail

Behaviour

When people are here
Top Pages
Most viewed pages in this period.
Sources
Where visits came from.
Dead clicks
People clicking something that does nothing.
Rage clicks
Repeated fast clicks on the same spot.
Scroll depth
How far down each page a typical visit gets. Median rather than average, because a handful of people reaching the footer flatters the average.
Page Typical depth Reached bottom Visits
Click heatmap
Blue is an ordinary click, red is a click that did nothing. Needs a few hundred clicks on a page before a pattern is worth reading.
Pick a page to see where people click.

Analytics

Catalogue

Prices and images shown on kellystudio.work. A change here updates every page that shows the product, within a minute.
Product Category Was Price Shown as
Loading...

Forms

Your website forms
Changes to a form appear on kellystudio.work within a minute. No deploy needed.
Loading...
Reference Received Source Details Status
Loading...

Blog

Posts appear on kellystudio.work/blog automatically once their publish time passes. Times are Malaysia time (GMT+8).
Title Status Publish Category
Loading...

Admin Users

Email Role Created
Loading...

Backend Documentation

Architecture

Express.js REST API running inside a Docker container (kellypos-backend-app-1) on an Exabytes VPS. PostgreSQL runs in the kellypos-postgres container on the same VPS and the same Compose network, reachable only from inside it. Postgres user and database are both simplepos, not kellypos.

Environment variables are loaded from backend/.env.local, not .env, and only when the container is created. A docker restart will not pick up a new variable; docker compose up -d is required.

Sync model: Offline-first. The Android app stores everything locally in Room (SQLite), then pushes/pulls deltas using updated_at epoch-ms timestamps as the cursor.

VPS & Deployment

IP45.127.5.203
SSH Port8288
Containerkellypos-backend-app-1
Deploy path/root/kellypos-backend/ — build context is the backend/ subfolder, so only files under /root/kellypos-backend/backend/ survive a rebuild
Deploying a fileTwo steps, never one: scp to the host path above, then docker cp that same file into /app/.... Verify with docker exec ... grep -c against the CONTAINER path, never the host one.
Rebuilddocker compose up -d --build
Logsdocker logs kellypos-backend-app-1 --tail 100 -f
Restartdocker restart kellypos-backend-app-1 — needed for anything under api/ or lib/. Static files in public/ are read per request and need no restart.

⚠ Never touch the byondwave user or their containers on this VPS.

⚠ kellypos-api is an OLD, stopped duplicate at /home/kellypos/docker/kellypos-api/, predating the June 2026 migration. Never deploy to it, tail its logs, or restart it: it fights the live container for the pos.kellystudio.work route.

API Endpoints

Endpoint Method Description
/api/auth/loginPOSTLogin with username + password. Returns JWT.
/api/auth/signupPOSTCreate new store + owner account.
/api/auth/forgotPasswordPOSTSend password reset email.
/api/auth/resetPasswordPOSTReset password using token from email.
/api/auth/versionGETReturns latest APK version info.
/api/sync/pushPOSTAndroid pushes local changes to server (upsert by sync_id).
/api/sync/pullGETAndroid fetches all records updated after ?since=epoch_ms.
/api/settings/infoGET/POSTRead/update store info and subscription status.
/api/uploadPOSTUpload item/payment method images. Served at /uploads/filename.

Database Tables

Table Description
storesOne row per merchant. Holds subscription dates, currency, order types.
employeesLogin accounts. username = email. pin = till PIN. Owner created at signup.
itemsMenu/product items. show_on_sales_tab controls checkout visibility. Soft-deleted.
salesTransactions. is_paid=false = Pay Later outstanding.
sale_itemsLine items per sale. Cascade-deletes when parent sale is deleted.
pos_sessionsCash drawer open/close sessions with opening/closing balances.
customersCustomer directory. Soft-deleted.
payment_methodsConfigurable payment methods per store.
modifier_groups / modifier_optionsItem modifiers e.g. Size → Small/Large.
tax_rules, pricing_rules, promotion_rulesStore-level tax and discount configuration.

All synced tables use sync_id (device-generated UUID) as primary key — not the local Room autoincrement id — to avoid collisions across devices.

Database Operations

Find a merchant by email:

SELECT id, store_id, name FROM employees WHERE username = 'email@example.com'

Clear a store's sales & sessions:

DELETE FROM sales WHERE store_id = '<store_id>';
DELETE FROM pos_sessions WHERE store_id = '<store_id>';
-- sale_items auto-deletes via ON DELETE CASCADE

APK Version Management

Update these env vars in /root/kellypos-backend/backend/.env.local when releasing a new APK. Note .env.local, not .env: the app never reads .env, so appending there does nothing at all.

LATEST_VERSION_CODE=2
LATEST_VERSION_NAME=1.1.0
LATEST_APK_URL=https://...
LATEST_RELEASE_NOTES=Bug fixes and improvements

The Android app checks /api/auth/version on launch and prompts the user to update if latestVersionCode is higher than the installed build.

Env vars are read only when the container is CREATED. After editing, run docker compose up -d --build — a docker restart will not pick them up. Verify with docker exec kellypos-backend-app-1 printenv | grep LATEST_.

Publishing only makes a build available. Merchants still install it by hand from Settings → App Update, so a terminal can sit on an old version indefinitely.

Environment Variables

Variable Description
DATABASE_URLPostgreSQL connection string
JWT_SECRETSecret for signing/verifying JWTs
RESEND_API_KEYResend.com API key for transactional emails
LATEST_VERSION_CODEInteger version code of latest APK
LATEST_VERSION_NAMEHuman-readable version name e.g. 1.0.0
LATEST_APK_URLPublic download URL for the latest APK
LATEST_RELEASE_NOTESShort release notes shown in-app on update prompt

Changelog

Date Category What changed By
Loading...
Click any row to read the full entry.

Roadmap

What is planned, who owns it and how far along it is.
Loading...
Click any task to update its dates, progress or status. The red line is today.
LHDN Malaysia

e-Invoice

LHDN MyInvois. Kaunter acts as each merchant's intermediary.

Kaunter credentials

Stores

Storee-InvoiceTINConnection ValidFailedLast sent
Loading...
Switching a store on only shows e-Invoice in that merchant's dashboard. The merchant then fills in Settings > e-Invoice and must add Kaunter's TIN as their intermediary in their own MyInvois portal before anything can be sent.

DealVault

Open DealVault
Loading…

App Releases

Publish a till update to your test stores first, check it on a real till, then release it to everyone. Tills on 1.7.6 or later show an update bar on their own; older tills only see it under Settings > App Update. From 1.7.8, required updates block new sales once their deadline passes.

Test stores

New release (goes to test stores first)

Required: the till shows an orange bar with the deadline, then blocks new sales once it passes (a bill in progress can be finished, offline tills keep selling, and staff get one 1-hour extension). Needs till 1.7.8 or later.
Version Status Notes
Loading...

APK Builds

Android builds only — kept separate from logos/images below. Direct download links, no login required to open them (uploads are public).

File Size Added
Loading...

Files

Everything else sitting in the shared uploads volume — logos, product images. Direct download links, no login required to open them (uploads are public).

File Size Added
Loading...
Kelly Studio

Delivery Order

ItemQuantity
Kelly Studio
Kelly Studio

Quotation

Michael Kelly
Director, Kelly Studio
Kelly Studio

Inventory Pre-Dispatch Checklist

Date:

Order / Customer

Order ID / SO #
Customer / Company name
Customer ID
Fiuu ID
Contact person name and phone number
Delivery address
Billing email

Shipment

Courier (DHL/J&T/etc.)
Shipping service level (standard/express)
Tracking number (fill when created)
Dispatch date
Requested delivery date (if any)

Device / Package

Device model
Device serial number
SKU / bundle type
Included add-ons list
Qty

Internal

Prepared by
Notes / exceptions
Checked by
Name: ________________________
Signature: ____________________
Date: ________________________