Absensi & Rekap Penjualan Outlet dalam Satu Aplikasi — attendance, sales recap and light accounting for outlets, in one app.
Lapakin is a multi-tenant B2B SaaS (mobile-first PWA, Bahasa Indonesia) for businesses with outlets and field salespeople. Salespeople clock in and out with a live photo and recorded location, then submit a balanced shift sales report built from the products and prices their Admin has set up, including operational spending paid from the day's cash. Admins see total omzet, keep the books (expenses, costs, invoices, vendor bills) with an auto-generated balance sheet, and review and export employee timesheets. Each business (tenant) manages its own data in isolation and pays a prepaid monthly subscription from a balance topped up by the platform operator.
First tenant: SOYAH (Soya Milk & Bean Curd).
Status
Live at https://lapakin.alvianzf.id. Built from the specs in docs/specs/ (v2.3):
| Area | State |
|---|---|
| Tenancy, auth, users, outlets, cover shifts, attendance, products, sales reports, budgets, dashboards, audit log | Live |
| Subscription, prepaid wallet, daily billing job, platform console | Live |
| Accounting (journal, Neraca, Laba Rugi, Buku Besar, period close, Excel/PDF) | Live |
| Invoicing, vendor bills, contacts, aging, invoice PDF | Live |
| Timesheets (Rekap Absensi, clock-out correction, Excel/PDF) | Live |
| Installable PWA, offline queue for clock-in/out and reports | Live (see limits in 12) |
| Report approval before accounting + auto-approve setting | Live (06 §5a) |
| QRIS receipts: required for QRIS sales, amount read automatically (local OCR, no external AI), doubtful reads flagged | Built, online only; gaps in 18 §15 |
Stack: Next.js 16, React 19, TypeScript, Tailwind 4, PostgreSQL with row-level security (PGlite in tests), Drizzle, Vitest. Deployed by GitHub Actions to a single server behind Cloudflare and nginx.
For salespeople
- Live-photo + GPS clock in/out, no geofencing
- Catalog-driven sales form: quantities only, prices set by the Admin
- Blocking balance validation (sales = payments; setoran = cash − spending; a negative setoran is allowed and treated as a reimbursement)
- QRIS sales need receipts: upload the payment screenshots or photos, the amount fills in automatically, doubtful ones are flagged to check; the receipts must add up to the QRIS total
- Own performance and timesheet only; no rankings
For Admins
- Omzet and sales dashboards, cross-outlet and salesperson rankings (Admin only), heatmap of clock locations
- Accounting: record expenses and costs; balance sheet (Neraca) and income statement generated automatically from sales reports, spending, invoices and vendor bills; filter by month or date range; export to Excel and PDF
- Invoicing: create customer invoices, download as PDF, track payments; record vendor/distributor bills to pay, which flow into the balance sheet
- Timesheets: every employee's attendance summary and daily detail, exported to Excel and PDF
- Products, prices, outlets, cover shifts (Shift Pengganti), users, budgets, audit log
- Inline-editable data tables: click a cell to edit, + to add a row
Platform
- Multi-tenant with strict data isolation; tenants created by the Platform Superadmin
- Offline queue, installable PWA, low-end Android friendly
- Prepaid billing: Basic Rp 50.000 (3 outlets, +Rp 10.000 each, pro-rata) or Unlimited Rp 100.000; 3 days grace, then 7 days read-only. No free trial.
Documentation
Detailed specifications by domain: docs/specs/
| Domain | Spec |
|---|---|
| Tenancy & settings | 01 |
| Identity, auth & users | 02 |
| Outlets & cover shifts | 03 |
| Attendance | 04 |
| Products & pricing | 05 |
| Sales report | 06 |
| Budgets | 07 |
| Dashboards, rankings, maps, export | 08 |
| Subscription & billing | 09 |
| Platform admin | 10 |
| Audit log | 11 |
| Mobile UI, PWA, offline | 12 |
| Non-functional | 13 |
| Accounting & balance sheet | 14 |
| Invoicing & vendor bills | 15 |
| Employee timesheets | 16 |
| Data tables | 17 |
| QRIS receipt reader | 18 |
| Open questions | 99 |