Panduan lengkap otomatisasi pembuatan tagihan QRIS dan update status pembayaran LUNAS langsung di baris Google Sheets secara otomatis.
Sangat mudah! Di Google Apps Script, alurnya adalah membuat tagihan via API, lalu memberikan Link Pembayaran resmi (public_payment_url) kepada pelanggan.
Data pelanggan dimasukkan ke Google Sheet (bisa dari Google Form atau input manual).
Script menjalankan UrlFetchApp.fetch() ke API Zy-Pay dan memperoleh public_payment_url.
Link pembayaran otomatis tertulis di Google Sheet dan bisa otomatis terkirim via WhatsApp / Email.
Saat QRIS discan dan terbayar, Zy-Pay menembak Webhook ke Web App Apps Script, dan status baris Sheet otomatis jadi LUNAS.
Buka Google Sheets baru, dan buat judul kolom pada baris pertama (Baris 1):
| Kolom | Nama Kolom | Keterangan | Contoh Nilai |
|---|---|---|---|
| A | ID Pesanan |
Nomor referensi atau order | ORD-1001 |
| B | Nama Pelanggan |
Nama pembeli | Budi Santoso |
| C | WhatsApp / Email |
Kontak pelanggan | 081234567890 |
| D | Nominal Tagihan |
Jumlah yang harus dibayar | 25000 |
| E | Status Pembayaran |
Diisi otomatis oleh Webhook | LUNAS / PENDING |
| F | Link Pembayaran QRIS |
Diisi otomatis oleh Script | https://cutiezy.id/zy-pay/pay.php?id=... |
| G | ID Transaksi Zy-Pay |
ID referensi sistem untuk audit | QRIS20260915123456ABCDEF |
Buka menu Ekstensi → Apps Script pada Google Sheets Anda, hapus kode lama, lalu paste script berikut:
// KONFIGURASI ZY-PAY
const ZYPAY_CONFIG = {
apiKey: "ak_your_api_key_di_dashboard_zypay", // Ambil dari menu API Keys QRIS
createPaymentUrl: "https://cutiezy.id/zy-pay/api/v1/create-payment",
expiryMinutes: 30, // masa berlaku pembayaran (menit)
webhookUrl: "https://script.google.com/macros/s/AKfycb.../exec" // URL Web App Anda (diisi setelah Deploy)
};
/**
* Fungsi utama membuat tagihan QRIS ke Zy-Pay
*/
function createZyPayInvoice(amount, description) {
const payload = {
amount: parseInt(amount, 10),
description: description,
expiry_minutes: ZYPAY_CONFIG.expiryMinutes,
webhook_url: ZYPAY_CONFIG.webhookUrl
};
const options = {
method: "post",
contentType: "application/json",
headers: {
"X-API-Key": ZYPAY_CONFIG.apiKey
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(ZYPAY_CONFIG.createPaymentUrl, options);
const result = JSON.parse(response.getContentText());
if (result.success && result.data) {
return {
success: true,
transactionId: result.data.transaction_id,
paymentUrl: result.data.public_payment_url,
totalAmount: result.data.total_amount,
expiredAt: result.data.expired_at
};
} else {
return {
success: false,
error: result.error || "Gagal membuat tagihan."
};
}
} catch (err) {
return {
success: false,
error: err.toString()
};
}
}
Agar saat pembeli scan QRIS, baris di Google Sheets Anda otomatis berubah jadi "LUNAS", kita pasang fungsi doPost(e) di Apps Script.
/**
* Webhook Receiver: Ditembak oleh Zy-Pay saat QRIS dibayar
*/
function doPost(e) {
try {
const rawData = e.postData.contents;
const data = JSON.parse(rawData);
const trxId = data.transaction_id;
const status = (data.status || "").toLowerCase();
if (trxId && status === "paid") {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
// Cari baris yang memiliki ID Transaksi cocok di Kolom G
for (let r = 2; r <= lastRow; r++) {
const rowTrxId = sheet.getRange(r, 7).getValue().toString().trim();
if (rowTrxId === trxId) {
// Update Status jadi LUNAS di Kolom E
const statusCell = sheet.getRange(r, 5);
statusCell.setValue("LUNAS");
statusCell.setBackground("#dcfce7"); // Warna hijau muda
statusCell.setFontColor("#166534");
// Kirim notifikasi email/WA konfirmasi pembayaran lunas
const nama = sheet.getRange(r, 2).getValue();
const kontak = sheet.getRange(r, 3).getValue();
Logger.log(`Pesanan untuk ${nama} telah LUNAS!`);
break;
}
}
}
return ContentService.createTextOutput(JSON.stringify({ status: "success" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
Zy-Pay QRIS Webhook.webhookUrl di konfigurasi script Anda.Anda dapat menambahkan fungsi pengiriman otomatis ke pembeli begitu link pembayaran terbentuk:
/**
* Mengirim link tagihan ke email pembeli
*/
function kirimEmailTagihan(email, nama, totalBayar, linkBayar) {
const subject = `Tagihan Pembayaran QRIS - ${nama}`;
const htmlBody = `
<div style="font-family: Arial, sans-serif; padding: 20px; color: #333;">
<h2 style="color: #21759b;">Halo, ${nama}!</h2>
<p>Terima kasih atas pesanan Anda. Total tagihan Anda adalah:</p>
<h3 style="color: #107c41;">Rp ${parseInt(totalBayar, 10).toLocaleString('id-ID')}</h3>
<p>Silakan klik tombol di bawah untuk membayar melalui QRIS (BCA, Mandiri, GoPay, OVO, ShopeePay, DANA):</p>
<p>
<a href="${linkBayar}" style="background: #2563eb; color: #fff; padding: 12px 24px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Bayar Sekarang via QRIS →
</a>
</p>
<p style="font-size: 12px; color: #777;">Link ini memiliki batas waktu pembayaran. Harap segera diselesaikan.</p>
</div>
`;
MailApp.sendEmail({
to: email,
subject: subject,
htmlBody: htmlBody
});
}