Bot auto-order untuk Telegram & Discord, terintegrasi dengan KlikQRIS (QRIS Indonesia).
Pelanggan tinggal scan QR — produk dikirim otomatis lewat DM begitu pembayaran masuk.
- Fitur
- Cara Kerja
- Tech Stack
- Quick Start
- Setup Repo GitHub — buat preview embed yang muncul saat di-share
- Cara Dapat Kredensial
- Konfigurasi
.env - Setup Wizard (
npm run setup) - Webhook Public URL
- Owner System
- Admin Dashboard
- Analytics
- Admin Commands (Bot)
- Struktur Project
- Perintah Bot
- Deploy ke Production
- Roadmap
- Kontribusi
- License
- Multi-platform: Telegram + Discord dari satu codebase, satu database, satu webhook.
- QRIS dinamis: tiap order dapet QR unik via API KlikQRIS, scan pakai e-wallet apa pun (GoPay, OVO, Dana, ShopeePay, m-banking, dll).
- Auto-deliver: stok (akun, license key, voucher, file) otomatis dikirim ke DM pembeli setelah pembayaran terkonfirmasi.
- Inline button UX: bot pakai tombol interaktif (gak perlu hafalin command) — Telegram InlineKeyboard, Discord ButtonBuilder + SelectMenu.
- Setup wizard:
npm run setupbuka browser otomatis ke form web yang ngisi.envuntuk kamu — gak perlu edit file manual. - Owner-aware bots: bot kenal siapa owner-nya. Owner otomatis admin + dapet notifikasi (bot online, order baru, delivery gagal). Slash command
/whoamiuntuk cek role. - Admin web dashboard: kelola produk, stok, order, plus halaman analytics (chart revenue 30 hari, top produk, breakdown per platform).
- Admin bot commands: kelola toko langsung dari Telegram/Discord — tambah produk, restok, lihat orderan, kirim ulang produk yang gagal terkirim.
- Idempotent webhook: pengecekan status di DB mencegah kirim produk dobel kalau callback masuk berulang.
- Signature validation: webhook divalidasi dengan signature yang disimpan saat create transaction (anti fake-callback).
- Stock management: alokasi stok pakai DB transaction, anti race condition kalau dua orang beli barengan.
- Retry-safe delivery: kalau DM gagal terkirim, stok tetap teralokasi dan admin bisa kirim ulang dari dashboard tanpa double-claim stok.
- Auto-expire: order PENDING yang lewat waktu otomatis di-mark EXPIRED via cron job (jalan tiap 1 menit).
- Rate limiting:
/admin/logindi-protect dari brute force (max 10 attempt per 5 menit per IP). - Graceful degradation: bot tetap jalan walau kredensial KlikQRIS belum diisi (cuma
/buyyang gagal sampai diisi). - Configurable: SQLite untuk dev, tinggal ganti
DATABASE_URLke Postgres untuk production.
┌─────────────┐ ┌─────────────┐
│ Telegram │ │ Discord │
│ pelanggan │ │ pelanggan │
└──────┬──────┘ └──────┬──────┘
│ /buy <id> │ /buy product_id:<id>
▼ ▼
┌─────────────────────────┐
│ botnot core │
│ (Fastify + grammy + │
│ discord.js) │
└────┬───────────────┬────┘
│ │
│ create │ store order
▼ ▼
┌──────────┐ ┌──────────┐
│ KlikQRIS │ │ Database │
└────┬─────┘ └────▲─────┘
│ webhook PAID │ update + allocate stok
└────────────────┘
│
▼ DM pembeli
┌─────────┐
│ Produk │
│ terkirim│
└─────────┘
- Pembeli ketik
/buy <product_id>di Telegram atau Discord. - Bot panggil
/qris/createke KlikQRIS, simpansignature&total_amountdi DB. - Bot kirim gambar QR + nominal + waktu kadaluarsa ke pembeli.
- Pembeli scan QR, bayar pakai e-wallet apa pun.
- KlikQRIS hit
POST /webhook/klikqrisdi server kamu. - Webhook handler:
- Validasi signature.
- Cek idempotency (kalau sudah
PAID, abaikan). - Update status order ke
PAID. - Alokasi stok dalam DB transaction.
- Kirim produk lewat DM Telegram/Discord.
| Layer | Tool |
|---|---|
| Runtime | Node.js 20+ (ESM, NodeNext) |
| Bahasa | TypeScript 5 |
| Telegram bot | grammy |
| Discord bot | discord.js v14 |
| HTTP server | Fastify v5 |
| ORM | Prisma |
| DB | SQLite (dev) / PostgreSQL (prod) |
| Validasi env | zod |
| Logging | pino + pino-pretty |
| HTTP client | axios |
Butuh Node.js 20+ dan npm (atau pnpm/yarn).
Cara paling cepat (recommended) — 4 command:
git clone https://github.com/mocasus/botnot.git
cd botnot
npm install
npm run setup # bikin .env, migrate DB, buka browser otomatis ke form confignpm run setup ngerjain ini semua otomatis:
- Bikin
.envdari.env.example(kalau belum ada) - Migrate database (
prisma db push) - Start dev server
- Auto-buka browser ke
http://localhost:3000/setup— form web untuk isi semua kredensial
Halaman pertama yang muncul = Setup Wizard di
/setup. Bukan dashboard. Dashboard baru aktif setelah kamu isiADMIN_USERNAME&ADMIN_PASSWORDdi form ini, lalu restart server.
# 1. Stop dev server yang lagi jalan
Ctrl+C
# 2. Restart untuk apply config baru
npm run dev
# 3. Buka dashboard
# http://localhost:3000/admin
# Login pakai username/password yang barusan kamu setSekarang baru kamu lihat Admin Dashboard dengan desain modern (glass-morphism, dark theme, mobile responsive).
Cara manual (kalau mau edit .env langsung):
cp .env.example .env
# edit .env pakai editor favorit kamu (panduan lengkap di "Cara Dapat Kredensial")
npm run db:push
npm run db:seed # opsional: isi contoh produk
npm run devKalau habis update kode tapi UI dashboard masih kelihatan lama:
# 1. Pastikan branch up-to-date
git pull origin main
# 2. Reinstall deps (siapa tahu ada lockfile diff)
npm install
# 3. Hard restart dev server (bukan cuma reload browser)
Ctrl+C
npm run dev
# 4. Hard refresh browser
# Chrome/Edge: Ctrl+Shift+R (Windows) atau Cmd+Shift+R (Mac)
# Firefox: Ctrl+F5Browser sering cache TailwindCSS CDN + HTML. Hard refresh wajib.
Output kira-kira (first-run, sebelum setup):
╔════════════════════════════════════════════════════════╗
║ First-run detected — buka setup wizard di browser: ║
║ → http://localhost:3000/setup ║
║ Atau jalanin: npm run setup (auto-buka browser) ║
╚════════════════════════════════════════════════════════╝
Output setelah .env sudah dikonfigurasi:
[12:34:56] INFO: HTTP server listening port=3000
[12:34:56] INFO: Admin dashboard ready url=http://localhost:3000/admin
[12:34:57] INFO: Telegram bot started username=botnot_bot
[12:34:58] INFO: Discord slash commands registered scope=guild count=10
[12:34:58] INFO: Discord bot ready tag=botnot#1234
Buka chat Telegram dengan bot kamu, ketik /start — siap testing!
Kalau kamu fork repo ini, default tampilan saat link repo di-share di Discord / Twitter / WhatsApp / Telegram cuma muncul nama repo + URL polos, tanpa preview gambar atau deskripsi yang menarik. Itu karena GitHub default-nya tidak meng-generate Open Graph image otomatis.
Berikut langkah-langkah biar repo kamu punya preview embed yang bagus saat di-share:
Buka https://github.com/<username>/botnot → klik gear icon ⚙️ di samping About (kanan atas, pojok header repo).
Description:
Auto-order Telegram & Discord bot dengan integrasi KlikQRIS. Pelanggan scan QR, produk auto-deliver ke DM. Built with TypeScript, Fastify, Prisma.
Website: (opsional, kalau ada demo / landing page)
https://klikqris.com
Topics (pisahkan dengan spasi):
telegram-bot discord-bot qris klikqris indonesia auto-deliver typescript prisma fastify nodejs payment-gateway
Centang:
- ✅ Releases
- ✅ Packages (kalau pakai)
- (Optional) Deployments
Klik Save changes.
Topics bantu repo kamu muncul di hasil pencarian GitHub. Description muncul sebagai subtitle saat link repo di-share.
Ini yang paling penting — gambar 1280×640px yang muncul sebagai card preview saat link repo di-paste di Discord / Twitter / Telegram / WhatsApp.
- Settings → General (default tab) → scroll ke section Social preview
- Klik Edit → Upload an image...
- Pilih file
assets/social-preview.pngdari repo ini (sudah disediakan, 1280×640, design konsisten dengan dashboard) - Klik Save
Kalau mau bikin custom social preview pakai branding kamu sendiri, edit
assets/social-preview.svg, lalu convert ke PNG:# Install cairosvg pip install cairosvg # Convert SVG -> PNG (1280x640 sesuai standar GitHub) python3 -c " import cairosvg cairosvg.svg2png(url='assets/social-preview.svg', write_to='assets/social-preview.png', output_width=1280, output_height=640) "
Setelah upload, test apakah preview-nya jalan:
- Discord: paste URL repo di chat, tunggu ~5 detik
- Twitter / X: pakai Card Validator
- Facebook / WhatsApp: pakai Sharing Debugger
- Telegram: paste URL di chat (kalau belum muncul, send
/setlinkpreviewdulu) - LinkedIn: pakai Post Inspector
GitHub & social media platforms cache image cukup agresif. Kalau habis update social preview tapi belum berubah:
- GitHub camo cache: tunggu 5-10 menit, atau force refresh dengan rename file (
social-preview-v2.png) lalu re-upload - Twitter / Facebook: pakai validator/debugger untuk force re-fetch
- Discord: cache per-channel, biasanya 1-2 jam. Edit pesan atau paste di channel lain untuk test
- Browser cache: hard refresh (
Ctrl+Shift+R/Cmd+Shift+R)
Setelah setup, link https://github.com/<username>/botnot di-share akan muncul sebagai card berisi:
- 🖼️ Gambar preview 1280×640 (botnot branding + tagline)
- 📝 Title:
<username>/botnot - 📄 Description:
Auto-order Telegram & Discord bot dengan integrasi KlikQRIS... - 🔗 Link:
github.com
- Buka aplikasi Telegram, search
@BotFatherdan mulai chat. - Kirim perintah:
/newbot - BotFather minta 2 hal:
- Display name (bebas, misal:
Toko Otomatis) - Username (harus unik & diakhiri
bot, misal:tokootomatis_bot)
- Display name (bebas, misal:
- BotFather balas dengan token format:
Copy token ini ke
123456789:ABCdefGhIJklmNOpqrSTUvwxYZ-1234567890TELEGRAM_BOT_TOKENdi.env. - Opsional — biar bot keliatan rapi:
/setdescription— deskripsi bot/setuserpic— kirim gambar untuk avatar/setcommands— daftar command yang muncul di tombol menu, contoh:start - Mulai catalog - Lihat daftar produk buy - Beli produk
- Buka Discord Developer Portal dan login.
- Klik
New Application, kasih nama (misal:Botnot), klik Create. - Di sidebar pilih
Bot:- Klik
Reset Token→ copy token-nya. Token cuma muncul sekali! Simpan keDISCORD_BOT_TOKEN. - (Opsional) Matikan toggle
Public Botkalau bot ini private.
- Klik
- Di sidebar pilih
General Information:- Copy
Application ID→ ini yang kita pakai sebagaiDISCORD_CLIENT_IDdi.env.
- Copy
- Invite bot ke server kamu:
- Sidebar →
OAuth2→URL Generator. - Centang scope:
bot,applications.commands. - Centang Bot Permissions:
Send Messages,Embed Links,Attach Files,Use Slash Commands. - Copy URL yang dihasilkan, buka di browser, pilih server, klik Authorize.
- Sidebar →
- Opsional — Guild ID untuk testing cepat:
- Slash command global butuh waktu propagasi sampai 1 jam. Untuk dev, daftarkan ke 1 guild aja biar instan.
- Aktifkan Developer Mode: Discord → Settings → Advanced → Developer Mode ON.
- Right-click icon server kamu → Copy Server ID → paste ke
DISCORD_GUILD_IDdi.env. - Untuk production, kosongkan
DISCORD_GUILD_IDbiar pakai global commands.
Catatan penting Discord: bot hanya bisa kirim DM ke user yang berbagi minimal satu server dengan bot. Buat server "lobby" dan minta pelanggan join sebelum membeli, atau kirim hasil order ke channel publik dengan @mention sebagai fallback.
- Daftar/login akun merchant di klikqris.com.
- Buka dashboard merchant, copy:
x-api-key→ isi keKLIKQRIS_API_KEYid_merchant→ isi keKLIKQRIS_MERCHANT_ID
- Daftarkan Webhook URL kamu di dashboard, format:
https://<domain-public-kamu>/webhook/klikqris - JANGAN PERNAH commit
.envke git. File.gitignoresudah meng-ignore.env*(kecuali.env.example).
Tip: pakai Setup Wizard (
npm run setup) untuk isi semua ini lewat form web — lebih gampang daripada edit manual.
NODE_ENV=development
PORT=3000
# KlikQRIS — boleh dikosongkan untuk dev, /buy gagal sampai diisi
KLIKQRIS_API_BASE=https://klikqris.com/api
KLIKQRIS_API_KEY= # x-api-key dari dashboard
KLIKQRIS_MERCHANT_ID= # id_merchant
# Telegram — kosongkan untuk disable
TELEGRAM_BOT_TOKEN= # dari @BotFather
# Discord — kosongkan untuk disable
DISCORD_BOT_TOKEN= # dari Developer Portal > Bot
DISCORD_CLIENT_ID= # = Application ID
DISCORD_GUILD_ID= # opsional, isi untuk dev (slash command instan)
# Owner — primary admin yg dapet notifikasi event penting (bot online, sales, delivery fail)
# Owner OTOMATIS termasuk admin, gak perlu didouble di ADMIN_*_IDS.
OWNER_TELEGRAM_ID= # numeric ID, dapet dari @userinfobot
OWNER_DISCORD_ID= # numeric ID, Developer Mode > Copy User ID
# Admin tambahan (selain owner) untuk bot commands
ADMIN_TELEGRAM_IDS= # contoh: 12345,67890
ADMIN_DISCORD_IDS= # contoh: 1112,3334
# Admin web dashboard — kosongkan ADMIN_USERNAME untuk disable + auto-aktifin /setup
ADMIN_USERNAME=
ADMIN_PASSWORD=
ADMIN_SESSION_SECRET= # generate: openssl rand -hex 32 (atau setup wizard auto-gen)
# Database
DATABASE_URL="file:./dev.db"
# Webhook
PUBLIC_BASE_URL= # contoh: https://abc123.ngrok.ioForm web di /setup untuk ngisi semua env vars tanpa edit .env manual.
Cara pakai:
npm run setupYang terjadi:
- Auto-create
.envdari.env.examplekalau belum ada - Migrate database (
prisma db push) — bikin tabel SQLite kalau belum ada - Start server
- Auto-buka browser ke
http://localhost:3000/setup(cross-platform: macOS/Linux/Windows) - Form punya section: Server, KlikQRIS, Telegram, Discord, Owner, Admin tambahan, Web Dashboard, Database
- Kalau lupa generate session secret, ada tombol Generate yang bikin string random
- Submit →
.envlama di-backup (.env.bak.<timestamp>) → file baru ditulis dengan format rapi - Pesan konfirmasi muncul, instruksi restart (Ctrl+C →
npm run dev)
Kapan setup wizard aktif:
- Selalu aktif di
NODE_ENV=development(boleh re-config kapan aja) - Aktif kalau
ADMIN_USERNAMEbelum diset (first-run detection) - Otomatis disabled di production yang sudah configured —
/setupredirect ke/admin/login
Security:
- Hanya key di allowlist yang ditulis (anti-injection)
- Validasi minimal (password ≥ 8 karakter, username wajib)
- Backup
.envlama sebelum overwrite - Sensitive values (token, password, secret) dilog sebagai
<set>/<empty>aja
Bisa diakses langsung tanpa wizard launcher: kalau server udah jalan via npm run dev, tinggal buka http://localhost:3000/setup di browser.
KlikQRIS perlu URL public untuk kirim callback. Untuk testing lokal, pakai tunnel:
Pakai ngrok:
# install: https://ngrok.com/download
ngrok http 3000
# copy URL https://xxxx.ngrok.io
# daftarkan https://xxxx.ngrok.io/webhook/klikqris di dashboard KlikQRISPakai Cloudflare Tunnel (gratis, tanpa daftar):
cloudflared tunnel --url http://localhost:3000Untuk production: deploy ke VPS / Railway / Fly.io / Render dan pakai domain HTTPS milik kamu.
Bot kenal siapa owner-nya — primary admin yang dapat perlakuan khusus.
Setup owner:
Cukup isi OWNER_TELEGRAM_ID dan/atau OWNER_DISCORD_ID di .env (atau via setup wizard).
# Cara dapat numeric user ID:
# Telegram: chat @userinfobot, dia kirim ID-mu
# Discord: Settings > Advanced > Developer Mode ON, klik kanan profil > Copy User ID
OWNER_TELEGRAM_ID=123456789
OWNER_DISCORD_ID=987654321098765432Apa yang owner dapet otomatis:
| Event | Notifikasi ke owner |
|---|---|
| Bot online (saat startup) | "Bot Online — siap menerima order" |
| Order PAID + delivered | "Penjualan baru: produk X x2, Rp50.000, by @user" |
| Delivery gagal | "Delivery GAGAL — order X, error: ..., cek dashboard" |
Owner = Admin (otomatis):
Owner ID otomatis ditambahkan ke daftar admin, jadi punya akses semua admin commands & dashboard tanpa perlu listing dirinya 2x di ADMIN_*_IDS.
Cek role kamu sendiri:
- Telegram:
/whoami - Discord:
/whoami
Bot akan reply dengan role kamu (Owner / Admin / Customer) plus user ID + username.
Web UI untuk kelola toko dari browser. Auto-aktif saat ADMIN_USERNAME & ADMIN_PASSWORD diisi.
Setup:
# Edit .env
ADMIN_USERNAME=admin
ADMIN_PASSWORD=password-yang-kuat
ADMIN_SESSION_SECRET=$(openssl rand -hex 32)Akses: http://localhost:3000/admin → login → dashboard.
Halaman yang tersedia:
| Path | Fungsi |
|---|---|
/admin/login |
Form login |
/admin |
Stat cards (revenue today/7d/all-time, stok, count by status) + 10 order terakhir |
/admin/products |
List produk + form tambah produk + toggle aktif/nonaktif |
/admin/products/:id/stock |
Detail stok per produk + bulk add (paste banyak baris sekaligus) |
/admin/orders |
List order, filter status (Pending/Paid/Expired), tombol redeliver |
Fitur kunci:
- Bulk add stok: paste daftar akun/license/voucher di textarea, satu item per baris.
- Redeliver: kalau pembeli komplain produk gak nyampe (DM Discord blocked, dll), klik tombol Redeliver di halaman Orders. Sistem reuse stok yang sudah dialokasikan, jadi tidak double-claim.
- Indikator delivery error: order yang sudah PAID tapi DM gagal akan menampilkan jumlah percobaan + error message terakhir.
- Session: cookie HttpOnly + signed dengan
ADMIN_SESSION_SECRET, expired 7 hari.
Tip keamanan: dashboard ini sekarang sudah di-rate-limit di
/admin/login(max 10 attempt per 5 menit per IP). Untuk production, taruh tambahan reverse proxy (Caddy/Nginx) atau ekspos hanya via VPN/Tailscale.
Halaman /admin/analytics kasih insight 30 hari terakhir:
| Metrik | Visualisasi |
|---|---|
| Revenue 30 hari | Big number + line chart per hari |
| Order 30 hari | Big number |
| Average Order Value (AOV) | Big number |
| Delivery Failure Rate | Big number (warna merah kalau >5%) |
| Top 10 produk by revenue | Ranked list dengan progress bar |
| Distribusi status order | Bar breakdown (PENDING/PAID/EXPIRED) |
| Penjualan per platform | Telegram vs Discord |
Chart-nya pure SVG (gak butuh library) — render server-side. Hover dot di line chart untuk lihat angka per hari.
Selain dashboard, admin juga bisa kelola toko langsung dari chat Telegram atau Discord.
Setup:
- Dapatkan numeric user ID kamu:
- Telegram: chat
@userinfobot, dia akan kirim ID-mu. - Discord: Settings → Advanced → Developer Mode ON → klik kanan profil sendiri → Copy User ID.
- Telegram: chat
- Isi di
.env:ADMIN_TELEGRAM_IDS=123456789,987654321 ADMIN_DISCORD_IDS=111122223333,444455556666
| Command | Deskripsi |
|---|---|
/admin |
Lihat daftar admin commands |
/stats |
Statistik penjualan (revenue, count by status) |
/orders [pending|paid|expired] |
10 order terakhir, filter optional |
/products |
Daftar semua produk + stok |
/addproduct <id>|<nama>|<harga>|<deskripsi> |
Tambah produk (pisahkan dengan |) |
/addstock <product_id> (multi-line) |
Tambah stok bulk (payload di baris-baris berikutnya) |
/toggle <product_id> |
Aktifkan/nonaktifkan produk |
/redeliver <order_id> |
Kirim ulang produk untuk order tertentu |
Contoh /addstock multi-line:
/addstock NETFLIX-1B
email1@test.com|password1
email2@test.com|password2
email3@test.com|password3
Semua command admin pakai prefix /admin-. Hanya bisa diakses oleh user yang ada di ADMIN_DISCORD_IDS.
| Slash Command | Deskripsi |
|---|---|
/admin-stats |
Statistik penjualan |
/admin-orders [status] |
10 order terakhir |
/admin-products |
Daftar produk |
/admin-add-product id name price [description] [type] |
Tambah produk |
/admin-add-stock product_id payloads |
Tambah stok (payloads pisahkan ||) |
/admin-toggle product_id |
Aktif/nonaktif produk |
/admin-redeliver order_id |
Kirim ulang produk |
Contoh /admin-add-stock:
/admin-add-stock product_id:NETFLIX-1B payloads:akun1@test.com|pw1||akun2@test.com|pw2||akun3@test.com|pw3
(payload-nya pakai | internal, dan || sebagai separator antar item)
botnot/
├── assets/
│ ├── logo.svg # Banner README
│ ├── social-preview.svg # Social preview source (edit di sini)
│ └── social-preview.png # Upload ini ke GitHub Settings
├── prisma/
│ ├── schema.prisma # Product, Stock, Order
│ └── seed.ts # contoh data
├── scripts/
│ └── setup.mjs # launcher untuk `npm run setup` (auto-buka browser)
├── src/
│ ├── admin/
│ │ ├── auth.ts # role helpers (owner/admin/customer)
│ │ ├── owner.ts # notifyOwner — best-effort DM ke OWNER_*_ID
│ │ ├── service.ts # stats, CRUD produk/stok, redeliver
│ │ └── dashboard/
│ │ ├── routes.ts # Fastify routes /admin/*
│ │ ├── middleware.ts # session cookie auth
│ │ ├── layout.ts # shared HTML layout
│ │ └── pages/ # home, products, stock, orders
│ ├── setup/
│ │ ├── routes.ts # GET/POST /setup (auto-disabled when configured)
│ │ ├── page.ts # form HTML (multi-section)
│ │ └── env-writer.ts # safe .env update + backup
│ ├── bots/
│ │ ├── telegram.ts # /start /catalog /buy /whoami
│ │ ├── telegram-admin.ts # /admin /stats /orders /addstock dll
│ │ ├── discord.ts # slash commands user (/catalog /buy /whoami)
│ │ ├── discord-admin.ts # /admin-* slash commands
│ │ └── registry.ts # shared bot instances
│ ├── orders/
│ │ ├── service.ts # createOrder, markOrderPaid
│ │ └── delivery.ts # auto-deliver stok ke pembeli (retry-safe)
│ ├── payment/
│ │ ├── klikqris.ts # client API
│ │ └── webhook.ts # POST /webhook/klikqris
│ ├── products/catalog.ts
│ ├── config.ts # zod-validated env
│ ├── db.ts # prisma client
│ ├── logger.ts # pino
│ └── index.ts # entrypoint (HTTP + bots)
├── .env.example
├── package.json
└── tsconfig.json
Bot kami pakai inline buttons sebagai UX utama — pelanggan tinggal klik tombol, gak perlu hafalin command. Tapi text command tetap jalan untuk power users.
Pelanggan ketik /start → muncul menu dengan tombol:
📦 Lihat Katalog
ℹ️ Bantuan 👤 Profile
Klik Lihat Katalog → list produk muncul sebagai tombol (1 produk per baris dengan info harga + stok). Klik produk → detail + tombol qty (Beli 1, Beli 3, Beli 5). Klik beli → QR muncul + tombol 🔄 Cek Status untuk monitor pembayaran.
| Command | Deskripsi |
|---|---|
/start |
Menu utama (button-driven) |
/catalog |
Buka katalog dengan tombol-tombol |
/buy <product_id> [qty] |
Beli langsung (power user, text) |
/whoami |
Cek role kamu + user ID |
/catalog → embed dengan dropdown SelectMenu berisi semua produk. Pelanggan pilih produk → reply ephemeral dengan detail + buttons (Beli 1, Beli 3, Beli 5). Klik beli → QR dikirim + tombol Cek Status.
| Slash Command | Deskripsi |
|---|---|
/catalog |
Katalog dengan dropdown + buttons |
/buy product_id:<id> [qty:<n>] |
Beli langsung (power user) |
/whoami |
Cek role kamu + user ID |
Cara termudah: pakai Admin Dashboard di /admin/products.
Atau dari bot pakai Admin Commands seperti /addproduct (Telegram) atau /admin-add-product (Discord).
Atau via Prisma Studio:
npm run db:studio
# buka http://localhost:5555, edit tabel Product & StockAtau edit prisma/seed.ts lalu jalanin npm run db:seed.
- Database: ganti SQLite ke PostgreSQL (Neon/Supabase/Railway):
// prisma/schema.prisma datasource db { provider = "postgresql" url = env("DATABASE_URL") }
- Build:
npm run build npm run db:migrate deploy npm start
- Process manager: pakai
pm2,systemd, atau Docker. - Public HTTPS: wajib untuk webhook KlikQRIS. Pakai reverse proxy (Caddy/Nginx) atau hosting yang bawa HTTPS otomatis.
- Environment: set
NODE_ENV=productionbiar log JSON (lebih ringan).
- Admin web dashboard (login, products, stock, orders, redeliver, analytics)
- Admin bot commands (Telegram + Discord)
- Setup wizard (
npm run setup+/setupweb form) - Owner-aware bots (auto-admin, notifications,
/whoamicommand) - Retry-safe delivery dengan tombol redeliver di dashboard
- Inline buttons di bot (Telegram InlineKeyboard + Discord ButtonBuilder/SelectMenu)
- Cron auto-expire order PENDING yang lewat waktu (jalan tiap 1 menit)
- Rate limiting
/admin/login(max 10 attempt/5 menit per IP) - Dashboard analytics — chart revenue 30 hari, top produk, breakdown per status & platform
- Retry queue (BullMQ + Redis) untuk delivery yang gagal
- Notifikasi WhatsApp via flag
notifwaKlikQRIS - Integrasi role Discord otomatis (untuk produk tipe
ROLE) - Export data CSV (orders, sales report)
- Multi-currency support
- Unit & integration tests
PR sangat welcome! Cara kontribusi:
- Fork repo ini
- Buat branch:
git checkout -b feat/nama-fitur - Commit:
git commit -m "feat: deskripsi" - Push:
git push origin feat/nama-fitur - Buka Pull Request ke branch
main
Issue untuk laporan bug atau request fitur juga sangat membantu!
Dilisensikan di bawah MIT License — bebas digunakan, dimodifikasi, dan didistribusikan, termasuk untuk keperluan komersial.
Dibuat untuk komunitas seller digital Indonesia.
Kalau berguna, kasih bintang ⭐ ya!