Cara pasang
Widget masuk ke situs klien lewat satu script tag. Tidak ada rebuild website, tidak ada kunci API di browser. Pet demo hidup di pojok halaman ini, jadi semua yang tertulis di bawah bisa langsung dicoba.
1. Siapkan tenant
Satu klien = satu tenant di backend AMM: katalog terverifikasi manusia (SKU, harga, spesifikasi, URL produk), aturan rekomendasi, pertanyaan pengarah, karakter + nama + warna pet, baris celoteh, pengetahuan toko (kolom pengetahuan: fakta resmi seperti garansi, ongkir, area layanan, cara bayar, jadi AI bisa menjawab pertanyaan di luar katalog tanpa mengarang), nomor WhatsApp advisor, dan daftar origin yang boleh memuat widget. Tenant tak dikenal atau origin di luar daftar berarti widget tidak muncul sama sekali; tidak ada fallback ke katalog lain.
Semuanya diisi lewat /admin, dasbor internal di balik sandi. Menambah klien berarti menambah satu baris di basis data, dan widgetnya langsung hidup tanpa menunggu deploy.
2. Tempel lewat GTM
<script src="https://chatbot.adsmediamix.id/v1/loader.js" data-tenant="ID_KLIEN" async></script>
Atribut opsional: data-position="kiri" memindahkan pet ke pojok kiri, data-character="jurnalis|cs|rider|kucing|ninja|kubus" memaksa wujud karakter, data-character-url="..." memakai maskot gambar milik klien, data-roam="off" mematikan jalan-jalan, data-sound="off" mematikan bunyi. ID tenant bukan rahasia; yang menentukan adalah pasangan tenant+origin yang diperiksa server.
Klien tidak punya GTM? Tidak masalah, GTM cuma salah satu pintu. Yang dikirim ke klien tetap potongan yang sama persis, bedanya hanya di mana ditempelnya:
Apa pun jalurnya, domain klien wajib didaftarkan lebih dulu di kolom origin pada dasbor tenant. Domain di luar daftar tidak akan memunculkan widget, dan itu memang disengaja.
3. Pilih karakter
Tiga wujud tersedia; semuanya SVG beranimasi yang mewarnai dirinya dengan warna aksen tenant, bisa diseret, jalan-jalan, dan punya enam gerakan yang dipakai bergantian: lambai, lompat, joget, angguk, tengok kiri-kanan, dan hop senang (khusus saat rekomendasi berhasil keluar). Klik untuk mengganti pet di halaman ini secara langsung:
Per tenant lewat kolom character, per pemasangan lewat data-character. Maskot milik klien juga bisa: unggah gambar (PNG/webp/GIF transparan, disarankan sekitar 512px) lewat tombol di atas untuk mencobanya langsung; di produksi, file yang sama dipasang sebagai characterUrl tenant atau atribut data-character-url. Gambar kustom tetap bernapas, melambai, jalan-jalan, dan bisa diseret; GIF/APNG beranimasi ikut bergerak sendiri.
4. Sapaan proaktif dan kontinuitas
Pet tidak menunggu diklik. Dia menyapa lewat gelembung kecil yang isinya mengikuti konteks: salam pertama (sekali per sesi), produk yang sedang dilihat pengunjung, kedalaman scroll, niat keluar (kursor melesat ke atas), dan baris celoteh milik tenant (kolom celoteh, boleh memakai {produk}). Klik gelembung atau pet-nya, baru chat terbuka.
Batasnya keras supaya menarik, bukan mengganggu: gelembung menutup sendiri dalam 10 detik, jeda antar gelembung 35 detik, maksimal 5 per halaman, dan tombol silang di gelembung mendiamkan pet satu sesi penuh. Percakapan tersimpan per sesi dan ikut pindah halaman: pengunjung yang berpindah-pindah tetap melanjutkan obrolan yang sama, lengkap dengan kartu rekomendasinya. Pesan pet juga keluar dengan irama mengetik manusiawi, dan jawaban AI tampil mengalir kata per kata (setelah lolos guardrail).
Tiga pelengkap per tenant: kolom penawaran berisi SATU penawaran resmi yang ditawarkan pet saat pengunjung berniat menutup tab (teksnya data tenant, AI tidak pernah mengarang diskon; klik gelembungnya tercatat sebagai offer_click); pengunjung yang kembali setelah lebih dari 20 jam disapa "Halo lagi" lengkap dengan topik terakhirnya; dan kolom suara menyalakan bunyi halus saat panel dibuka atau pesan tiba (bawaan mati, bisa dipaksa mati per pemasangan lewat data-sound="off").
Untuk laporan ke klien, setiap pertanyaan bebas dicatat di server berikut teksnya dan dipilah question_answered / question_unanswered. Endpoint /api/pet/ringkasan mengembalikan hitungan event plus daftar pertanyaan yang belum terjawab beberapa hari terakhir; itulah bahan laporan mingguan "ini yang dicari pasar, ini yang belum dijawab katalogmu".
5. Koneksi ke data website
6. Petakan event di GA4
Widget mendorong event berikut ke dataLayer, masing-masing membawa objek amm_pet (tenant, sid, halaman, UTM, dan detail event). Salinan event juga dicatat di server AMM untuk pelaporan.
7. Garis keamanan
- Kunci OpenRouter dan kredensial lain hanya hidup di server; loader tidak memuat rahasia apa pun.
- Bootstrap memeriksa origin lawan allowlist tenant, lalu menerbitkan token HMAC berumur 2 jam; chat dan event hanya menerima panggilan bertoken, dan token basi disegarkan otomatis oleh widget.
- Jawaban model dijaga di kode: angka rupiah di luar katalog ditahan, SKU yang disetop tidak boleh ditawarkan. Data halaman hanya jadi konteks, tidak pernah jadi sumber harga.
- Ada pembatas laju per tenant+IP dan batas panjang pesan.
- Kalau backend mati, widget tidak muncul; situs klien tidak pernah ikut rusak.