Programming
Tutorial Slack API: Bikin Bot Otomatis dengan Python & JS
Daftar isi
- Kenalan Dulu: Apa Itu Slack dan Kenapa API-nya Menarik
- Prasyarat Sebelum Mulai
- Step 1: Buat Slack App di Dashboard Developer
- Step 2: Atur Scopes dan Instal ke Workspace
- Step 3: Kirim Pesan Pertama dengan Incoming Webhook
- Step 4: Kirim Pesan Lewat Web API dengan Python
- Step 5: Percantik Pesan dengan Block Kit
- Step 6: Bikin Bot Interaktif dengan Bolt (Socket Mode)
- Step 7: Tambahkan Slash Command
- Error Umum dan Cara Mengatasinya
- Tips Troubleshooting dan Praktik Terbaik
- Keamanan Token
- Menghadapi Rate Limit
- Debugging yang Efektif
- Konteks Pemakaian di Indonesia
- Kapan Slack API Bukan Pilihan Tepat
- Deploy Bot ke Production: Dari Laptop ke Server Beneran
- Simpan Konfigurasi dengan Benar
- Menjadwalkan Pesan Tanpa Cron yang Ribet
- Mendengarkan Event: Bot yang Bereaksi, Bukan Cuma Bicara
- Monitoring: Tahu Bot Bermasalah Sebelum Tim Kalian yang Lapor
- Naik Kelas: Dari Satu Workspace ke Distribusi Publik
- Slash Command: Bot yang Bisa Dipanggil Kapan Saja
- Interaktivitas: Tombol dan Modal yang Bikin Bot Terasa "Hidup"
- Menguji Bot Tanpa Mengganggu Satu Kantor
- Dokumentasi dan Serah Terima: Bot yang Hidup Lebih Lama dari Pembuatnya
- Keamanan Token: Jangan Sampai Bot Kalian Jadi Pintu Belakang
- Menghadapi Rate Limit Tanpa Panik
- Etika Notifikasi: Bot yang Sopan Lebih Panjang Umur
- Integrasi dengan Sistem Internal: Bot Sebagai Jembatan
- Socket Mode vs HTTP Endpoint: Pilih Jalur yang Pas
- App Home: Beranda Pribadi Bot Kalian
- Menyimpan State: Bot Juga Butuh Ingatan
- Deployment: Dari Laptop ke Server yang Nggak Tidur
- Pesan Terjadwal: Biar Bot yang Begadang, Bukan Kalian
- Menangani Error dengan Anggun: Bot yang Gagal Diam-Diam Itu Bahaya
- Izin dan Scope: Minta Secukupnya, Jangan Borong
- Merawat Bot Jangka Panjang: Versi, Changelog, dan Kebiasaan Kecil
- Block Kit: Biar Pesan Bot Nggak Cuma Teks Polos
- Dokumentasi Pengguna: Bot yang Nggak Dijelaskan Bakal Salah Dipakai
- Mengukur Pemakaian: Jangan Cuma Merasa Berguna
- Kesimpulan
Slack sering dianggap cuma aplikasi chat kantor, padahal di baliknya ada platform API yang luar biasa luas buat otomasi kerja. Kalau Teman-Teman pernah kepikiran bikin bot yang bisa kirim laporan otomatis ke channel tim, atau workflow yang jalan sendiri tiap ada pesan masuk, tutorial ini tempat yang pas. Kita akan bahas dari konsep dasarnya sampai bikin bot Slack sendiri dengan Python dan JavaScript, lengkap dengan kode, hasil yang diharapkan, dan cara mengatasi error yang paling sering muncul.
Ringkasan singkat: artikel ini membahas cara kerja Slack API, persiapan yang dibutuhkan, langkah membuat Slack App dan bot token, mengirim pesan lewat Incoming Webhook dan Web API, merespons event secara real-time dengan Bolt framework, sampai tips keamanan token dan penanganan rate limit. Cocok buat developer yang mau mengintegrasikan sistem internal dengan Slack workspace tim.
Kenalan Dulu: Apa Itu Slack dan Kenapa API-nya Menarik
Slack adalah platform kolaborasi kerja berbasis percakapan yang menghubungkan orang, tools, dan data dalam satu tempat. Diluncurkan tahun 2013, Slack diakuisisi oleh Salesforce dan kini dipakai jutaan orang dengan lebih dari 700 juta pesan terkirim setiap hari.
Fakta menariknya, nama Slack sebenarnya akronim dari Searchable Log of All Communication and Knowledge. Jadi filosofinya memang jadi "arsip hidup" semua komunikasi tim yang bisa dicari kapan saja. Detail sejarahnya bisa Teman-Teman baca di artikel Wikipedia tentang Slack.
Buat developer, ada tiga alasan kenapa Slack layak diintegrasikan ke sistem kalian:
-
Semua orang sudah di sana. Notifikasi di Slack jauh lebih cepat dibaca daripada email.
-
API-nya matang dan terdokumentasi rapi. Ada lebih dari 2.600 aplikasi pihak ketiga di App Directory — bukti ekosistemnya sehat.
-
Model izinnya granular. Bot hanya bisa melakukan hal yang kalian izinkan lewat scopes, jadi relatif aman.
MUGHU sendiri pertama kali bikin integrasi Slack buat kebutuhan sederhana: kirim notifikasi kalau server monitoring mendeteksi error. Dari situ ketagihan, karena ternyata sekali paham polanya, hampir semua otomasi tim bisa lewat Slack.
Prasyarat Sebelum Mulai
Sebelum masuk ke langkah teknis, siapkan dulu hal-hal berikut:
-
Akun Slack dan sebuah workspace. Kalau belum punya, bikin workspace gratis dulu — plan Free sudah cukup buat belajar.
-
Hak admin atau izin instal aplikasi di workspace tersebut. Di workspace kantor, biasanya perlu approval admin.
-
Python 3.9+ atau Node.js 18+ terpasang di komputer.
-
Terminal dan editor kode kesayangan kalian.
-
Pemahaman dasar soal HTTP request dan JSON, karena semua komunikasi dengan Slack API berbentuk itu.
Kenapa ini penting? Karena separuh masalah integrasi Slack biasanya bukan di kode, tapi di izin dan konfigurasi. Menyiapkan workspace percobaan sendiri bikin kalian bebas bereksperimen tanpa takut spam channel kantor.
Step 1: Buat Slack App di Dashboard Developer
Semua integrasi Slack dimulai dari satu tempat: membuat Slack App.
-
Buka dashboard Slack API dan login.
-
Klik Create New App → pilih From scratch.
-
Beri nama, misalnya
laporan-bot, lalu pilih workspace tujuan. -
Klik Create App.
Kenapa langkah ini penting? Slack App adalah "identitas" bot kalian. Semua token, izin, dan konfigurasi event nempel ke app ini. Tanpa app, kalian nggak bisa dapat kredensial apa pun.
Step 2: Atur Scopes dan Instal ke Workspace

