Gambaran cara kerjanya
Contoh kasusnya toko online kecil di Jakarta yang jualan kopi bubuk. Setiap hari ada puluhan chat yang isinya mirip: "masih ada stok?", "ongkir ke Bekasi berapa?", "bisa COD?". Bot AI bisa menjawab pertanyaan rutin ini 24 jam, dan meneruskan sisanya ke admin.
- Pelanggan mengirim pesan ke nomor WhatsApp toko.
- WhatsApp Cloud API mengirim pesan itu ke alamat webhook di server kamu.
- Server Python mengirim pesan, beserta instruksi tentang toko, ke model AI lewat OpenAI SDK.
- Jawaban AI dikirim balik ke pelanggan lewat WhatsApp Cloud API.
Yang perlu disiapkan
- Akun MaCloud AI dengan saldo (top up mulai Rp 50.000 lewat QRIS atau transfer bank) dan satu API key khusus bot.
- Akun Meta for Developers, aplikasi dengan produk WhatsApp, dan nomor telepon yang didaftarkan ke WhatsApp Cloud API. Nomor yang sudah dipakai di aplikasi WhatsApp biasa umumnya tidak bisa langsung dipakai; ikuti ketentuan Meta.
- Server dengan HTTPS (VPS kecil sudah cukup). Untuk uji coba di laptop bisa pakai tunnel seperti ngrok atau Cloudflare Tunnel.
- Python 3 dan paket
flask,openai,requests.
Verifikasi bisnis, persetujuan nama tampilan, batas jumlah pesan dan biaya percakapan WhatsApp semuanya diatur oleh Meta, bukan oleh MaCloud AI. Kami tidak bisa mempercepat atau menjamin persetujuan dari Meta. Selalu ikuti dokumentasi resmi WhatsApp Cloud API untuk langkah terbaru.
Langkah 1: siapkan WhatsApp Cloud API
Di dashboard Meta for Developers, buat aplikasi, tambahkan produk WhatsApp, lalu ikuti petunjuk awal di sana. Yang kamu butuhkan untuk kode di bawah:
- Access token untuk mengirim pesan (token sementara cukup untuk uji coba; untuk produksi pakai token permanen sesuai petunjuk Meta).
- Phone number ID dari nomor yang dipakai bot.
- App secret dari pengaturan aplikasi, untuk memeriksa bahwa request webhook benar dari Meta.
- Verify token: kata rahasia buatan kamu sendiri, diisi di dashboard Meta dan di server.
Setelah server jalan, isi alamat webhook (misalnya https://bot.tokokamu.id/webhook) dan verify token di pengaturan webhook WhatsApp di dashboard Meta, lalu langganan (subscribe) ke kolom messages.
Langkah 2: server Python kecil
Pasang paket dengan pip install flask openai requests, simpan kode ini sebagai bot.py:
import hashlib, hmac, os, threading
import requests
from flask import Flask, request
from openai import OpenAI
app = Flask(__name__)
ai = OpenAI(base_url="https://api.macloudai.com/v1", api_key=os.environ["MACLOUD_KEY"])
VERIFY_TOKEN = os.environ["WA_VERIFY_TOKEN"] # kata rahasia buatan sendiri
WA_TOKEN = os.environ["WA_TOKEN"] # access token dari Meta
PHONE_ID = os.environ["WA_PHONE_ID"] # Phone number ID dari Meta
APP_SECRET = os.environ.get("WA_APP_SECRET", "")
GRAPH_URL = os.environ["WA_GRAPH_URL"] # alamat Graph API sesuai dokumentasi Meta
SYSTEM = (
"Kamu admin toko online Kopi Kemang di Jakarta Selatan. "
"Jawab singkat, ramah, bahasa Indonesia sehari-hari. "
"Jam operasional 09.00-21.00 WIB, pengiriman lewat kurir dari Jakarta. "
"Kalau ditanya stok, ongkir pasti atau komplain, bilang admin akan cek dan balas. "
"Jangan mengarang harga atau janji."
)
history = {}
seen = set()
@app.get("/webhook")
def verify():
if (request.args.get("hub.mode") == "subscribe"
and request.args.get("hub.verify_token") == VERIFY_TOKEN):
return request.args.get("hub.challenge", ""), 200
return "forbidden", 403
def signature_ok(req):
if not APP_SECRET:
return True
got = req.headers.get("X-Hub-Signature-256", "")
want = "sha256=" + hmac.new(APP_SECRET.encode(), req.get_data(), hashlib.sha256).hexdigest()
return hmac.compare_digest(got, want)
@app.post("/webhook")
def receive():
if not signature_ok(request):
return "bad signature", 403
data = request.get_json(silent=True) or {}
for entry in data.get("entry", []):
for change in entry.get("changes", []):
for msg in change.get("value", {}).get("messages", []):
if msg.get("type") != "text" or msg["id"] in seen:
continue
seen.add(msg["id"])
threading.Thread(target=reply, args=(msg["from"], msg["text"]["body"])).start()
return "ok", 200 # balas cepat supaya Meta tidak mengirim ulang
def reply(wa_id, text):
chat = history.setdefault(wa_id, [])
chat.append({"role": "user", "content": text})
del chat[:-10] # simpan 10 pesan terakhir saja, supaya token input tidak membengkak
try:
r = ai.chat.completions.create(
model="gem-3.8-flash",
max_tokens=300,
messages=[{"role": "system", "content": SYSTEM}] + chat,
)
answer = r.choices[0].message.content
except Exception:
answer = "Maaf, sistem lagi sibuk. Admin kami akan balas sebentar lagi ya."
chat.append({"role": "assistant", "content": answer})
requests.post(
f"{GRAPH_URL}/{PHONE_ID}/messages",
headers={"Authorization": f"Bearer {WA_TOKEN}"},
json={"messaging_product": "whatsapp", "to": wa_id,
"type": "text", "text": {"body": answer}},
timeout=15,
)
if __name__ == "__main__":
app.run(port=8000)
Bagian yang menerima dan membalas pesan memakai bentuk payload WhatsApp Cloud API yang umum. Alamat Graph API dan versinya ditaruh di variabel WA_GRAPH_URL supaya kamu isi sesuai dokumentasi Meta yang berlaku, tanpa mengubah kode.
Langkah 3: jalankan dan uji
export MACLOUD_KEY=sk-...
export WA_VERIFY_TOKEN=rahasia-buatan-sendiri
export WA_TOKEN=...
export WA_PHONE_ID=...
export WA_APP_SECRET=...
export WA_GRAPH_URL=https://graph.facebook.com/vXX.X
python bot.py
$env:MACLOUD_KEY="sk-..."
$env:WA_VERIFY_TOKEN="rahasia-buatan-sendiri"
$env:WA_TOKEN="..."
$env:WA_PHONE_ID="..."
$env:WA_APP_SECRET="..."
$env:WA_GRAPH_URL="https://graph.facebook.com/vXX.X"
python bot.py
- Jalankan server, lalu buka tunnel ke port 8000 kalau masih di laptop.
- Isi alamat webhook
https://alamat-kamu/webhookdan verify token di dashboard Meta, lalu klik verifikasi. Kalau berhasil, server membalashub.challenge. - Kirim pesan WhatsApp ke nomor bot dari nomor yang diizinkan untuk uji coba.
- Cek konsol → tab Pemakaian: setiap balasan bot muncul dengan token dan biayanya.
Berapa biaya AI per chat?
Biaya AI dihitung per token: (token input ÷ 1.000.000 × harga input) + (token output ÷ 1.000.000 × harga output). Token input mencakup instruksi toko, riwayat 10 pesan terakhir dan pertanyaan baru. Token output adalah jawaban bot, dibatasi max_tokens=300 di kode di atas.
Contoh dengan angka bulat (bukan harga asli): harga input Rp 10.000 dan output Rp 40.000 per 1 juta token. Satu balasan dengan 1.500 token input dan 150 token output = Rp 15 + Rp 6 = Rp 21. Kalau sehari ada 300 balasan, biaya AI sekitar Rp 6.300 per hari. Harga asli tiap model ada di tabel ini:
Harga asli sekarang
Perkiraan dari harga di halaman model: 2.000 token input dan 500 token output per chat. Potongan saldo yang asli ada di konsol.
| Model | Per chat | 1.000 chat |
|---|---|---|
| GEM 3.8 Flash | Rp 4 | Rp 4.434 |
| TT-6 Luna | Rp 11 | Rp 10.642 |
| TT-6.1 Terra | Rp 7 | Rp 7.263 |
| HK-5.5 | Rp 3 | Rp 3.487 |
| GEM 4 Argon | Rp 85 | Rp 84.649 |
| TT-6.1 Sol | Rp 15 | Rp 14.526 |
Biaya dari sisi WhatsApp (per percakapan atau per pesan, tergantung jenisnya) ditagih oleh Meta dan mengikuti kebijakan harga Meta yang berlaku, terpisah dari saldo MaCloud AI.
Supaya bot aman dan tidak bikin malu
- Tulis instruksi yang jelas: apa yang boleh dijawab, dan kapan harus bilang "admin akan cek". Jangan biarkan bot mengarang harga, stok atau promo.
- Simpan data yang sering ditanya (jam buka, area kirim, cara bayar) di instruksi sistem, bukan dibiarkan ditebak model.
- Batasi riwayat percakapan dan
max_tokenssupaya biaya per chat tetap kecil. - Jangan simpan API key di kode; pakai environment variable seperti contoh.
- Ikuti aturan Meta soal kapan bisnis boleh membalas atau memulai percakapan; di luar ketentuan itu pesan bisa ditolak.
- Contoh di atas menyimpan riwayat di memori server; untuk produksi, simpan di database dan jalankan di belakang server WSGI seperti gunicorn.
Kalau belum siap pakai WhatsApp Cloud API, coba dulu otomasi tanpa kode lewat panduan n8n. Contoh kode lain ada di dokumentasi.
Pertanyaan umum
Q1Apakah bisa pakai nomor WhatsApp yang sekarang dipakai jualan?
Q2Berapa biaya bot WhatsApp AI per bulan?
Q3Model mana yang cocok untuk bot customer service?
Q4Apakah MaCloud AI bisa membantu verifikasi akun Meta?
Q5Apakah isi chat pelanggan disimpan oleh MaCloud AI?
Q6Kenapa bot membalas dua kali?
Panduan lain
- Cara pakai Claude API di Indonesia tanpa kartu kredit
- Cara pakai Claude Code dengan bayar Rupiah (tanpa kartu kredit)
- Cursor dengan API key sendiri (Claude/GPT, bayar Rupiah)
- Cara pakai API GPT (format OpenAI) dengan bayar QRIS
- Cara setting Cline di VS Code pakai Claude API bayar Rupiah
- Otomasi n8n dengan AI: OpenAI node + base URL, contoh UMKM
Cara menghitung biaya API AI (token) dalam Rupiah