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.