Contoh: setiap tagihan lunas, tambahkan baris ke Google Sheets, kirim pesan ke tim, atau ubah status pesanan di tokomu. Tanpa menulis server sendiri.
Resep ini memakai pola webhook + cek ulang ke API: webhook Konek QR hanya dipakai sebagai pemicu, lalu skenario mengambil tagihan langsung dari API Konek QR dengan API key-mu dan hanya lanjut kalau statusnya benar paid. Webhook palsu tidak bisa memalsukan jawaban API, jadi kamu tidak perlu menghitung tanda tangan HMAC di alat no-code. (Kalau mau tetap memverifikasi tanda tangan, lihat Verifikasi webhook.)
Yang disiapkan di dashboard Konek QR:
- API → API key dengan izin
payments:readsaja (cukup untuk resep ini). Mulai dengan key ujikq_test_…. - Webhook → endpoint baru dengan URL dari n8n/Make (langkah di bawah), mode yang sama dengan key-nya, event
payment.paid.
n8n
Buat workflow baru, tambahkan node Webhook:
- HTTP Method:
POST - Path: misalnya
konekqr - Respond:
Immediately(Konek QR butuh jawaban 2xx dalam 15 detik)
Salin Production URL-nya (berawalan
https://) ke endpoint webhook di dashboard Konek QR, lalu aktifkan workflow. Test URL hanya hidup saat kamu menekan "Listen for test event".- HTTP Method:
Tambahkan node IF:
{{ $json.body.type }}is equal topayment.paid. Ini menyaring "Kirim event uji" (webhook.test), yang tidak membawa tagihan.Di cabang true, tambahkan node HTTP Request:
- Method:
GET - URL:
https://api.konekqr.web.id/v1/payments/{{ $json.body.data.id }} - Authentication: Generic Credential Type → Header Auth, dengan Name
Authorizationdan ValueBearer kq_test_…
- Method:
Tambahkan node IF kedua:
{{ $json.payment.status }}is equal topaid. Di cabang true, sambungkan aksimu. Data yang berguna:{{ $json.payment.referenceId }}: id pesananmu{{ $json.payment.amount }}: total yang dibayar (termasuk kode unik){{ $json.payment.baseAmount }}: harga sebelum kode unik{{ $json.payment.paidAt }},{{ $json.payment.paidVia }},{{ $json.payment.paidLate }}{{ $json.payment.metadata }}: objek yang kamu kirim saat membuat tagihan
Uji: di dashboard Konek QR buat tagihan uji, lalu Simulasikan lunas. Eksekusinya muncul di tab Executions n8n.
Webhook bisa terkirim lebih dari sekali (misalnya setelah jaringan putus). Buat aksimu aman diulang: misalnya di Google Sheets pakai Append or Update Row dengan kolom kunci referenceId, bukan Append.
Tanpa URL publik: tarik event setiap menit
Untuk n8n di jaringan lokal, ganti Webhook dengan Schedule Trigger (setiap 1 menit) dan baca GET /v1/events:
Code (JavaScript) untuk menyiapkan cursor:
JavaScript const state = $getWorkflowStaticData('global'); state.since ??= new Date().toISOString(); // event sebelum workflow aktif tidak diproses return [{ json: { after: state.cursor ?? '' } }];HTTP Request
GET https://api.konekqr.web.id/v1/eventsdengan Header Auth yang sama (butuh izinevents:read) dan Query Parametersafter={{ $json.after }},types=payment.paid. Di Options → Response, nyalakan Never Error, supaya jawaban422sampai ke langkah berikutnya.Code untuk menyimpan cursor dan memecah event menjadi item:
JavaScript const state = $getWorkflowStaticData('global'); const res = $input.first().json; if (res.errors?.some((e) => e.field === 'after')) { delete state.cursor; // cursor lebih tua dari 30 hari: mulai lagi dari event tertua yang masih disimpan return []; } if (!res.events) throw new Error(res.detail ?? 'Konek QR: permintaan event gagal'); if (res.next) state.cursor = res.next; return res.events.filter((e) => e.createdAt >= state.since).map((e) => ({ json: e.data }));
Static data hanya tersimpan pada eksekusi workflow yang aktif, bukan saat dijalankan manual dari editor. next tetap maju walaupun tidak ada payment.paid baru, dan event disimpan 30 hari, jadi workflow yang sempat mati tinggal melanjutkan dari cursor terakhir. Kalau mati lebih dari 30 hari, cursor-nya ditolak (422, field after) dan langkah 3 memulainya lagi.
Make
- Buat skenario baru. Modul pertama: Webhooks → Custom webhook → Add → beri nama → salin URL-nya (
https://hook.….make.com/…) ke endpoint webhook di dashboard Konek QR. - Tekan Redetermine data structure, lalu di dashboard Konek QR tekan Kirim event uji pada endpoint itu supaya Make mengenali bentuk datanya. Setelah itu simulasikan satu tagihan uji supaya struktur
datatagihan juga dikenali. - Modul kedua: HTTP → Make a request, dengan filter sebelum modul ini:
typeEqual topayment.paid(menyaring event uji, yang tidak membawa tagihan). Isi modulnya:- URL:
https://api.konekqr.web.id/v1/payments/{{1.data.id}} - Method:
GET - Headers:
Authorization=Bearer kq_test_… - Parse response:
Yes
- URL:
- Pasang filter sesudah modul HTTP:
payment.statusEqual topaid. Webhook palsu dengan id ngawur berhenti di sini (atau sudah gagal di modul HTTP dengan404). - Tambahkan aksimu (Google Sheets, WhatsApp Business Cloud, email, Notion, …) dengan data dari modul HTTP:
payment.referenceId,payment.amount,payment.paidAt,payment.metadata. - Aktifkan skenario (Scheduling: Immediately as data arrives).
Custom webhook Make menjawab 200 Accepted begitu data diterima, jadi batas 15 detik aman walaupun skenarionya lama.
Pindah ke live
- Buat API key live dan ganti
Bearer kq_test_…di node/modul HTTP. - Buat endpoint webhook live dengan URL yang sama (endpoint uji boleh tetap ada untuk mencoba).
- Buat satu tagihan live kecil dan bayar sungguhan untuk memastikan semuanya tersambung.
Kalau webhook gagal
Buka log pengiriman endpoint di Dashboard → Webhook. Dokter Webhook menjelaskan penyebabnya, misalnya not_found (workflow n8n belum aktif atau memakai Test URL), auth_required (Webhook node memakai autentikasi), atau cloudflare_challenge (n8n self-hosted di balik Cloudflare). Setelah diperbaiki, tekan Kirim ulang.
Ada yang kurang jelas atau salah? Kirim ke [email protected].