KasBot adalah bot WhatsApp berbasis AI yang membantu pelaku UMKM Indonesia mencatat transaksi keuangan secara otomatis melalui teks, foto struk, maupun voice note β tanpa perlu aplikasi tambahan.
- π Pencatatan Teks β Catat transaksi cukup dengan ketik pesan natural seperti "jual ayam 10 ekor @50000"
- πΌοΈ OCR Foto Struk β Foto struk kasir langsung diproses dan dicatat otomatis via Google Vision API
- ποΈ Voice Note β Rekam transaksi dengan suara, ditranskripsi via OpenAI Whisper
- π§ AI Extraction β Gemini AI mengekstrak item, qty, satuan, harga, diskon, dan pajak secara otomatis
- π€ Onboarding Personalisasi β Setup profil bisnis via percakapan WA (nama bisnis, kategori, bahan baku utama)
- π CFO Virtual β Laporan transaksi otomatis dikirim balik ke user setiap pencatatan beserta sisa token
β οΈ Anomaly Detection β Deteksi otomatis jika ada transaksi yang tidak wajar dibanding histori- πͺ Token System β Setiap aktivitas (teks/foto/voice note) menggunakan 1 token; voice note dihitung per 15 detik
| Layer | Teknologi |
|---|---|
| WhatsApp Interface | Node.js + Baileys |
| AI Extraction | Google Gemini (configurable via env) |
| OCR Struk | Google Cloud Vision API |
| Speech to Text | OpenAI Whisper |
| Database | Supabase (PostgreSQL) |
| Queue System | BullMQ + Redis |
| Process Manager | PM2 |
| Runtime | Node.js v22+ |
kasbot/
βββ src/
β βββ config/
β β βββ supabase.js # Koneksi Supabase terpusat
β βββ modules/
β β βββ ai-engine/
β β β βββ ai.listener.js # Orchestrator utama (onboarding, tier, AI)
β β β βββ ai.service.js # Integrasi Gemini AI
β β βββ anomaly/
β β β βββ anomaly.service.js # Deteksi anomali transaksi (Z-score)
β β βββ cfo-virtual/
β β β βββ cfo.listener.js # Format & kirim laporan ke user
β β βββ finance/
β β β βββ finance.listener.js # Simpan transaksi ke Supabase
β β βββ media/
β β β βββ media.listener.js # Handler OCR & STT
β β β βββ ocr.service.js # Google Vision API
β β β βββ stt.service.js # OpenAI Whisper
β β βββ onboarding/
β β β βββ onboarding.service.js # Alur onboarding 4 langkah via WA
β β βββ tier/
β β β βββ tier.service.js # Manajemen token & plan
β β βββ whatsapp/
β β βββ whatsapp.service.js # Koneksi & listener WhatsApp
β βββ api/
β β βββ routes/
β β βββ admin.routes.js # Manajemen token & plan (admin)
β β βββ auth.routes.js
β β βββ transaksi.routes.js
β β βββ laporan.routes.js
β β βββ anomali.routes.js
β β βββ stats.routes.js
β β βββ user.routes.js
β β βββ wa.routes.js
β βββ shared/
β βββ errorHandler.js # Global error handler
β βββ eventBus.js # Event bus antar modul
β βββ logger.js # Logger dengan level kontrol
β βββ queue.js # BullMQ queue definitions
β βββ redis.js # Redis client + cache helpers
β βββ scheduler.js # Scheduler harian/mingguan
β βββ queue.worker.js # BullMQ workers
βββ logs/ # PM2 log output (auto-generated)
βββ ecosystem.config.cjs # Konfigurasi PM2
βββ migration_final.sql # Schema database Supabase
βββ .env.example # Template environment variables
βββ server.js # Entry point
git clone https://github.com/adhidevara/kasbot.git
cd kasbot
npm install
npm install -g pm2cp .env.example .envIsi .env:
SUPABASE_URL=
SUPABASE_KEY=
GEMINI_API_KEY=
GOOGLE_VISION_API_KEY=
OPENAI_API_KEY=
ADMIN_WA=628xxxxxxxxxx@s.whatsapp.net
# Model Gemini: gemini-2.0-flash-lite-001 | gemini-2.0-flash | gemini-2.5-flash-lite
GEMINI_MODEL=gemini-2.5-flash-lite
# Redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
# Level log: silent | error | warn | info | verbose
LOG_LEVEL=infodocker run -d -p 6379:6379 redis:alpineJalankan migration_final.sql di Supabase β SQL Editor. File ini mencakup seluruh schema termasuk token system. Jika DB sudah ada sebelumnya, bagian PATCH di bawah file tersebut aman dijalankan ulang (IF NOT EXISTS).
Development:
npm run devProduction (dengan PM2):
npm run prodScan QR yang muncul di terminal dengan WhatsApp β Perangkat Tertaut.
npm run prod # Jalankan production (LOG_LEVEL=warn, auto-restart)
npm run dev # Jalankan development (LOG_LEVEL=verbose)
npm run stop # Hentikan bot
npm run restart # Restart bot
npm run logs # Lihat log realtime
npm run status # Cek status botPesan WA masuk (teks / foto / voice note)
β
Masuk ke BullMQ Queue
β
Cek onboarding & token user
β
Media processing (OCR / STT jika perlu)
β
AI Gemini ekstrak transaksi β JSON
β
Deduct token user
β
Simpan ke Supabase (transaksi + detail + penyesuaian)
β
CFO Virtual kirim laporan + sisa token ke user
β
Anomaly detection (plan Starter/Business)
Setiap aktivitas pengguna menggunakan token:
| Aktivitas | Token |
|---|---|
| Input teks | 1 token |
| Scan foto struk | 1 token |
| Voice note 1β15 detik | 1 token |
| Voice note 16β30 detik | 2 token |
| Voice note 31β45 detik | 3 token |
Token tidak dikurangi jika AI gagal mengenali transaksi.
| Plan | Harga | Token/Bulan | Anomali Detection | Insight Mingguan |
|---|---|---|---|---|
| Trial | Gratis 14 hari | 50 token | β | β |
| Starter | Rp 99.000/bulan | 300 token | β | β |
| Business | Rp 249.000/bulan | 1.000 token | β | β |
Token di-reset manual oleh admin. Top-up tersedia via API admin.
| Method | Endpoint | Deskripsi |
|---|---|---|
| POST | /api/auth/register |
Daftarkan user baru (bypass onboarding WA) |
| POST | /api/auth/login |
Login via email atau nomor WA |
| POST | /api/auth/set-password |
Tambah email & password untuk akun WA onboarding |
| POST | /api/auth/change-password |
Ganti password |
Digunakan untuk mendaftarkan user secara langsung (misal user beta / jalur VIP) tanpa perlu onboarding via WhatsApp. User yang didaftarkan lewat endpoint ini akan langsung menerima sapaan personal dari Nata saat pertama kali chat.
{
"nama": "Budi Santoso",
"nama_bisnis": "Warung Budi",
"email": "budi@email.com",
"password": "password123",
"nomor_wa": "628123456789",
"kategori_bisnis": "Warung/Toko Kelontong",
"bahan_baku": ["beras", "minyak", "gula"],
"alamat": "Jl. Mawar No. 10, Surabaya",
"plan": "trial"
}Field wajib: nama, nama_bisnis, email, password, kategori_bisnis
Field opsional: nomor_wa, bahan_baku, alamat, plan (default: trial)
Response:
{
"success": true,
"token": "<jwt>",
"user": {
"id": "uuid",
"nama": "Budi Santoso",
"nama_bisnis": "Warung Budi",
"email": "budi@email.com",
"nomor_wa": "628123456789@s.whatsapp.net",
"kategori_bisnis": "Warung/Toko Kelontong",
"alamat": "Jl. Mawar No. 10, Surabaya",
"plan": "trial",
"token_balance": 15,
"trial_ends_at": "..."
}
}{ "email": "budi@email.com", "password": "password123" }
// atau
{ "nomor_wa": "628123456789", "password": "password123" }| Method | Endpoint | Deskripsi |
|---|---|---|
| GET | /api/users |
List semua pengguna (admin) |
| POST | /api/users/register |
Daftarkan pengguna via WA saja (admin, tanpa email/password) |
| GET | /api/users/:nomorWa |
Profil pengguna |
| PATCH | /api/users/:nomorWa |
Update profil pengguna |
| GET | /api/users/:nomorWa/plan |
Status plan & kuota token |
| PATCH | /api/users/:nomorWa/plan |
Upgrade/downgrade plan (admin) |
| DELETE | /api/users/:nomorWa |
Hapus pengguna (admin) |
Field yang dapat diupdate: nama, nama_bisnis, kategori_bisnis, bahan_baku, threshold_alert, alamat
{ "alamat": "Jl. Melati No. 5, Bandung" }| Method | Endpoint | Deskripsi |
|---|---|---|
| GET | /api/admin/user/:nomorWa |
Info user + token |
| POST | /api/admin/token/topup |
Top-up token user |
| POST | /api/admin/plan/set |
Set plan user |
Contoh top-up:
POST /api/admin/token/topup
{ "nomor_wa": "6282264226680", "jumlah": 100 }User: jual ayam 10 ekor @50000
Bot: π° LAPORAN CFO KASBOT
Tipe: PEMASUKAN
Item:
- Ayam (10 ekor) β Rp50.000/satuan
Total Bayar: Rp500.000
πͺ Token tersisa: 49
User: [kirim foto struk Indomaret]
Bot: π Sedang membaca struk Anda...
πΈ LAPORAN CFO KASBOT
Tipe: PENGELUARAN
Total Bayar: Rp76.300
π·οΈ Potongan: Diskon Member -Rp2.000
πͺ Token tersisa: 48
| Skala | Status | Implementasi |
|---|---|---|
| 1β20 user | β Done | PM2 auto-restart, LOG_LEVEL=warn |
| 20β50 user | β Done | BullMQ + Redis queue, state ke Supabase |
| 50β100 user | π Planned | WA Business API, Redis cache, connection pooling |
| 100+ user | π Planned | Multi-instance, load balancer, migrate dari Baileys |
Dokumen konfidensial β hanya untuk kalangan internal tim pendiri.
Lisensi Business Source License 1.1 (BSL):
- β Trial-Use untuk penggunaan non-komersial (personal, edukasi, riset)
- π³ Berbayar untuk penggunaan komersial (SaaS, produk, layanan berbayar)
- π Otomatis menjadi MIT License pada 1 Januari 2028
Untuk lisensi komersial, hubungi pemilik proyek.