Konek QR

Resep n8n dan Make: otomatisasi saat tagihan lunas

Sambungkan Konek QR ke n8n atau Make tanpa menulis server.

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:read saja (cukup untuk resep ini). Mulai dengan key uji kq_test_….
  • Webhook → endpoint baru dengan URL dari n8n/Make (langkah di bawah), mode yang sama dengan key-nya, event payment.paid.

n8n

  1. 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".

  2. Tambahkan node IF: {{ $json.body.type }} is equal to payment.paid. Ini menyaring "Kirim event uji" (webhook.test), yang tidak membawa tagihan.

  3. 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 Authorization dan Value Bearer kq_test_…
  4. Tambahkan node IF kedua: {{ $json.payment.status }} is equal to paid. 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
  5. 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:

  1. 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 ?? '' } }];
  2. HTTP Request GET https://api.konekqr.web.id/v1/events dengan Header Auth yang sama (butuh izin events:read) dan Query Parameters after = {{ $json.after }}, types = payment.paid. Di Options → Response, nyalakan Never Error, supaya jawaban 422 sampai ke langkah berikutnya.

  3. 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

  1. 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.
  2. 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 data tagihan juga dikenali.
  3. Modul kedua: HTTP → Make a request, dengan filter sebelum modul ini: type Equal to payment.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
  4. Pasang filter sesudah modul HTTP: payment.status Equal to paid. Webhook palsu dengan id ngawur berhenti di sini (atau sudah gagal di modul HTTP dengan 404).
  5. Tambahkan aksimu (Google Sheets, WhatsApp Business Cloud, email, Notion, …) dengan data dari modul HTTP: payment.referenceId, payment.amount, payment.paidAt, payment.metadata.
  6. 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

  1. Buat API key live dan ganti Bearer kq_test_… di node/modul HTTP.
  2. Buat endpoint webhook live dengan URL yang sama (endpoint uji boleh tetap ada untuk mencoba).
  3. 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].