Dari nol sampai AI membalas pelanggan pertama
Semua yang perlu disiapkan ada di dashboard. Halaman ini menjelaskan urutannya, apa yang terjadi di belakangnya, dan apa yang harus diperiksa kalau ada yang tidak jalan.
Mulai cepat
Lima langkah, dan hanya langkah kedua yang butuh sesuatu dari luar (akun WhatsApp Business atau bot Telegram).
- Buat workspace. Pendaftaran membuat satu workspace beserta akun Anda sebagai owner. Masa coba berjalan otomatis, tanpa kartu kredit.
- Sambungkan channel. Menu Saluran. WhatsApp lewat Embedded Signup Meta atau manual, Telegram lewat token @BotFather.
- Isi profil bisnis. Menu Settings. Nama, bidang usaha, jam operasional, kontak. AI memakainya untuk memperkenalkan diri dan menjawab pertanyaan dasar tanpa perlu dilatih apa pun.
- Latih dengan knowledge base. Menu Knowledge. Tempel SOP sebagai teks atau unggah PDF; isinya dipotong, di-embedding, dan dipanggil saat relevan.
- Kirim pesan ke nomor itu sendiri. Balasannya muncul di Unified Inbox dalam hitungan detik. Kalau tidak, seksi Kalau tidak ada yang masuk menyebut urutan pemeriksaannya.
Menghubungkan WhatsApp Business
Foid Ai memakai Meta Cloud API langsung, tidak ada penyedia pihak ketiga di antaranya, jadi nomor dan percakapan tetap berada di akun Meta Anda sendiri. Ada dua jalur, dan keduanya berakhir di tempat yang sama:
- Embedded Signup (disarankan). Satu tombol di dashboard membuka dialog milik Meta; Anda memilih Business Portfolio dan nomor di sana. Yang kembali ke kami adalah izin untuk mengirim atas nama nomor itu, bukan password akun Anda.
- Manual. Untuk nomor yang sudah lebih dulu ada di Cloud API: isi Phone Number ID dan access token dari Meta App Dashboard. Dipakai juga saat Embedded Signup belum tersedia untuk negara akun tersebut.
Access token disimpan terenkripsi AES-256-GCM, bukan plaintext, dan tidak pernah dikirim kembali ke browser. Channel yang tokennya ditolak Meta akan berubah menjadi bermasalah di halaman Saluran beserta pesan aslinya dari Graph API, bukan tetap tampak aktif.
Menghubungkan Telegram
Buat bot lewat @BotFather, tempel tokennya di dashboard. Token diperiksa dengan getMe sebelum disimpan, jadi token salah ketik gagal saat itu juga alih-alih menjadi bot yang diam.
Ada dua cara update masuk, dan yang aktif ditentukan server (bukan per bot). Polling untuk mencoba dari laptop; hanya boleh satu instance, karena getUpdates kedua ditolak Telegram. Webhook untuk production; didaftarkan otomatis saat bot disambungkan. Tidak ada yang perlu ditempel manual di sisi Telegram.
Knowledge base (RAG)
Dua cara mengisinya: tempel teks (SOP, daftar harga, FAQ) atau unggah PDF. Keduanya melewati jalur yang sama, dipotong menjadi bagian yang saling bertumpang sedikit, di-embedding, lalu disimpan sebagai vektor di PostgreSQL (pgvector).
Saat pelanggan bertanya, potongan yang paling dekat maknanya diambil dan disertakan ke model bersama profil bisnis Anda. Efeknya: AI menjawab dari dokumen Anda, dan yang tidak ada di dokumen tidak dikarang, percakapannya dialihkan ke staf.
Menu Knowledge punya kolom uji retrieval: masukkan pertanyaan, lihat potongan mana yang terambil. Itu cara tercepat memastikan dokumen yang baru diunggah benar-benar terbaca sebelum pelanggan yang mengujinya.
Webhook
Pesan masuk tidak di-polling dari Meta; Meta yang mengirimkannya ke kami begitu terjadi. Dua endpoint yang menerimanya:
| Endpoint | Keterangan |
|---|---|
GET /webhooks/meta | Verifikasi langganan webhook. Menjawab hub.challenge hanya kalau hub.verify_token cocok. |
POST /webhooks/meta | Penerimaan event. Wajib membawa X-Hub-Signature-256, dan signature-nya dibandingkan atas raw body dengan perbandingan waktu-konstan. |
POST /webhooks/telegram/:botId | Wajib membawa X-Telegram-Bot-Api-Secret-Token yang cocok. Secret-nya tidak disimpan di database, diturunkan lewat HMAC dari kunci server per bot id. |
Webhook yang gagal diproses tidak dijawab dengan error ke Meta: menolaknya berarti kehilangan pesan pelanggan. Yang terjadi adalah event tetap diterima, kegagalannya dicatat, dan percakapannya dialihkan ke staf.
REST API
Seluruh dashboard berjalan di atas API yang sama, jadi apa pun yang bisa dilakukan di layar bisa dilakukan dari program Anda. Autentikasi memakai JWT di header Authorization: Bearer <token>.
GET /api/conversations: daftar percakapan;GET /api/conversations/:iduntuk isinya.POST /api/conversations/:id/reply: balasan manual dari staf.PATCH /api/conversations/:id/status: ambil alih dari AI, kembalikan ke AI, atau tutup.GET /api/conversations/events/stream: aliran SSE untuk pesan masuk realtime.GET /api/tenant/usage: pemakaian token dan kontak aktif periode berjalan.GET /api/public/plans: daftar paket. Satu-satunya endpoint yang bisa dibaca tanpa login.
Batas laju: 300 permintaan per menit per IP untuk /api/*. Endpoint login/pendaftaran lebih ketat, dan webhook jauh lebih longgar.
Self-hosting
Seluruh sistemnya adalah tiga service: PostgreSQL 16 dengan pgvector, backend Node, dan frontend Next.js. Tidak ada layanan berbayar pihak ketiga yang wajib: docker compose up sudah menjalankan semuanya.
Yang wajib disiapkan sendiri:
- Kunci:
JWT_SECRET(min. 32 karakter) danTOKEN_ENCRYPTION_KEY(32 byte hex) untuk mengenkripsi access token Meta. - API key LLM: Gemini atau OpenAI. Tanpa ini AI tidak membalas dan setiap percakapan dialihkan ke staf dengan alasan yang jelas di inbox.
- Kredensial Meta App: app id, app secret, dan token verifikasi webhook, yang harus sama dengan yang diisi di Meta App Dashboard.
- HTTPS dari luar: Meta hanya mengirim webhook ke alamat HTTPS yang bisa dijangkau publik.
Migrasi database dijalankan terpisah dan mencatat checksum tiap berkas, jadi migrasi yang sudah jalan tidak akan jalan dua kali dan berkas yang diubah setelah diterapkan akan ditolak alih-alih diterapkan setengah.
Kalau tidak ada yang masuk
Urutan pemeriksaan, dari yang paling sering:
- Halaman Saluran: apakah channel-nya aktif, dan apakah ada pesan kesalahan di bawahnya? Channel yang tokennya kedaluwarsa muncul sebagai bermasalah, lengkap dengan pesan asli dari Meta.
- Halaman Billing: masa coba yang habis atau kuota token yang tercapai membuat AI berhenti membalas. Keduanya diberi tahu di halaman itu.
- Sakelar Balasan otomatis AI di Settings: kalau mati, pesan tetap masuk ke inbox tapi tidak dibalas AI.
- Percakapan yang berstatus butuh manusia memuat alasannya. Itu jawaban paling langsung atas "kenapa yang ini tidak dibalas".
Masih belum jelas? Kirim id percakapannya ke kontak@foidai.app. Dengan id-nya, log yang relevan bisa langsung dibaca.