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

The flow

  1. The webhook receives {"pesan":{"teks":"perpanjang"},"dari":"628…"}. Your system looks up the account by number.
  2. 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"}]}
  3. 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).
  4. 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."}
  5. 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.
Still stuck after following this guide? Contact us from the dashboard — attach a screenshot if you have one, it speeds everything up.