Guides/For developers
You want customers to choose a package and pay from WhatsApp without opening another app, the way WACO renews itself.
A recipe to replicate WACO's "renew via WhatsApp" for your own billing: incoming-message webhook → offer packages with /api/v1/tombol → the choice comes back via webhook → create the invoice + QR in your system → send the QR image with /api/v1/kirim-media → confirm payment with /api/v1/balas.
2 min read
WACO renews its own subscriptions over WhatsApp (see the guide). That flow is built from four ingredients that are all available to you through the API — nothing proprietary.
Ingredients
- Webhook
message.received: the customer's message reaches your system with the sender number (your key to identify the account) and, for button/list replies,pesan.pilihan = {id, judul}. POST /api/v1/tombol: a message with 1–3 reply buttons (title ≤20 characters, any id).POST /api/v1/daftar: a list message with up to 10 rows — for more packages or picking an account.POST /api/v1/kirim-mediawithtipe: "image"and the URL of the QR image you generate (QRIS from your payment gateway, or any payment code), thenPOST /api/v1/balasfor free text such as the paid confirmation. All are session messages: valid for 24 hours after the customer's last message.
The flow
- The webhook receives
{"pesan":{"teks":"perpanjang"},"dari":"628…"}. Your system looks up the account by number. - Offer packages:
POST /api/v1/tombol {"nomor":"628111222333", "judul":"Renew subscription", "teks":"Account: Toko Maju Active until 30 September 2026 Pick a package:", "tombol":[{"id":"paket:1","judul":"1 month Rp200k"}, {"id":"paket:6","judul":"6 months Rp1.1M"}, {"id":"paket:12","judul":"12 months Rp2M"}]} - The webhook receives the reply:
"pesan":{"tipe":"interactive","pilihan":{"id":"paket:6","judul":"6 months Rp1.1M"}}. Your system creates the invoice and QR at your payment gateway and places the QR image at a public https URL (tokenised and expiring is fine). - Send the QR:
POST /api/v1/kirim-media {"nomor":"628111222333","tipe":"image", "url":"https://app.example.com/qr/inv-2026-0912.png", "caption":"6-month package — Rp 1,221,000 incl. VAT. Valid 30 minutes."} - When your payment gateway reports the payment, confirm it:
POST /api/v1/balas {"nomor":"628111222333","teks":"Payment received. Subscription active until 31 March 2027. Thank you!"}
In n8n: one Webhook node receives messages, one IF separates the text "perpanjang" from choice replies, two HTTP Request nodes call /api/v1/tombol and /api/v1/kirim-media. Store the choice id as "paket:" so you never match on titles.
Everything above is a session message — valid only within 24 hours of the customer's last message. To nudge a silent customer, start with a template (e.g. an expiry reminder) and continue this flow once they reply.
← PreviousYou want to send a broadcast, check a report, or reply to a customer just by chatting with your own AI assistant (Claude, ChatGPT, Cursor), without opening the portal.
Next →Customers ask for prices then order in free-form chat — staff retype it, quantities go wrong, totals are forgotten, proof photos cannot be matched to an order.
Still stuck after following this guide? Contact us from the
dashboard — attach a screenshot if you have one, it speeds everything up.