Sekarang kita tentukan apa saja yang boleh dilakukan bot. Di menu OAuth & Permissions, scroll ke bagian Bot Token Scopes, lalu tambahkan:
-
chat:write— izin mengirim pesan -
channels:read— membaca daftar channel publik -
channels:history— membaca riwayat pesan (kalau perlu)
Setelah itu klik Install to Workspace dan setujui izinnya. Slack akan memberikan Bot User OAuth Token yang diawali xoxb-.
Bot token adalah kunci rahasia yang dipakai aplikasi kalian untuk memanggil Slack API atas nama bot. Perlakukan seperti password: jangan pernah di-commit ke Git.
Kenapa scopes dibuat sesempit mungkin? Prinsipnya least privilege. Kalau token bocor, kerusakannya terbatas pada izin yang diberikan saja. Ini pelajaran yang MUGHU dapat dengan cara pahit — dulu pernah kasih scope admin ke bot iseng, dan waktu audit keamanan, bot itu jadi temuan pertama.
Step 3: Kirim Pesan Pertama dengan Incoming Webhook
Cara paling cepat merasakan hasilnya adalah lewat Incoming Webhook — URL khusus yang menerima POST request dan mengubahnya jadi pesan Slack.
Aktifkan di menu Incoming Webhooks, pilih channel tujuan, lalu salin URL-nya. Sekarang coba dari terminal:
curl -X POST \
-H 'Content-type: application/json' \
--data '{"text":"Halo tim! Bot laporan sudah aktif 🎉"}' \
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX
Output yang diharapkan: terminal membalas ok, dan pesan langsung muncul di channel yang dipilih.
Kenapa mulai dari webhook? Karena ini cara termudah memvalidasi bahwa koneksi ke workspace kalian jalan, tanpa perlu menulis satu baris kode aplikasi pun. Webhook cocok banget buat notifikasi satu arah: alert monitoring, laporan CI/CD, atau pengingat harian.
Step 4: Kirim Pesan Lewat Web API dengan Python
Webhook itu satu arah dan satu channel. Kalau butuh fleksibilitas — kirim ke channel mana pun, membalas thread, upload file — pakailah Web API dengan bot token.
Instal dulu SDK resminya:
pip install slack_sdk
Lalu buat file kirim_pesan.py:
Baca juga ClinePass: Langganan Model Open Weight untuk Coding
import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])
try:
response = client.chat_postMessage(
channel="#general",
text="Laporan harian: semua sistem berjalan normal ✅"
)
print(f"Pesan terkirim, timestamp: {response['ts']}")
except SlackApiError as e:
print(f"Gagal kirim: {e.response['error']}")
Jalankan dengan token di environment variable:
export SLACK_BOT_TOKEN="xoxb-token-kalian"
python kirim_pesan.py
Output yang diharapkan:
Pesan terkirim, timestamp: 1752641400.000200
Kenapa token ditaruh di environment variable, bukan langsung di kode? Supaya kode aman dibagikan atau di-push ke repository tanpa membocorkan kredensial. Ini kebiasaan kecil yang menyelamatkan banyak tim dari insiden keamanan.
Catatan penting: kalau muncul error not_in_channel, artinya bot belum diundang ke channel tujuan. Ketik /invite @laporan-bot di channel tersebut. Ini error paling umum yang bikin orang bingung di percobaan pertama.
Step 5: Percantik Pesan dengan Block Kit
Pesan teks polos itu berfungsi, tapi Block Kit bikin pesan kalian tampil profesional dengan tombol, section, dan format kaya.
response = client.chat_postMessage(
channel="#general",
text="Laporan deployment", # fallback untuk notifikasi
blocks=[
{
"type": "header",
"text": {"type": "plain_text", "text": "🚀 Deployment Berhasil"}
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": "*Aplikasi:*\napi-gateway"},
{"type": "mrkdwn", "text": "*Versi:*\nv2.4.1"},
{"type": "mrkdwn", "text": "*Durasi:*\n3m 42s"},
{"type": "mrkdwn", "text": "*Status:*\n✅ Sukses"}
]
}
]
)
Kenapa text tetap diisi padahal sudah pakai blocks? Karena text dipakai sebagai fallback di notifikasi push dan pembaca layar. Kalau dikosongkan, Slack akan memunculkan peringatan dan pengalaman pengguna jadi kurang bagus.
Tips dari pengalaman: rancang dulu tampilannya di Block Kit Builder resmi Slack sebelum menulis kode. Jauh lebih cepat daripada trial-error di terminal.
Step 6: Bikin Bot Interaktif dengan Bolt (Socket Mode)
Sekarang bagian serunya: bot yang bisa mendengar dan membalas. Kita pakai Bolt for JavaScript, framework resmi dari Slack, dengan Socket Mode biar nggak perlu server publik atau ngoprek ngrok.
Persiapan di dashboard app:
-
Buka Socket Mode → aktifkan, lalu buat App-Level Token dengan scope
connections:write(diawalixapp-). -
Buka Event Subscriptions → aktifkan, tambahkan bot event
message.channels. -
Reinstall app kalau diminta.
Lalu di terminal:
mkdir slack-bot && cd slack-bot
npm init -y
npm install @slack/bolt
Buat file app.js:
const { App } = require('@slack/bolt');
const app = new App({
token: process.env. SLACK_BOT_TOKEN,
appToken: process.env. SLACK_APP_TOKEN,
socketMode: true,
});
// Balas otomatis kalau ada yang menyebut kata "laporan"
app.message('laporan', async ({ message, say }) => {
await say({
thread_ts: message.ts,
text: `Halo <@${message.user}>! Laporan terbaru bisa dilihat di dashboard ya 📊`,
});
});
(async () => {
await app.start();
console.log('⚡ Bot berjalan dalam Socket Mode');
})();
Jalankan:
export SLACK_BOT_TOKEN="xoxb-..."
export SLACK_APP_TOKEN="xapp-..."
node app.js
Output yang diharapkan: terminal menampilkan ⚡ Bot berjalan dalam Socket Mode, dan tiap ada pesan berisi kata "laporan" di channel tempat bot berada, bot membalas di thread.
Kenapa Socket Mode? Untuk pengembangan lokal, ini menghilangkan kerumitan terbesar: menyediakan endpoint HTTPS publik untuk menerima event. Koneksinya lewat WebSocket keluar dari mesin kalian, jadi aman di belakang firewall kantor mana pun. Untuk produksi skala besar, barulah pertimbangkan HTTP endpoint dengan verifikasi signing secret.
Step 7: Tambahkan Slash Command
Slash command bikin bot terasa "resmi" — pengguna cukup mengetik /status untuk memanggil fungsinya.
Di dashboard: Slash Commands → Create New Command → isi command /status. Lalu tambahkan handler di app.js:
app.command('/status', async ({ command, ack, respond }) => {
await ack(); // wajib dipanggil dalam 3 detik!
await respond(`Semua sistem normal, dicek pukul ${new Date().toLocaleTimeString('id-ID')} ✅`);
});
Kenapa ack() wajib dan harus cepat? Slack memberi batas 3 detik untuk mengonfirmasi bahwa command diterima. Kalau lewat, pengguna melihat error operation_timeout walaupun logika kalian sebenarnya jalan. Pola yang benar: ack() dulu, proses berat belakangan.
Error Umum dan Cara Mengatasinya
Berikut tabel error yang paling sering ditemui beserta solusinya:
Error | Penyebab | Solusi |
|---|---|---|
| Token salah, kedaluwarsa, atau tercampur jenisnya | Pastikan pakai token |
| Bot belum jadi anggota channel | Ketik |
| Scope izin belum ditambahkan | Tambah scope di OAuth & Permissions, lalu reinstall app |
| Nama/ID channel salah atau channel privat | Pakai ID channel (misal |
| Terlalu banyak request | Hormati header |
|
| Panggil |
Satu jebakan klasik yang perlu digarisbawahi: mengubah scope tidak otomatis berlaku. Kalian harus reinstall app ke workspace setiap kali scope berubah. MUGHU pernah menghabiskan satu jam debugging missing_scope hanya karena lupa langkah ini.
Tips Troubleshooting dan Praktik Terbaik
Keamanan Token
-
Simpan token di environment variable atau secret manager, jangan di kode.
-
Rotasi token kalau ada anggota tim yang keluar atau ada indikasi bocor.
-
Aktifkan verifikasi signing secret kalau memakai HTTP endpoint, supaya request palsu tertolak. Slack sendiri sempat mengalami insiden keamanan di masa lalu, jadi jangan anggap remeh lapisan ini.
Menghadapi Rate Limit
Slack membatasi chat.postMessage sekitar 1 pesan per detik per channel. Untuk pengiriman massal:
Baca juga Kiro Dev: IDE Agentic AWS untuk Spec-Driven Development
import time
for channel in daftar_channel:
client.chat_postMessage(channel=channel, text="Pengumuman penting")
time.sleep(1.1) # jeda aman di atas 1 detik
Kenapa nggak dikirim paralel saja biar cepat? Karena Slack akan membalas HTTP 429 dan pesan kalian malah gagal semua. Lebih lambat tapi pasti sampai itu jauh lebih baik daripada cepat tapi setengahnya hilang.
Debugging yang Efektif
-
Cek respons API selalu punya field
ok. Kalaufalse, fielderrormemberi tahu persis masalahnya. -
Pakai
logLevel: 'debug'di Bolt saat pengembangan untuk melihat semua payload event. -
Uji di channel percobaan dulu (
#bot-testing) sebelum dilepas ke channel ramai. Tim kalian akan berterima kasih.
Konteks Pemakaian di Indonesia
Buat tim di Jakarta, Bandung, atau Yogyakarta yang banyak kerja remote dan hybrid, integrasi semacam ini terasa banget manfaatnya. Contoh nyata yang sering dipakai startup lokal:
-
Bot pengingat standup harian jam 9 pagi WIB, dengan penyesuaian timezone
Asia/Jakartadi scheduler. -
Notifikasi order masuk dari sistem e-commerce langsung ke channel
#penjualan. -
Alert pembayaran gagal dari payment gateway lokal ke channel tim finance.
Perhatikan soal timezone: server kalian mungkin jalan di UTC, jadi selalu konversi eksplisit ke WIB/WITA/WIT saat menjadwalkan pesan. Ini sumber bug jadwal yang sangat sering terjadi.
Kapan Slack API Bukan Pilihan Tepat
Biar seimbang, ada juga situasinya di mana pendekatan lain lebih masuk akal:
-
Kebutuhan kalian cuma notifikasi sederhana tanpa logika → Workflow Builder bawaan Slack sudah cukup, tanpa kode sama sekali.
-
Tim kalian pakai plan Free → riwayat pesan terbatas 90 hari, jadi jangan jadikan Slack satu-satunya arsip data penting.
-
Volume pesan sangat tinggi (ribuan per menit) → rate limit Slack akan jadi hambatan, pertimbangkan agregasi dulu sebelum kirim.
Dokumentasi lengkap semua endpoint, scope, dan batasan terbaru selalu tersedia di dokumentasi resmi Slack API — biasakan cek ke sana dulu sebelum mencari jawaban di tempat lain, karena API-nya cukup sering berevolusi.
Deploy Bot ke Production: Dari Laptop ke Server Beneran
Bot yang jalan di laptop itu baru setengah cerita. Begitu laptop ditutup, bot mati, dan tim mulai bertanya-tanya kenapa /status nggak jawab. Jadi langkah berikutnya: pindahkan ke server yang hidup 24 jam.
Ada beberapa opsi yang umum dipakai tim di Indonesia:
-
VPS murah (DigitalOcean, Vultr, atau penyedia lokal seperti IDCloudHost) — kontrol penuh, cocok kalau kalian sudah nyaman dengan Linux.
-
Platform-as-a-Service seperti Railway atau Render — tinggal push kode, urusan server diurus mereka.
-
Serverless (AWS Lambda, Google Cloud Functions) — bayar per pemakaian, tapi hati-hati: Socket Mode nggak cocok di sini karena butuh koneksi yang terus hidup.
Poin terakhir itu penting banget. Kalau kalian pakai Bolt dengan Socket Mode, arsitekturnya butuh proses yang jalan terus. Untuk serverless, kalian harus beralih ke HTTP endpoint dengan Request URL, lengkap dengan verifikasi signing secret yang sudah dibahas sebelumnya.
Supaya proses Node.js kalian nggak mati diam-diam, pakai process manager seperti PM2:
npm install -g pm2
pm2 start app.js --name slack-bot
pm2 save
pm2 startup # biar otomatis jalan setelah server reboot
MUGHU sendiri pernah kena kasus bot mati tengah malam gara-gara server restart otomatis setelah update, dan baru ketahuan paginya dari keluhan tim. Sejak pakai pm2 startup, masalah itu nggak pernah muncul lagi.
Simpan Konfigurasi dengan Benar
Di production, environment variable jangan lagi ditaruh di file .env yang ikut ter-commit. Minimal, pastikan .env masuk .gitignore. Lebih bagus lagi kalau pakai secret manager bawaan platform — Railway, Render, dan AWS semuanya punya fitur ini. Aturannya sederhana: token Slack nggak boleh pernah menyentuh repository, titik.
Menjadwalkan Pesan Tanpa Cron yang Ribet
Banyak yang belum tahu kalau Slack punya endpoint chat.scheduleMessage untuk mengirim pesan di waktu tertentu — jadi kalian nggak selalu perlu bikin cron job sendiri:
from datetime import datetime, timedelta
import time as time_module
# jadwalkan pesan 1 jam dari sekarang
waktu_kirim = int(time_module.time()) + 3600
client.chat_scheduleMessage(
channel="C0123ABC",
text="Reminder: meeting sprint review 15 menit lagi 📅",
post_at=waktu_kirim
)
Parameter post_at memakai Unix timestamp dalam UTC. Nah, di sinilah jebakan timezone yang tadi disinggung sering kejadian. Kalau kalian mau pesan terkirim jam 9 pagi WIB, hitung dulu konversinya dengan library seperti zoneinfo di Python:
from datetime import datetime
from zoneinfo import ZoneInfo
jam_9_wib = datetime(2026, 7, 16, 9, 0, tzinfo=ZoneInfo("Asia/Jakarta"))
post_at = int(jam_9_wib.timestamp())
Dua baris ini menyelamatkan kalian dari pesan standup yang nongol jam 4 pagi. Percayalah, tim kalian nggak akan senang dibangunkan bot.
Satu catatan: pesan terjadwal punya batas maksimal 120 hari ke depan, dan kalian bisa melihat daftar antreannya lewat chat.scheduledMessages.list. Berguna kalau mau membatalkan pengumuman yang ternyata salah ketik.
Mendengarkan Event: Bot yang Bereaksi, Bukan Cuma Bicara
Sejauh ini bot kita lebih banyak "ngomong". Biar makin berguna, dia juga harus bisa "mendengar". Lewat Events API, bot bisa bereaksi saat ada anggota baru bergabung, pesan mengandung kata kunci tertentu, atau emoji reaction ditambahkan.
Contoh klasik: sambutan otomatis untuk anggota baru di channel #general:
app.event('member_joined_channel', async ({ event, client }) => {
await client.chat.postMessage({
channel: event.channel,
text: `Selamat datang <@${event.user}>! 👋 Jangan lupa cek pinned message ya.`
});
});
Jangan lupa tambahkan event subscription member_joined_channel di dashboard dan scope channels:read. Dan ya — reinstall app lagi setelahnya. Pola yang sama terus berulang: ubah izin, reinstall, baru jalan.
Satu praktik yang MUGHU sangat sarankan: filter event sedini mungkin. Workspace yang ramai bisa menghasilkan ratusan event per menit. Kalau handler kalian memproses semuanya tanpa saringan, tagihan server naik dan log jadi lautan noise. Cek dulu channel dan tipe event di baris pertama handler, baru lanjut ke logika utama.
Monitoring: Tahu Bot Bermasalah Sebelum Tim Kalian yang Lapor
Ironis kalau bot notifikasi mati tapi nggak ada yang memberi tahu kalian. Beberapa lapisan pengaman yang murah dan efektif:
Baca juga Codex CLI dari OpenAI: Panduan Lengkap Ngoding di Terminal
-
Health check sederhana — expose endpoint
/healthdi app kalian, lalu pantau pakai layanan gratis seperti UptimeRobot. Kalau endpoint nggak merespons, kalian dapat email atau bahkan... notifikasi Slack dari sistem lain. -
Log terstruktur — catat setiap panggilan API yang gagal beserta field
error-nya. Format JSON memudahkan pencarian saat debugging. -
Channel khusus alert internal — bot yang melaporkan errornya sendiri ke
#bot-alertsterdengar lucu, tapi praktik ini dipakai banyak tim serius.
Untuk aplikasi yang lebih besar, standar logging dan error handling yang baik bisa kalian pelajari dari dokumentasi Node.js atau panduan resmi bahasa yang kalian pakai. Prinsipnya sama di mana-mana: gagal itu wajar, gagal tanpa jejak itu bencana.
Naik Kelas: Dari Satu Workspace ke Distribusi Publik
Semua yang kita bangun sejauh ini berjalan di satu workspace — dan untuk kebutuhan internal tim, itu sudah lebih dari cukup. Tapi kalau suatu saat kalian ingin app dipakai workspace lain (misal produk SaaS kalian mau menyediakan integrasi Slack resmi), ada beberapa hal baru yang masuk daftar belajar:
-
OAuth 2.0 flow — tiap workspace yang menginstal app kalian akan menghasilkan token sendiri, jadi kalian butuh database untuk menyimpan dan mengelola token per workspace. Konsep dasarnya bisa dibaca di spesifikasi OAuth 2.0.
-
Token rotation — untuk keamanan ekstra, Slack mendukung token yang kedaluwarsa berkala dan diperbarui otomatis lewat refresh token.
-
Review Slack Marketplace — kalau mau tampil di direktori resmi, app kalian akan melalui proses review soal keamanan, privasi, dan kualitas.
Perbedaan terbesarnya ada di pola pikir: app internal boleh "asal jalan", app publik harus siap menghadapi ribuan workspace dengan konfigurasi yang beda-beda. Mulailah dari yang internal dulu, matangkan pola dasarnya — webhook, Web API, Block Kit, event handling — karena semua fondasi itu tetap terpakai persis sama saat kalian naik ke level distribusi publik.
Slash Command: Bot yang Bisa Dipanggil Kapan Saja
Notifikasi terjadwal dan event handler itu sifatnya pasif dari sisi pengguna. Slash command membalik arahnya: anggota tim yang memanggil bot lewat perintah seperti /cuti atau /laporan-harian, dan bot merespons saat itu juga.
Cara daftarnya gampang. Buka dashboard app kalian, masuk ke menu Slash Commands, lalu isi nama perintah, URL endpoint, dan deskripsi singkat. Di sisi kode, Bolt menyediakan handler yang rapi:
app.command('/cuti', async ({ command, ack, respond }) => {
await ack(); // wajib dalam 3 detik!
await respond({
text: `Halo <@${command.user_id}>, pengajuan cuti kamu sudah dicatat: ${command.text}`
});
});
Perhatikan baris await ack(). Slack menuntut respons pengakuan dalam 3 detik — lewat dari itu, pengguna akan melihat pesan error walau logika kalian sebenarnya jalan. Kalau prosesnya berat (misal query database yang lama), pola yang benar: ack() dulu secepatnya, kerjakan tugasnya di belakang, lalu kirim hasilnya lewat respond() atau chat.postMessage.
Satu tips penamaan dari pengalaman MUGHU: pakai nama perintah yang spesifik untuk tim kalian, misal /absen-standup daripada /absen yang generik. Kalau workspace kalian nanti memasang app lain dengan nama perintah sama, yang menang adalah yang diinstal lebih dulu — dan debugging bentrok slash command itu termasuk pengalaman yang nggak perlu dirasakan dua kali.
Interaktivitas: Tombol dan Modal yang Bikin Bot Terasa "Hidup"
Balasan teks itu baik, tapi tombol jauh lebih enak dipakai. Bayangkan bot approval cuti: atasan tinggal klik Setujui atau Tolak, nggak perlu mengetik apa pun. Ini wilayahnya Block Kit interaktif.
await client.chat.postMessage({
channel: idAtasan,
text: 'Pengajuan cuti baru menunggu persetujuan',
blocks: [
{
type: 'section',
text: { type: 'mrkdwn', text: '*Rina* mengajukan cuti 20–22 Juli 2026' }
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: '✅ Setujui' },
style: 'primary',
action_id: 'setujui_cuti'
},
{
type: 'button',
text: { type: 'plain_text', text: '❌ Tolak' },
style: 'danger',
action_id: 'tolak_cuti'
}
]
}
]
});
Lalu tangkap kliknya:
app.action('setujui_cuti', async ({ ack, body, client }) => {
await ack();
await client.chat.update({
channel: body.channel.id,
ts: body.message.ts,
text: 'Cuti disetujui ✅',
blocks: [] // ganti tombol dengan teks final
});
});
Trik chat.update di atas penting: setelah tombol diklik, ganti pesannya jadi status final. Kalau tombolnya dibiarkan, orang bisa klik dua kali dan sistem kalian mencatat approval ganda. Kejadian beneran, dan rapinya laporan HR jadi taruhannya.
Untuk formulir yang lebih kompleks — input tanggal, dropdown, kolom teks panjang — Slack menyediakan modal, jendela pop-up yang dibuka lewat views.open. Strukturnya masih Block Kit juga, jadi ilmu yang sudah kalian pegang tinggal dipakai ulang. Kalau butuh referensi konsep antarmuka dan aksesibilitas form yang baik, dokumentasi MDN soal form tetap relevan walau konteksnya web — prinsip label yang jelas dan validasi dini berlaku di mana-mana.
Menguji Bot Tanpa Mengganggu Satu Kantor
Ini bagian yang sering di-skip padahal murah banget: workspace khusus testing. Bikin workspace Slack gratis terpisah, instal app kalian di sana, dan silakan eksperimen sebebasnya. Pesan spam, notifikasi salah format, mention massal yang nggak sengaja — semua aman karena nggak ada korban.
Beberapa kebiasaan testing yang terbukti menyelamatkan MUGHU berkali-kali:
-
Channel
#sandboxdi workspace produksi — untuk uji akhir sebelum rilis, dengan anggota terbatas yang sudah tahu bakal ada pesan aneh-aneh. -
Prefix nama bot saat development — beri nama seperti
[DEV] Bot Absensibiar nggak ada yang salah kira itu bot resmi. -
Mock respons API di unit test — jangan panggil API Slack beneran di test otomatis. Selain lambat, kalian bisa kena rate limit hanya gara-gara CI/CD jalan tiap commit.
Untuk pengujian webhook lokal, ngrok masih jadi andalan: dia membuka terowongan dari internet ke laptop kalian, jadi Slack bisa mengirim event ke server development tanpa perlu deploy dulu. Ingat saja bahwa URL gratisnya berubah tiap restart, jadi kalian perlu update URL di dashboard tiap sesi — agak repot, tapi sepadan dengan kecepatan iterasinya.
Dokumentasi dan Serah Terima: Bot yang Hidup Lebih Lama dari Pembuatnya
Cerita klasik di banyak kantor Indonesia: bot Slack dibuat satu orang, orangnya resign, dan enam bulan kemudian bot mati tanpa ada yang tahu cara membangunkannya. Jangan sampai bot kalian bernasib sama.
Minimal, siapkan satu dokumen berisi:
-
Di mana bot berjalan — nama server, layanan hosting, atau platform serverless yang dipakai, lengkap dengan siapa pemegang aksesnya.
-
Daftar token dan letak penyimpanannya — bukan tokennya, tapi lokasinya (misal "di secret manager, key
slack-bot-token"). Sertakan juga siapa admin app di dashboard Slack. -
Cara deploy ulang dari nol — langkah dari clone repo sampai bot menyala. Uji dokumen ini dengan meminta rekan lain mengikutinya tanpa bantuan kalian.
-
Kontak eskalasi — kalau bot mati jam 2 pagi saat ada insiden, siapa yang boleh dibangunkan?
Satu hal yang sering kelupaan: kepemilikan app jangan nempel di akun pribadi. Kalau pembuat app keluar dari workspace, app bisa ikut bermasalah. Pindahkan kepemilikan ke akun bersama atau tambahkan beberapa kolaborator di dashboard sejak awal. Lima menit kerja hari ini, dan kalian terhindar dari drama "botnya punya siapa, ya?" tahun depan.
Kebiasaan dokumentasi ini kelihatan sepele dibanding serunya menulis kode, tapi justru inilah yang membedakan bot iseng akhir pekan dengan infrastruktur tim yang bisa diandalkan bertahun-tahun.
Keamanan Token: Jangan Sampai Bot Kalian Jadi Pintu Belakang
Ada satu hal yang bikin MUGHU deg-degan tiap kali audit proyek lama: token Slack yang tercecer. Token bot itu ibarat kunci kantor — siapa pun yang pegang bisa masuk, baca pesan, dan kirim apa saja atas nama bot kalian. Sekali bocor ke repository publik, hitungan menitnya saja sebelum ada bot scanner yang menemukannya.
Beberapa aturan main yang sebaiknya nggak ditawar:
Baca juga CodeBuddy: Editor Kode AI untuk Coding Lebih Cepat
-
Jangan pernah commit token ke Git. Pakai file
.envyang masuk.gitignore, atau lebih bagus lagi secret manager di platform hosting kalian. Kalau terlanjur ke-commit, revoke tokennya saat itu juga — menghapus commit saja nggak cukup karena riwayat Git bisa digali. -
Minta scope seminimal mungkin. Kalau bot cuma perlu kirim pesan, cukup
chat:write. Godaan untuk mencentang semua scope "biar aman ke depannya" justru bikin risiko membengkak. Makin lebar izin, makin besar kerusakan kalau token jatuh ke tangan yang salah. -
Rotasi token secara berkala. Slack menyediakan fitur token rotation untuk app tertentu. Kalau belum sempat setup, minimal jadwalkan pengecekan manual tiap kuartal: token mana yang masih aktif, dipakai di mana, dan siapa yang pegang.
-
Verifikasi request yang masuk. Setiap event dan interaksi dari Slack disertai signing secret. Bolt sudah memverifikasinya otomatis, tapi kalau kalian bikin endpoint sendiri, wajib cek signature ini. Tanpa itu, siapa pun bisa berpura-pura jadi Slack dan menyuntikkan data palsu ke sistem kalian.
Prinsip-prinsipnya sebenarnya sama dengan pengamanan aplikasi web pada umumnya. Kalau mau memperdalam pola pikirnya, panduan OWASP layak jadi bacaan rutin — banyak kebocoran data besar berawal dari hal remeh seperti kredensial yang tercecer.
Menghadapi Rate Limit Tanpa Panik
Cepat atau lambat, bot kalian bakal ketemu respons 429 Too Many Requests. Ini bukan hukuman, cuma cara Slack menjaga infrastrukturnya tetap sehat. Yang jadi masalah adalah kalau kode kalian nggak siap menghadapinya.
Aturan praktisnya: chat.postMessage dibatasi sekitar satu pesan per detik per channel, dengan sedikit toleransi untuk lonjakan singkat. Kalau bot kalian perlu mengirim laporan ke 50 channel sekaligus, jangan tembak semuanya dalam satu loop tanpa jeda.
for (const channel of daftarChannel) {
try {
await client.chat.postMessage({ channel, text: laporanHarian });
} catch (error) {
if (error.code === 'slack_webapi_platform_error'
&& error.data?.error === 'ratelimited') {
const tunggu = Number(error.data.headers?.['retry-after'] ?? 30);
await new Promise((r) => setTimeout(r, tunggu * 1000));
await client.chat.postMessage({ channel, text: laporanHarian });
}
}
// jeda kecil antar pesan biar aman
await new Promise((r) => setTimeout(r, 1100));
}
Perhatikan header Retry-After di respons — Slack memberi tahu persis berapa detik kalian harus menunggu. Menghormati angka itu jauh lebih elegan daripada retry membabi buta yang malah memperpanjang hukuman.
Satu trik lagi yang sering menyelamatkan: gabungkan pesan. Daripada kirim sepuluh notifikasi terpisah dalam semenit, kumpulkan dulu lalu kirim satu pesan berisi ringkasan. Rate limit aman, dan kolega kalian juga nggak diberondong notifikasi bertubi-tubi. Dua masalah selesai sekaligus.
Etika Notifikasi: Bot yang Sopan Lebih Panjang Umur
Ini pelajaran yang MUGHU dapat dengan cara pahit. Dulu ada bot monitoring yang tiap ada error langsung mention @channel. Minggu pertama semua orang sigap. Bulan kedua, channel-nya di-mute rame-rame. Bot yang berisik itu nasibnya sama kayak alarm mobil di parkiran: bunyi terus sampai nggak ada yang peduli.
Beberapa etika yang bikin bot kalian tetap disayang:
-
Pakai thread untuk detail. Kirim ringkasan singkat di channel, lalu taruh log lengkap atau stack trace di thread lewat parameter
thread_ts. Channel tetap bersih, yang butuh detail tinggal klik. -
Mention hanya kalau butuh aksi.
@heredan@channelitu senjata pamungkas, bukan bumbu harian. Simpan untuk insiden yang benar-benar butuh manusia turun tangan sekarang juga. -
Kenali jam kerja. Laporan rutin nggak perlu masuk jam 11 malam. Manfaatkan
chat.scheduleMessageyang sudah kita bahas sebelumnya untuk menahan pesan non-urgent sampai pagi. -
Beri jalan keluar. Sediakan cara buat anggota tim mengatur notifikasi mana yang mau mereka terima — sesederhana slash command
/bot-langgananyang menyimpan preferensi per orang.
Kedengarannya soal rasa, tapi dampaknya nyata: bot yang sopan dipakai terus, bot yang berisik dimatikan diam-diam oleh admin workspace.
Integrasi dengan Sistem Internal: Bot Sebagai Jembatan
Kekuatan sebenarnya dari bot Slack baru terasa saat dia terhubung ke sistem yang sudah tim kalian pakai. Bot absensi yang menulis langsung ke database HR. Bot laporan penjualan yang menarik angka dari spreadsheet tim finance tiap pagi. Bot tiket yang bikin issue baru di sistem tracking begitu ada yang lapor lewat modal.
Pola arsitekturnya hampir selalu sama:
-
Slack sebagai antarmuka — tempat orang mengetik perintah atau menekan tombol.
-
Server bot sebagai penerjemah — menerima event, memvalidasi, lalu memanggil API sistem internal.
-
Sistem internal sebagai sumber kebenaran — data tetap tersimpan di tempat semestinya, bukan di Slack.
Poin ketiga ini penting banget. Godaan menyimpan data langsung di pesan Slack itu besar karena praktis, tapi pesan bisa dihapus, diedit, atau hilang saat retensi workspace berjalan. Perlakukan Slack sebagai layar tampilan, bukan lemari arsip.
Satu jebakan yang perlu diwaspadai saat integrasi: timeout tiga detik. Slack menuntut acknowledgment dalam tiga detik untuk slash command dan interaksi. Kalau proses di sistem internal kalian butuh waktu lebih lama — query berat, panggilan API pihak ketiga yang lambat — jangan ditunggu. Balas dulu dengan ack() dan pesan semacam "Sedang diproses...", jalankan tugasnya di background, lalu kirim hasil akhirnya lewat response_url atau chat.postMessage. Untuk detail kontrak API dan payload-nya, dokumentasi resmi Slack API tetap jadi rujukan paling akurat dan hampir selalu lebih mutakhir daripada tutorial mana pun.
Pola "balas cepat, proses belakangan" ini sepele kelihatannya, tapi inilah pembeda antara bot yang terasa responsif dengan bot yang sering muncul pesan error "operation timed out" — padahal prosesnya sebenarnya jalan.
Socket Mode vs HTTP Endpoint: Pilih Jalur yang Pas
Sebelum bot kalian bisa menerima event, ada satu keputusan arsitektur yang sering bikin bingung: pakai Socket Mode atau HTTP endpoint publik?
Socket Mode bekerja lewat koneksi WebSocket yang dibuka dari server kalian ke Slack. Artinya, server bot nggak perlu punya alamat publik sama sekali. Buat bot internal yang jalan di jaringan kantor atau di laptop saat pengembangan, ini nyaman banget — nggak perlu ribet setting reverse proxy atau buka port di firewall.
const { App } = require('@slack/bolt');
const app = new App({
token: process.env. SLACK_BOT_TOKEN,
appToken: process.env. SLACK_APP_TOKEN, // token level aplikasi, awalan xapp-
socketMode: true,
});
await app.start();
console.log('⚡ Bot jalan lewat Socket Mode');
Perhatikan: Socket Mode butuh app-level token (awalan xapp-) dengan scope connections:write, terpisah dari bot token biasa. Ini sering kelewat waktu pertama kali setup.
HTTP endpoint sebaliknya: Slack yang mengirim request ke URL publik kalian. Ini jadi keharusan begitu bot didistribusikan ke luar workspace sendiri, karena Socket Mode nggak didukung untuk aplikasi yang dipublikasikan di App Directory. Pengalaman MUGHU: mulai dengan Socket Mode saat prototipe, lalu migrasi ke HTTP endpoint begitu bot masuk tahap serius. Bolt bikin migrasinya nggak sakit — sebagian besar kode handler kalian nggak perlu diubah, cukup konfigurasi App-nya saja.
App Home: Beranda Pribadi Bot Kalian
Fitur yang sering dilupakan padahal powerful: App Home, tab beranda yang muncul saat orang mengeklik nama bot di sidebar. Daripada memaksa orang menghafal slash command, kalian bisa menampilkan dasbor pribadi di sana — daftar tugas, status langganan notifikasi, sampai tombol aksi cepat.
Cara kerjanya: dengarkan event app_home_opened, lalu render tampilan lewat views.publish.
app.event('app_home_opened', async ({ event, client }) => {
await client.views.publish({
user_id: event.user,
view: {
type: 'home',
blocks: [
{
type: 'header',
text: { type: 'plain_text', text: 'Ringkasan Hari Ini' },
},
{
type: 'section',
text: { type: 'mrkdwn', text: '*3 tiket* menunggu review kalian.' },
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'Lihat Semua Tiket' },
action_id: 'lihat_tiket',
},
],
},
],
},
});
});
Yang menarik, tampilan ini per orang. Budi dan Sari bisa melihat isi App Home yang beda sesuai data masing-masing. Jangan lupa aktifkan dulu tab Home di pengaturan aplikasi (bagian App Home), karena secara bawaan fitur ini mati — jebakan klasik yang bikin event app_home_opened seolah nggak pernah masuk.
Baca juga GitHub Copilot: Cara Mempercepat Kerja Tim
Menyimpan State: Bot Juga Butuh Ingatan
Begitu bot kalian punya fitur langganan notifikasi atau preferensi per orang, muncul pertanyaan: datanya disimpan di mana? Variabel di memori jelas bukan jawaban — sekali server restart, semua preferensi hilang dan kolega kalian heran kenapa langganannya lenyap.
Pilihan praktisnya bertingkat sesuai kebutuhan:
-
SQLite — cukup buat bot internal dengan data kecil. Satu file, nggak butuh server database terpisah, gampang di-backup.
-
PostgreSQL atau MySQL — begitu data mulai relasional dan diakses banyak proses, ini pilihan aman jangka panjang.
-
Redis — pas buat data yang sifatnya sementara, kayak cache hasil query atau antrean pesan yang mau digabung sebelum dikirim. Dokumentasi Redis punya panduan pola penggunaan yang enak diikuti.
Satu prinsip yang MUGHU pegang: simpan ID Slack, bukan nama. Nama tampilan bisa berubah kapan saja, tapi user ID (U0123ABC) dan channel ID (C0456DEF) itu stabil. Skema tabel langganan sederhananya kira-kira begini:
CREATE TABLE langganan (
user_id TEXT NOT NULL, -- ID Slack, bukan nama
jenis_notifikasi TEXT NOT NULL,
aktif INTEGER DEFAULT 1,
diubah_pada TEXT DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, jenis_notifikasi)
);
Dengan struktur ini, slash command /bot-langganan yang kita singgung sebelumnya tinggal baca-tulis ke tabel tersebut. Sederhana, tapi bikin bot terasa personal.
Deployment: Dari Laptop ke Server yang Nggak Tidur
Bot yang jalan di laptop itu nasibnya jelas: mati begitu laptopnya dibawa pulang. Untuk produksi, kalian butuh tempat yang hidup 24 jam.
Beberapa jalur yang umum dipakai tim di Indonesia:
-
VPS biasa — sewa server kecil, jalankan bot dengan process manager kayak PM2 biar otomatis restart saat crash. Kontrol penuh, biaya bulanan jelas.
-
Platform container — bungkus bot dalam Docker, deploy ke layanan container manapun. Enaknya, lingkungan pengembangan dan produksi dijamin sama.
-
Serverless — bisa, tapi hati-hati. Ingat timeout tiga detik yang kita bahas: cold start pada fungsi serverless bisa memakan sebagian besar jatah waktu itu. Kalau tetap mau serverless, pisahkan proses
ack()yang cepat dari pekerjaan berat yang jalan di belakang.
Apa pun pilihannya, ada tiga hal yang wajib ada sebelum kalian bilang "sudah produksi":
-
Variabel lingkungan untuk semua kredensial. Token nggak boleh nempel di kode — ini sambungan langsung dari pembahasan keamanan token sebelumnya.
-
Restart otomatis. Bot pasti pernah crash. Yang membedakan bot amatir dan bot serius adalah seberapa cepat dia bangun lagi tanpa disuruh.
-
Log yang bisa dibaca ulang. Saat ada laporan "bot-nya nggak balas nih", log adalah satu-satunya saksi mata. Minimal catat timestamp, jenis event, dan hasilnya — sukses atau error apa.
Satu kebiasaan kecil yang menyelamatkan MUGHU berkali-kali: sediakan endpoint atau perintah sederhana buat cek kesehatan bot, semacam /bot-status yang membalas versi aplikasi dan waktu terakhir restart. Saat ada yang lapor masalah, pengecekan pertama cuma butuh lima detik, bukan sesi debugging setengah jam.
Pesan Terjadwal: Biar Bot yang Begadang, Bukan Kalian
Ada satu pola yang hampir selalu muncul begitu bot mulai dipakai serius: permintaan laporan rutin. Rekap tiket tiap pagi, pengingat standup jam sembilan, ringkasan deploy tiap Jumat sore. Kabar baiknya, Teman-Teman nggak perlu bangun subuh buat menekan tombol kirim.
Ada dua pendekatan yang biasa MUGHU pakai:
Pertama, chat.scheduleMessage bawaan Slack. API ini menerima parameter post_at berupa Unix timestamp, lalu Slack yang mengurus pengirimannya.
await client.chat.scheduleMessage({
channel: 'C0456DEF',
post_at: Math.floor(waktuKirim.getTime() / 1000),
text: 'Pengingat: standup dimulai 15 menit lagi.',
});
Cocok buat pesan satuan yang waktunya sudah pasti. Catatannya: pesan terjadwal cuma bisa dipasang maksimal 120 hari ke depan, dan mengelola puluhan jadwal lewat API ini lama-lama merepotkan.
Kedua, cron di sisi server sendiri. Buat laporan rutin yang isinya dinamis — misalnya rekap tiket yang datanya baru diambil saat itu juga — lebih enak pakai penjadwal di aplikasi kalian, misalnya pustaka node-cron. Bot bangun sesuai jadwal, tarik data, susun pesan, kirim lewat chat.postMessage biasa. Kalau sintaks cron bikin pusing (jujur saja, 0 2 * * 1-5 itu nggak intuitif), crontab.guru jadi penyelamat buat menerjemahkan maksudnya.
Satu jebakan yang pernah bikin MUGHU malu: zona waktu. Server produksi sering berjalan di UTC, jadi jadwal "jam 9 pagi" bisa meleset tujuh jam dari WIB. Selalu tetapkan zona waktu secara eksplisit di konfigurasi cron, jangan mengandalkan bawaan server.
Menangani Error dengan Anggun: Bot yang Gagal Diam-Diam Itu Bahaya
Error di bot Slack itu punya sifat licik: sering nggak kelihatan. Kalau situs web error, pengguna langsung lihat halaman rusak. Kalau bot error, yang terjadi cuma... hening. Pesan nggak terkirim, dan nggak ada yang sadar sampai tiga hari kemudian.
Prinsip yang MUGHU pegang: setiap panggilan API Slack harus dibungkus penanganan error, dan errornya harus mendarat di tempat yang kelihatan.
try {
await client.chat.postMessage({ channel, text });
} catch (error) {
if (error.data?.error === 'channel_not_found') {
logger.warn(`Channel ${channel} tidak ditemukan, mungkin bot dikeluarkan`);
} else if (error.data?.error === 'ratelimited') {
await antrianUlang(channel, text); // masuk antrean, coba lagi nanti
} else {
logger.error('Gagal kirim pesan', { channel, error: error.data?.error });
await kirimKeChannelAlert(error); // beri tahu tim pemelihara
}
}
Perhatikan tiga cabang di atas. Error channel_not_found biasanya berarti bot dikeluarkan dari channel — nggak perlu panik, cukup catat dan berhenti mencoba. Error ratelimited sudah kita bahas: masuk antrean, hormati header Retry-After. Sisanya adalah error tak terduga yang justru paling penting: kirim ke channel khusus alert biar tim pemelihara tahu detik itu juga, bukan tiga hari kemudian.
Kebiasaan pelengkapnya: bedakan error yang bisa dicoba ulang (jaringan putus sebentar, rate limit) dari yang percuma diulang (channel nggak ada, izin kurang). Mengulang permintaan yang pasti gagal cuma bikin log penuh sampah dan rate limit makin cepat habis.
Izin dan Scope: Minta Secukupnya, Jangan Borong
Waktu pertama bikin aplikasi Slack, ada godaan besar buat mencentang semua scope "biar aman". Jangan. Setiap scope tambahan itu risiko tambahan — kalau token bocor, kerusakannya sebesar izin yang kalian pegang.
Aturan praktisnya sederhana: mulai dari scope minimum, tambah hanya saat fitur baru benar-benar membutuhkannya. Bot notifikasi biasa umumnya cukup dengan:
Baca juga Mengenal Astro 7.1: Framework JavaScript Ringan untuk Website
-
chat:write— kirim pesan ke channel tempat bot diundang. -
commands— kalau pakai slash command. -
app_mentions:read— kalau bot perlu merespons saat di-mention.
Daftar lengkap scope beserta penjelasannya ada di dokumentasi resmi Slack API, dan layak dibaca pelan-pelan sebelum mencentang apa pun.
Satu hal yang sering bikin bingung: setiap kali menambah scope, aplikasi harus di-install ulang ke workspace. Ini jebakan klasik — kalian tambah scope di halaman konfigurasi, kode sudah benar, tapi API tetap membalas missing_scope. Solusinya cuma satu tombol "Reinstall App", tapi kalau nggak tahu, bisa setengah jam terbuang buat debugging yang salah arah.
Ada juga perbedaan antara bot token (xoxb-) dan user token (xoxp-). Hampir semua kebutuhan bot internal cukup dengan bot token. User token bertindak atas nama seseorang — kekuatannya besar, risikonya juga. Kalau ada anggota tim yang mengusulkan pakai user token "biar bisa akses semua channel", itu momen yang tepat buat berhenti sejenak dan bertanya: apakah fiturnya memang butuh itu, atau cukup dengan mengundang bot ke channel yang relevan?
Merawat Bot Jangka Panjang: Versi, Changelog, dan Kebiasaan Kecil
Bot yang berumur panjang bukan yang kodenya paling canggih, tapi yang paling gampang dirawat. Setelah beberapa tahun memelihara bot kantor, ada beberapa kebiasaan yang menurut MUGHU nilainya jauh lebih besar dari usahanya:
-
Beri nomor versi dan changelog singkat. Nggak perlu ritual rilis megah — cukup berkas
CHANGELOG.mdberisi tanggal dan perubahan penting. Saat ada yang tanya "kok perilaku botnya beda ya minggu ini?", jawabannya tinggal dibuka, bukan diingat-ingat. -
Umumkan perubahan lewat botnya sendiri. Setiap rilis fitur baru, kirim pengumuman singkat ke channel tempat bot aktif. Selain informatif, ini juga cara halus mengingatkan semua orang bahwa bot ini dirawat, bukan ditinggal.
-
Jadwalkan pemeriksaan berkala. Sebulan sekali, luangkan lima belas menit: cek log error, lihat apakah ada scope yang sudah nggak terpakai, pastikan dependensi nggak ketinggalan terlalu jauh. Pustaka
@slack/boltcukup rajin diperbarui, dan menunda upgrade dua tahun jauh lebih menyakitkan daripada mencicilnya tiap beberapa bulan. -
Uji jalur kritis setelah tiap perubahan besar. Minimal tiga hal: slash command utama merespons, notifikasi rutin terkirim, dan tombol interaktif berfungsi. Tiga menit pengujian manual ini sudah menangkap mayoritas regresi yang pernah MUGHU temui.
Kebiasaan-kebiasaan ini terdengar remeh, tapi justru inilah pembeda antara bot yang tetap dipakai lima tahun kemudian dan bot yang pelan-pelan ditinggalkan karena nggak ada yang berani menyentuh kodenya.
Block Kit: Biar Pesan Bot Nggak Cuma Teks Polos
Setelah bot kalian rajin kirim notifikasi, cepat atau lambat bakal ada yang komentar: "Pesannya kok gitu-gitu aja ya?" Di sinilah Block Kit masuk. Ini sistem tata letak dari Slack yang membolehkan kita menyusun pesan dari balok-balok: teks berformat, tombol, menu pilihan, gambar, sampai pembatas antarbagian.
Bedanya terasa banget. Pesan teks polos berisi lima baris data itu melelahkan dibaca. Pesan yang sama, disusun pakai section dengan field berdampingan plus satu tombol aksi, langsung terlihat profesional. Contoh sederhananya:
await client.chat.postMessage({
channel,
text: 'Laporan harian siap', // fallback untuk notifikasi
blocks: [
{
type: 'section',
text: { type: 'mrkdwn', text: '*Laporan Harian* — Rabu, 15 Juli' },
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: '*Tiket masuk:*\n42' },
{ type: 'mrkdwn', text: '*Tiket selesai:*\n38' },
],
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'Lihat Detail' },
action_id: 'lihat_detail_laporan',
},
],
},
],
});
Satu jebakan yang sering kelewat: properti text di luar blocks itu tetap wajib diisi. Dia jadi cadangan buat notifikasi push dan pembaca layar. Kalau dikosongkan, notifikasi di HP pengguna cuma muncul sebagai pesan hampa — pengalaman yang bikin orang buru-buru mematikan notifikasi bot kalian.
Kabar baiknya, kalian nggak perlu menghafal struktur JSON-nya. Slack menyediakan Block Kit Builder — semacam kanvas interaktif tempat kalian menyusun balok sambil melihat hasilnya langsung, lalu tinggal salin JSON-nya ke kode. MUGHU hampir selalu mendesain di sana dulu sebelum menyentuh editor.
Satu prinsip yang MUGHU pegang soal desain pesan: jangan pindahkan seluruh dashboard ke Slack. Pesan yang bagus itu ringkas — angka penting, konteks secukupnya, satu tombol menuju sumber lengkapnya. Kalau pesannya butuh di-scroll tiga kali, itu tanda datanya lebih pantas tinggal di halaman web.
Dokumentasi Pengguna: Bot yang Nggak Dijelaskan Bakal Salah Dipakai
Ini bagian yang paling sering di-skip, padahal murah banget dibuat. Bot kalian mungkin jelas buat kalian sendiri, tapi buat rekan kerja yang baru bergabung bulan depan? Belum tentu.
Dokumentasi bot internal nggak perlu megah. Yang penting menjawab empat pertanyaan:
-
Bot ini ngapain? Satu kalimat, tanpa jargon.
-
Perintah apa saja yang tersedia? Daftar slash command lengkap dengan contoh nyata, bukan cuma sintaks.
-
Kalau error, lapor ke mana? Sebut channel atau orangnya. Jangan biarkan pengguna menebak.
-
Data apa yang diakses bot? Ini bikin tim keamanan dan pengguna sama-sama tenang.
Trik kecil yang efeknya besar: taruh ringkasan dokumentasi ini di App Home bot dan di deskripsi aplikasinya. Orang yang penasaran biasanya mengklik nama bot dulu sebelum bertanya ke siapa pun. Kalau jawabannya sudah menunggu di sana, kalian baru saja menghemat lusinan pertanyaan berulang.
Perintah /help juga layak dibuat sejak hari pertama. Isinya cukup daftar kemampuan bot plus tautan ke dokumentasi lengkap. Berdasarkan pengalaman MUGHU, ini fitur dengan rasio manfaat-per-baris-kode tertinggi di seluruh proyek.
Mengukur Pemakaian: Jangan Cuma Merasa Berguna
Bot yang jalan lancar belum tentu bot yang dipakai. Bedanya baru ketahuan kalau kalian mengukur. Nggak perlu perkakas analitik mahal — cukup catat tiga hal di log setiap kali bot dipakai: perintah apa, kapan, dan di channel mana (tanpa perlu menyimpan isi pesannya).
Sebulan sekali, lihat polanya. Perintah yang nggak pernah disentuh selama tiga bulan itu kandidat kuat buat dihapus — setiap fitur yang bertahan tanpa pengguna cuma menambah beban perawatan. Sebaliknya, kalau ada satu perintah yang dipakai jauh lebih sering dari perkiraan, itu sinyal buat memolesnya lebih serius.
Angka-angka ini juga senjata ampuh waktu ada yang bertanya "bot ini masih perlu dirawat nggak sih?". Jawaban berupa "dipakai 340 kali bulan lalu oleh 27 orang" jauh lebih meyakinkan daripada "kayaknya sih banyak yang pakai".
Kesimpulan
Membangun bot Slack yang benar-benar dipakai ternyata bukan soal kode yang paling canggih, melainkan soal perhatian pada detail-detail kecil yang sering dianggap sepele. Properti text yang tetap diisi sebagai cadangan notifikasi, pesan yang ringkas alih-alih memindahkan seluruh dashboard, dokumentasi sederhana yang menjawab empat pertanyaan dasar, sampai perintah /help yang dibuat sejak hari pertama — semuanya murah dibangun, tapi dampaknya terasa setiap hari oleh setiap pengguna.
Dari pengalaman MUGHU, pola kegagalannya hampir selalu sama: bot dibuat dengan semangat, dirilis tanpa penjelasan, lalu perlahan ditinggalkan karena nggak ada yang tahu cara pakainya — dan nggak ada yang mengukur apakah dia masih berguna. Kebiasaan mencatat pemakaian sebulan sekali mengubah percakapan dari "kayaknya sih dipakai" menjadi keputusan berbasis angka: fitur mana yang dipoles, mana yang dipensiunkan. Itu perbedaan antara bot yang jadi aset tim dan bot yang jadi utang perawatan.
Langkah berikutnya ada di tangan kalian. Buka dokumentasi resmi Slack API, rancang pesan pertama kalian di Block Kit Builder, dan mulai dari satu perintah kecil yang menyelesaikan satu masalah nyata di tim. Bot terbaik jarang lahir dari rencana besar — dia lahir dari satu /help yang jujur, satu log yang rapi, dan kemauan buat terus mendengarkan penggunanya.
Baca juga 9Router v0.5.35: Solusi Rate Limit AI Coding
Referensi
Slack. (2026). Login.
Slack. (2026). Download Slack Desktop and Mobile App for Windows.
Wikipedia. (2026). Slack (software).
Microsoft Store. (2026). Slack: Free download and install on Windows.
Slack. (2026). Log in.
Slack. (2026). AI Work Platform and Productivity Tools.
Slack. (2026). Find your workspace.
Slack. (2026). What is Slack and how does it work?
Slack. (2026). Please update your browser to use Slack.
Slack Demo. (2026). Slack Product Tour.
Komentar (0)
Belum ada komentar. Jadilah yang pertama berbagi pendapat!
Tinggalkan komentar