WA Daily Scrum Bot
Bot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

- anggota tim dipantau setiap hari kerja
- 14
- pengecekan pengingat sehari, makin tegas
- 4
- hari sebelum tugas macet ditandai
- 3
- perintah chat swalayan
- 3
Di halaman ini
Masalahnya
Tim OIKN THD, tim software beranggotakan 14 orang, menjalankan standup harian di grup WhatsApp. Setiap anggota menulis apa yang dikerjakan kemarin dan apa rencananya hari ini. Tanpa bantuan, team lead harus mengecek siapa yang belum menulis lalu mengingatkannya, beberapa kali sehari, setiap hari. Untuk 14 orang, ini melelahkan dan gampang terlupa. Akibatnya ada laporan yang terlewat atau datang terlalu telat untuk berguna.
Tim ini butuh sesuatu yang memantau grup, mengirim pengingat yang makin tegas sepanjang hari, dan menutup setiap hari dengan ringkasan berperingkat. Laporan datang dalam bahasa Indonesia dan Inggris, jadi keduanya harus dikenali.
Yang saya bangun
Bot menjalankan WhatsApp Web, karena tidak ada API untuk bot
WhatsApp tidak punya API resmi untuk bot grup. API bisnisnya butuh persetujuan Meta dan berbayar, jadi tidak cocok untuk alat internal tim. Karena itu bot menjalankan WhatsApp Web di browser di dalam container. Bot mengecek empat kali sehari, pukul 09.00, 10.00, 11.00, dan 14.00, dan setiap pengingat lebih tegas dari sebelumnya. Pesan hanya dikirim kalau masih ada yang belum melapor. Kalau semua sudah melapor, bot diam.
Laporan dihitung kalau kedua bagiannya ada
Sebuah pesan dianggap laporan standup kalau memuat pasangan frasa, misalnya "kemarin" dan "hari ini", atau "yesterday" dan "today". Cara ini jalan di kedua bahasa dan untuk format apa pun. Pengecekan kedua membuang kata kunci itu dan melihat sisanya. Kalau hampir tidak ada isinya, bot menegur laporan yang hanya berisi kata kunci itu di grup. Hari libur nasional dan tanggal cuti setiap anggota diatur di konfigurasi, jadi tidak ada yang dikejar-kejar saat libur.
Bot mengenali tugas yang jalan di tempat
Bot juga membaca setiap poin tugas dan mengikutinya dari hari ke hari. "fix login bug" dan "fixing the login bug issue" dianggap tugas yang sama, berdasarkan berapa banyak kata yang sama. Tugas yang tetap berada di bagian "hari ini" selama tiga hari atau lebih tanpa pernah dilaporkan selesai akan ditandai. Tugas rutin seperti piket, cuti, dan standby tidak pernah ditandai. Untuk QA lead tim yang bebannya berat, tugas testing yang macet disertai tawaran bantuan dari rekan yang disebut namanya.
Melewatkan tugas yang macet tidak mereset hitungannya
Awalnya hitungan tugas macet direset setiap Senin. Anggota juga bisa menghindarinya dengan tidak menulis tugas itu sehari saja. Saya mengubahnya supaya hitungan terbawa lintas minggu dan baru hilang saat tugas yang sama dilaporkan selesai. Supaya tetap aman saat restart, bot membaca ulang 500 pesan terakhir di grup ketika menyala, lalu memutarnya kembali secara berurutan. Deploy ulang tidak pernah menghilangkan pelacakannya.
Rekap Jumat saya uji dulu sebelum dikirim otomatis
Rekap Jumat menggabungkan tingkat penyelesaian, rentetan tepat waktu, perbandingan kesehatan tim dengan minggu lalu, dan daftar tugas yang macet. Salah satu saja bisa menampilkan angka yang keliru di depan seluruh tim. Saya merilisnya dengan pengiriman otomatis dimatikan dan tombol kirim manual. Setelah hasilnya saya cek terhadap data tim selama satu siklus penuh, pengiriman otomatis saya nyalakan lagi.
Hasilnya
Bot ini berjalan di produksi untuk standup harian tim dan memantau 14 anggota setiap hari kerja. Saya membangunnya dalam 18 hari di bulan Juni 2026. Awalnya hanya mendeteksi laporan dan mengirim pengingat, lalu berkembang menjadi pelacakan tugas, analitik mingguan, dan perintah mandiri. Anggota bisa mengetik !mystats untuk melihat persentase tepat waktu, rentetan, dan tingkat penyelesaiannya sendiri, !rank untuk papan peringkat, dan !help untuk daftar perintah. Data tersimpan di berkas biasa pada volume yang di-mount, jadi restart tidak menghapus progres hari itu. Saya juga membuat dashboard React sebagai demo jadwal dan pesan. Dashboard itu tidak terhubung ke bot yang berjalan.
Di balik layarDetail teknis untuk engineer
- Node.js 18 dengan
whatsapp-web.js(Puppeteer dan Chromium),node-cronuntuk penjadwalan, danqrcode-terminaluntuk menautkan ponsel. Sesi bergantung pada ponsel tertaut yang tetap online dan bisa rusak saat WhatsApp memperbarui klien web-nya. - Image Docker memakai
node:18-bookworm-slimdengan Chromium sistem. Unduhan Chromium bawaan Puppeteer dilewati dan hostname container dipatok supaya tidak terjadi bentrok kunci profil.entrypoint.shmenghapus berkas kunciSingletonChromium yang tertinggal sebelum Node berjalan. - Di tengah proyek, WhatsApp mengganti ID kontak dari format
@c.uske ID@lidyang tidak terbaca, sehingga pencocokan anggota rusak. Saya mencatat ID pengirim dari pesan yang masuk lalu memperbarui konfigurasi anggota. - Deteksi memakai dua string kata kunci ditambah tiga pasangan kata kunci dwibahasa.
detectSection()mengelompokkan baris ke Yesterday, Today, atau Impediment.parseSectionTasks()mengambil poin-poinnya.normalizeTask()dantaskSimilarity()memakai kemiripan token Jaccard dengan ambang 0,7.CONFIG.staleTask.minDaysbernilai 3..week-state.jsonmenyimpanreports,carry,ledger, danhistory. State harian ada di.bot-state.json.- Delapan cron job harian: kickoff, pengingat tugas terbawa pukul 08.02 dengan ambang dua hari, empat pengecekan, ringkasan akhir hari, dan slot rekap mingguan. Rekap Jumat terkirim pukul 17.05. Rekap Senin mengirim ulang tugas macet minggu lalu.
- Tepat waktu berarti sebelum pukul 09.00 WITA, dalam jendela bergulir 4 minggu atau 20 hari kerja. Rentetan tidak putus karena hari cuti.
- Pengaturan per anggota
staleHelpdanstalePriority;weeklyRecapAutoSendmengatur rekap.SIGUSR1memicu pengingat,SIGUSR2mencetak rekap ke log, danSIGHUPmengirimnya. !mystatsmembalas di grup dengan @mention.!leaderboardadalah alias untuk!rank.- GitHub Actions membangun image ke GHCR.
bot.jsberisi 1.166 baris dan dashboard 386 baris. 25 commit dari 10 sampai 28 Juni 2026.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.