App Listener
The App Listener is the device-side client that makes payment detection possible without a payment provider’s official API: it reads payment app notifications (DANA, GoPay Merchant, etc.) on the merchant’s phone as they arrive, parses the paid amount, and forwards it to this gateway’s inbound webhook — see Webhooks → Inbound for the exact contract it must call.
For GoPay and ShopeePay specifically, the optional GoBiz Link and ShopeePay Link each add a server-side second detector that polls the linked merchant account’s transaction feed — covering moments the listener can’t (phone off, notification missed). All detectors feed the same matching pipeline and never conflict; keep the App Listener running either way, since it’s the only detector for DANA and every other app.
Currently implemented as a MacroDroid
macro. The filename is versioned (-v1, -v2, …) so a future macro update ships as a new file
instead of silently overwriting this one — existing tenants keep working off whichever version
they already imported until they choose to reimport the newer one.
- qris-gateway-payment-listener-v3.mdr (recommended) — identical to v2, but the webhook URL points at the
laboon.iddomain. Use this for all new setups. - qris-gateway-payment-listener-v2.mdr — retry loop (up to 3 attempts, 30s apart) around the webhook POST, plus a device notification if all attempts fail. Still fully supported: its
laboon.biz.idwebhook URL is dual-served alongsidelaboon.id. Re-import v3 beforelaboon.biz.idis retired. - qris-gateway-payment-listener-v1.mdr — fires the webhook once with no retry. Same
laboon.biz.idcaveat as v2.
- Install MacroDroid from the Play Store.
- In MacroDroid: menu → Import/Export → Import Macro(s), then select the downloaded
.mdrfile. It imports as Payment Listener (QRIS Gateway). - Open the macro and edit its Notification Received trigger — the application list ships empty on purpose, so tap Select Application and choose the merchant’s actual payment app (GoPay Merchant, DANA, etc.).
- Edit the HTTP Request action’s
X-User-ID/X-Webhook-Secretheader values — replace theYOUR_USER_ID/YOUR_WEBHOOK_SECRETplaceholders with your tenant’s own (see Authentication for where those come from). The URL (https://api-qris-gateway.laboon.id/v1/webhook/payment-statusin v3;https://api-qris-gateway.laboon.biz.id/...in v1/v2 — both are live) is already set — it’s the same for every tenant on this gateway instance. - Enable the macro. It fires on every matching notification and does not need further configuration.
Tested apps
Section titled “Tested apps”| App | Package | Status |
|---|---|---|
| GoPay Merchant | com.gojek.gopaymerchant | Working |
| DANA | — | Working |
| ShopeePay | com.shopeepay.id | Working |
| Merchant BCA | com.bca.msb | Not supported — see Known limitations |
What the macro does
Section titled “What the macro does”- Trigger on a new notification from the target payment app (e.g. GoPay Merchant).
- Parse the amount, timestamp, and payment status out of the notification text.
- Send
POST /v1/webhook/payment-statuswith:X-User-ID: the tenant’s user IDX-Webhook-Secret: the tenant’ssecret_key_liveorsecret_key_sandbox(whichever matches selects the mode — see Authentication)- JSON body matching the inbound contract
The endpoint always responds 200 on a successful call. In v2, if the POST doesn’t return 200
(e.g. network hiccup), the macro retries up to 3 times, 30 seconds apart, and shows a device
notification if every attempt fails. v1 fires the POST once with no retry. See
Webhooks for what happens on the gateway side for each outcome.
Continue to Errors →