13 Mei 2025·7 menit membaca

Otomatisasi pencocokan tiga-arah: tabel dan alur kerja untuk penahanan pembayaran AP

Pelajari otomatisasi pencocokan tiga-arah dengan desain tabel praktis dan alur visual yang menahan pembayaran sampai PO, receipt, dan invoice cocok pada jumlah dan harga.

Otomatisasi pencocokan tiga-arah: tabel dan alur kerja untuk penahanan pembayaran AP

Masalah yang sebenarnya diselesaikan pencocokan tiga-arah

Otomatisasi pencocokan tiga-arah sederhana: Anda membayar sebuah invoice hanya ketika itu sesuai dengan apa yang dipesan dan apa yang benar-benar diterima. Tiga dokumen itu adalah purchase order (PO), catatan penerimaan (receipt), dan invoice dari pemasok.

Tanpa pemeriksaan ini, accounts payable bisa saja membayar berdasarkan satu dokumen yang salah atau tidak lengkap. Pemasok mungkin menagih untuk unit lebih banyak daripada yang dikirimkan, memakai harga berbeda dari yang disepakati, atau mengirim invoice duplikat yang terlihat baru dalam rantai email.

Kegagalan ini jarang terlihat dramatis pada hari pertama. Mereka muncul sebagai kebocoran kecil: satu baris ditagih dua kali, pengiriman kurang beberapa unit, kenaikan harga yang tidak disetujui, atau biaya pengiriman ditambahkan padahal seharusnya tidak. Seiring waktu, kesalahan kecil itu berubah menjadi kehilangan uang nyata.

Tujuannya bukan sekadar “menyetujui invoice.” Tujuannya adalah memblokir pembayaran sampai bidang-bidang kunci yang Anda pilih (biasanya kuantitas, harga satuan, dan total) sejajar di seluruh PO, receipt, dan invoice. Ketika tidak cocok, invoice tidak boleh tenggelam di email. Invoice harus masuk ke antrian pengecualian dengan kode alasan yang jelas dan bidang-bidang yang berbeda tercatat secara tepat.

Pencocokan tiga-arah juga menggambar batas yang jelas antar tim. Procurement bertanggung jawab atas apa yang dipesan (syarat dan harga). Receiving memastikan apa yang tiba (kuantitas dan tanggal). Finance mengontrol apa yang dibayarkan (review dan pelepasan invoice).

Tetapkan ekspektasi sejak awal: ini masalah proses plus data, bukan tombol persetujuan saja. Jika baris PO samar, receipt tidak dicatat, atau invoice tidak bisa dihubungkan ke baris PO, otomatisasi tidak akan menyelamatkan Anda.

Dokumen dan peran: PO, receipt, invoice, dan siapa yang bertanggung jawab

Pencocokan tiga-arah bekerja hanya ketika setiap dokumen memiliki pemilik yang jelas. Jika “siapa meng-update apa” samar, sistem akan memblokir pembayaran yang seharusnya atau membiarkan pembayaran yang salah lewat.

Model kepemilikan praktis adalah:

  • Pemohon membuat permintaan pembelian dan mengonfirmasi kebutuhan.
  • Procurement membuat dan memelihara PO (pemasok, harga, syarat).
  • Gudang/penerima (atau pemilik layanan) memposting receipt atau penerimaan.
  • AP/Finance mencatat invoice dan mengontrol pembayaran.

Setiap dokumen juga membutuhkan set minimum bidang agar pencocokan bukan tebakan.

PO (purchase order) membutuhkan supplier ID, nomor PO, baris item (SKU atau layanan), kuantitas yang dipesan, harga satuan, mata uang, aturan pajak, dan syarat pembayaran.

Receipt membutuhkan referensi PO, tanggal penerimaan, kuantitas yang diterima per baris PO, dan siapa yang menerimanya. Untuk layanan, perlakukan sebagai acceptance dan catat persetujuannya.

Invoice membutuhkan nomor invoice pemasok, tanggal invoice, referensi PO (atau cara yang aman untuk menemukan PO), detail baris (qty, harga satuan), pajak/ongkos kirim, dan total.

Juga tentukan kapan pencocokan dijalankan. Ini tidak seharusnya hanya sekali. Picu ketika realitas berubah:

  1. Ketika sebuah invoice ditangkap (sehingga Anda memutuskan bayar vs tahan segera).
  2. Ketika sebuah receipt diposting (sehingga invoice yang ditahan bisa menjadi layak dibayar).
  3. Ketika sebuah PO diubah (sehingga invoice terbuka diperiksa ulang).

Partial receipt dan banyak invoice itu normal. Satu baris PO mungkin tiba dalam tiga pengiriman dan ditagih lewat dua invoice. Logika Anda harus membandingkan kumulatif yang diterima vs kumulatif yang ditagih per baris PO, bukan hanya satu dokumen per waktu.

Aturan yang harus diputuskan sebelum Anda membangun apa pun

Sebelum menyentuh tabel atau langkah alur kerja, sepakati aturan yang akan menggerakkan seluruh sistem. Aturan samar menghasilkan kegagalan yang dapat diprediksi: sistem memblokir terlalu banyak (orang-orang melewatinya), atau memblokir terlalu sedikit (invoice buruk tetap dibayar).

Pilih level pencocokan. Pencocokan header-only memeriksa total pada tingkat dokumen. Kedengarannya lebih mudah, tetapi cepat rusak dengan pengiriman parsial, backorder, baris freight, atau tarif pajak campuran. Pencocokan per baris butuh waktu untuk disiapkan, tetapi lebih aman sebagai default karena Anda membandingkan hal yang sama di PO, receipt, dan invoice: baris spesifik, kuantitasnya, dan harga satuan.

Definisikan hard block vs peringatan. Hard block berarti pembayaran tidak bisa dilanjutkan sampai masalah diselesaikan. Peringatan berarti invoice bisa maju, tetapi seseorang harus mengakui risikonya.

Titik awal yang umum:

  • Hard block: kuantitas yang ditagih melebihi kuantitas yang diterima (untuk barang).
  • Hard block: harga satuan melebihi harga PO melewati toleransi.
  • Peringatan: selisih pembulatan kecil.
  • Peringatan: perbedaan pajak atau ongkos kirim yang memang diharapkan dan dikodekan terpisah.

Buat aturan toleransi eksplisit. Definisikan metode (persen, jumlah absolut, atau yang lebih besar di antara keduanya) dan siapa yang mengelolanya. Contoh: izinkan +/- 1% atau +/- $5 per baris, dengan finance hanya dapat mengubah toleransi dengan catatan audit.

Gunakan set status kecil dan bersama. Hindari status kustom per tim. Set yang bersih biasanya cukup: Matched, Hold, Exception, Approved. “Hold” berarti pembayaran diblokir. “Exception” berarti manusia perlu meninjaunya. “Approved” berarti orang bernama menerima mismatch dan mencatat alasannya.

Model data: tabel yang Anda butuhkan (dan mengapa)

Otomatisasi pencocokan tiga-arah bekerja hanya jika model data Anda bisa menyelaraskan baris PO, apa yang diterima, dan apa yang ditagihkan. Setiap baris invoice harus bisa dicocokkan ke baris PO tertentu (atau jelas ditandai non-PO), dan setiap baris receipt harus mengurangi kuantitas yang tersisa pada baris PO itu.

Mulai dengan tabel inti pembelian:

  • Vendors: satu baris per pemasok (nama, syarat, info pajak).
  • ItemsServices: opsional, tetapi membantu konsistensi (SKU, deskripsi, satuan ukuran).
  • PurchaseOrders: header PO (vendor_id, currency, requested_by, status).
  • PO_Lines: jangkar pencocokan (po_id, item_id/deskripsi, ordered_qty, unit_price).

Receiving membutuhkan catatan sendiri, meskipun “receipt” hanya konfirmasi. Pisahkan receipt dari invoice agar Anda bisa membuktikan apa yang tiba dan kapan:

  • Receipts: header receipt (vendor_id, received_date, lokasi, status).
  • Receipt_Lines: setiap baris mereferensikan baris PO (receipt_id, po_line_id, received_qty, catatan).

Invoicing mencerminkan receiving. Simpan apa yang ditagihkan pemasok pada level baris dan hubungkan ke baris PO yang mencakupnya:

  • Invoices: header invoice (vendor_id, invoice_number, invoice_date, due_date, status).
  • Invoice_Lines: (invoice_id, po_line_id bila berlaku, invoiced_qty, unit_price, tax, line_total).

Akhirnya, buat catatan yang menghadap pembayaran yang bisa diblokir oleh alur kerja Anda. Beberapa tim menyebutnya bill, payment request, atau pay run item:

  • PaymentRequests (atau Bills): mengikat ke invoice_id dan mencakup payment_hold (true/false) serta hold_reason.

Untuk audit dan penanganan pengecualian yang rapi, tambahkan field lifecycle konsisten pada header (POs, receipts, invoices, payments): status, created_at/created_by, approved_at/approved_by, posted_at, dan (opsional) source_document_id untuk impor.

Field kunci dan relasi yang membuat pencocokan andal

Beritahu tim saat masalah muncul
Kirim pemberitahuan email atau Telegram saat invoice masuk Hold atau membutuhkan receipt.
Atur Pemberitahuan

Pencocokan bekerja terbaik ketika setiap dokumen menelusuri kembali ke baris item yang sama. Itu berarti ID yang stabil, link yang bersih, dan total yang bisa dihitung ulang dari baris.

Pastikan setiap tabel punya ID internal yang stabil dan nomor eksternal yang dicari orang:

  • Header PO: po_id, po_number, vendor_id, currency, status, po_date
  • Baris PO: po_line_id, po_id, item_id atau deskripsi, ordered_qty, unit_price, tax_rate, line_total
  • Receipts: receipt_id, receipt_number, vendor_id, received_date; receipt_line_id, receipt_id, po_line_id, received_qty
  • Invoices: invoice_id, vendor_id, vendor_invoice_number, invoice_date, currency, subtotal, tax_total, total; invoice_line_id, invoice_id, po_line_id, qty, unit_price, tax_amount, line_total
  • Vendors dan items: vendor_id, payment_terms, default_currency; item_id, uom, tax_code

Relasi terpenting adalah level baris:

  • invoice_line.po_line_id harus menunjuk ke baris PO.
  • receipt_line.po_line_id harus menunjuk ke baris PO yang sama.

Inilah yang memungkinkan Anda membandingkan kuantitas dan harga tanpa menebak.

Untuk menangani partial, hitung total berjalan per baris PO: received_qty (jumlah dari receipt lines) dan invoiced_qty (jumlah dari invoice lines). Lalu hitung remaining_qty = ordered_qty - received_qty dan open_to_invoice_qty = received_qty - invoiced_qty. Nilai-nilai ini membuat jelas apakah sebuah invoice terlalu dini, terlambat, atau menagih berlebih.

Jangan timpa sejarah ketika PO berubah. Simpan nomor revisi PO dan baik pertahankan baris PO lama (dengan flag aktif) atau tulis change log (siapa mengubah apa, kapan, nilai lama, nilai baru).

Tambahkan penjaga dasar untuk mencegah duplikat dan join yang salah:

  • Unique (vendor_id, vendor_invoice_number)
  • Unique receipt_number dan po_number
  • Not null pada currency, quantities, dan unit_price
  • Check constraints seperti qty >= 0 dan unit_price >= 0
  • Foreign keys dari invoice_line dan receipt_line ke po_line

Langkah demi langkah alur kerja: dari penerimaan invoice sampai penahanan pembayaran

Otomatisasi pencocokan tiga-arah biasanya punya tiga titik masuk: invoice tiba (email, upload, EDI), receipt diposting, atau PO diubah (harga, kuantitas, status). Alur kerja harus merespons semua ini sehingga invoice bisa keluar dari hold segera setelah bagian yang hilang muncul.

1) Validasi dasar invoice terlebih dulu. Konfirmasi pemasok aktif, PO ada, mata uang cocok dengan PO, dan total konsisten secara internal (total baris menjumlah, pajak wajar, tidak ada kuantitas negatif kecuali Anda mendukung kredit). Jika ini gagal, kirim invoice langsung ke Hold dengan alasan yang jelas.

2) Cocokkan per baris, bukan hanya di header. Untuk setiap baris invoice, temukan baris PO terkait dan total receipt sampai saat ini. Bandingkan:

  • Kuantitas yang ditagih vs kuantitas yang diterima (atau diterima dikurangi yang sudah ditagih)
  • Harga satuan yang ditagih vs harga satuan di PO
  • Aturan toleransi
  • Apakah baris PO masih terbuka untuk penagihan

3) Tetapkan status dan terapkan pemblokiran. Pola umum:

  • Matched: semua baris lulus pengecekan, tidak ada pengecualian terbuka.
  • Hold: setidaknya satu baris gagal, atau data yang dibutuhkan hilang.

Saat Hold diatur, buat catatan payment hold yang harus dihormati oleh run pembayaran. Simpan hold terpisah dari invoice sehingga hold bisa ditambah, dilepaskan, atau diganti tanpa menulis ulang riwayat invoice.

4) Catat kode alasan yang bisa dipercaya oleh finance. Hindari hold hanya berupa teks bebas. Gunakan kode seperti PRICE_OVER_TOLERANCE, QTY_NOT_RECEIVED, PO_CLOSED, VENDOR_MISMATCH, atau CURRENCY_MISMATCH, plus catatan singkat.

Desain antrian pengecualian untuk finance (apa yang disimpan dan apa yang ditampilkan)

Tangani receipt parsial dengan rapi
Lacak kumulatif diterima vs ditagih per baris PO sehingga partial ditangani benar.
Buat Alur Kerja

Antrian pengecualian adalah tempat pencocokan menjadi berguna, bukan hanya ketat. Finance harus hanya melihat invoice yang membutuhkan keputusan, dengan konteks cukup untuk memutuskan cepat dan meninggalkan jejak audit yang rapi.

Pendekatan umum adalah tabel khusus seperti ExceptionCases. Setiap baris mewakili satu invoice (atau baris invoice) yang diblokir dan menunjuk kembali ke record invoice, PO, dan receipt. Biarkan mesin pencocokan bersifat read-only di sini. Antrian untuk keputusan dan dokumentasi.

Apa yang disimpan di ExceptionCases

Simpan apa yang salah, seberapa besar, siapa pemiliknya, dan apa langkah selanjutnya:

  • Type (missing receipt, price variance, quantity variance, PO not found, duplicate invoice)
  • Severity (info, warning, block) plus alasan yang ramah pengguna
  • Owner (orang atau tim) dan status (open, waiting on vendor, waiting on warehouse, resolved, overridden)
  • Snapshot varians sebagai angka yang bisa diurutkan (invoice amount, matched amount, price delta, quantity delta)
  • Field SLA (due date, escalation flag, reassigned_at, reassignment_reason)

Juga simpan data kolaborasi dan audit: komentar (author, timestamp) dan metadata lampiran (file name, type, uploaded_by, uploaded_at). Meskipun file disimpan di tempat lain, metadata milik case agar riwayat tetap utuh.

Apa yang harus dilihat dan dilakukan finance

Tampilan antrian harus berupa worklist yang ketat: vendor, nomor invoice, tipe pengecualian, severity, jumlah, due date, owner, dan pesan "mengapa diblokir" yang jelas.

Membuka case harus menampilkan ringkasan berdampingan: baris PO, kuantitas yang diterima, baris invoice, dan bidang tepat yang gagal.

Batasi aksi agar aman dan sederhana:

  • Request receipt (dirutekan ke receiving, set status menjadi waiting)
  • Request credit memo (dirutekan ke vendor, catat penyesuaian yang diharapkan)
  • Approve override (membutuhkan alasan, menangkap approver dan timestamp)
  • Reassign (memperbarui owner, menyimpan riwayat reassignment)
  • Close as resolved (hanya setelah perubahan membuat pencocokan lolos)

Contoh: sebuah invoice diblokir karena 8 unit diterima tapi 10 ditagih. Finance bisa meminta invoice koreksi, atau menyetujui override untuk 8 unit yang diterima dan menahan 2 unit sisanya.

Contoh realistis: receipt parsial dan invoice yang tidak cocok

Prototype pencocokan tiga-arah di AppMaster
Bangun aplikasi pencocokan AP siap produksi tanpa menulis kode.
Coba AppMaster

Seorang buyer membuat PO untuk 100 unit item A dengan harga $10.00 tiap unit. Total PO $1.000. Dua hari kemudian, gudang memposting receipt untuk 80 unit.

Kemudian sebuah invoice datang untuk 100 unit dengan harga $10.00 tiap unit. Pencocokan harus membandingkan baris invoice dengan apa yang telah diterima, bukan hanya apa yang dipesan.

Pada baris itu:

  • Dipesan: 100 unit
  • Diterima: 80 unit
  • Ditagih: 100 unit
  • Kuantitas yang cocok: min(Diterima, Ditagih) = 80 unit
  • Kuantitas tidak cocok: Ditagih - Cocok = 20 unit

Invoice menjadi “On hold” karena 20 unit tidak ada receipt. Finance melihat case dengan alasan yang jelas (Quantity variance: +20) dan angka kunci berdampingan.

Notifikasi harus dikirim ke siapa pun yang dapat memperbaiki paling cepat: biasanya penerima (untuk konfirmasi apakah receipt hilang) dan buyer (untuk menindaklanjuti jika pengiriman memang kurang).

Ketika sisa 20 unit tiba, gudang memposting receipt kedua untuk 20 unit. Sistem menjalankan pencocokan ulang: received menjadi 100, unmatched menjadi 0, invoice pindah ke Matched, dan hold dilepaskan.

Tambahkan varians harga. Jika pemasok menagih 100 unit dengan harga $10.50 bukan $10.00, kuantitas cocok tetapi harga tidak. Hasil yang diharapkan: pertahankan invoice pada hold dan rute dengan alasan seperti “Price variance: +$0.50/unit (+$50 total).”

Kesalahan umum yang merusak alur kerja pencocokan tiga-arah

Sebagian besar kegagalan pencocokan bukan soal hitungan. Mereka datang dari link data yang lemah dan kontrol longgar pada dokumen yang diposting.

Hanya mencocokkan pada total invoice. Header bisa tampak baik sementara satu baris terlalu mahal atau kurang. Lakukan pencocokan per baris, dan jelaskan apa yang boleh berbeda (seringkali freight) dan apa yang tidak boleh (kuantitas diterima dan harga satuan).

Mengasumsikan satu receipt dan satu invoice per PO. Pembelian nyata termasuk pengiriman terpecah dan penagihan parsial. Dukung banyak receipt dan banyak invoice terhadap baris PO yang sama, dan lacak sisa kuantitas terbuka per baris.

Mengizinkan edit pada receipt atau invoice yang sudah diposting tanpa jejak. Jika seseorang bisa diam-diam mengubah kuantitas kemudian, pencocokan berhenti menjadi bukti. Kunci record yang diposting dan koreksi lewat dokumen penyesuaian yang mempertahankan sejarah.

Ketiadaan pencegahan duplikat. Nomor invoice pemasok yang sama bisa dimasukkan dua kali, atau PDF diunggah lagi oleh orang lain. Tambahkan keunikan sejak awal (vendor + invoice number, dan opsional tanggal/jumlah) dan tampilkan pesan jelas saat duplikat terdeteksi.

Alasan pengecualian yang samar. Finance tidak perlu menebak. Gunakan kode alasan yang merutekan bersih: price mismatch, quantity mismatch, missing receipt, duplicate suspected, PO not found, vendor mismatch.

Daftar periksa cepat sebelum Anda mengaktifkan pemblokiran pembayaran

Rancang model data secara visual
Gunakan AppMaster Data Designer untuk menghubungkan baris PO, receipt, dan invoice secara andal.
Coba Data Designer

Pemblokiran pembayaran adalah saat pencocokan berhenti menjadi laporan dan menjadi kontrol. Jika dasar-dasarnya belum kuat, Anda akan menciptakan kebisingan untuk finance dan keterlambatan pembayaran untuk vendor.

Uji sekumpulan kecil invoice yang berbeda: match bersih, receipt parsial, perubahan harga, dan perbedaan pajak. Jika ada yang tidak bisa dicocokkan dengan rapi, perbaiki data dan aturan dulu.

Daftar periksa:

  • Kelengkapan referensi: setiap invoice punya vendor dan referensi PO, dan setiap baris invoice bisa memetakan ke baris PO spesifik (bukan hanya “total PO”). Putuskan apa yang terjadi saat vendor hanya mengirim nomor header PO.
  • Matematika konsisten: kuantitas, harga satuan, dan total dapat dihitung ulang dengan cara yang sama tiap kali. Jelaskan pajak, freight, diskon, dan pembulatan (misalnya pembulatan per baris vs hanya di total invoice).
  • Status memblokir lebih awal: set “on hold” sebelum permintaan pembayaran atau record payout dibuat.
  • Pengecualian terstruktur: setiap hold menyimpan kode alasan dan owner (AP, buyer, receiver). Tambahkan due date agar hold tidak menggantung selamanya.
  • Jejak audit nyata: override mencatat siapa menyetujui, kapan, dan apa yang mereka setujui (termasuk nilai asli). Jika Anda mengizinkan edit, log nilai sebelum dan sesudah.

Langkah selanjutnya: pilotkan proses dan bangun secara visual

Perlakukan otomatisasi pencocokan tiga-arah layaknya kontrol: buktikan bekerja pada sebagian kecil pengeluaran, lalu gulirkan.

Mulai dengan pilot yang mudah dimonitor. Pilih satu unit bisnis, kelompok vendor kecil yang mengirim invoice bersih, atau satu kategori item. Jaga aturan ketat pada awalnya (cocok persis jumlah dan harga) sehingga masalah kualitas data muncul cepat.

Ukur keberhasilan dengan tampilan finance yang sederhana: hold per minggu, kode alasan teratas, waktu dari hold ke pelepasan, berapa banyak hold yang benar-benar mismatch, dan vendor yang sering membuat pengecualian.

Jika ingin prototipe cepat, platform tanpa kode bisa membantu karena Anda dapat memodelkan tabel, aturan pencocokan, dan routing tanpa menulis kode. Misalnya, di AppMaster (appmaster.io) Anda bisa membangun tabel PO, receipt, invoice, dan exception, lalu menghubungkan logika hold dalam proses bisnis visual sehingga aturan yang sama dijalankan pada setiap pemicu.

Uji dengan invoice nyata dari grup pilot, termasuk receipt parsial dan kesalahan umum vendor. Harapkan untuk menyetel kunci pencocokan dan menambahkan toleransi kecil hanya setelah melihat pola. Setelah hold terlihat wajar dan waktu penyelesaian membaik, perluas cakupan dan tambahkan aturan lebih kaya (penanganan pajak dan freight, konversi satuan, pengiriman terpecah) tanpa mengorbankan kontrol inti: tidak ada pelepasan pembayaran sampai pencocokan dibersihkan.

Mudah untuk memulai
Ciptakan sesuatu yang menakjubkan

Eksperimen dengan AppMaster dengan paket gratis.
Saat Anda siap, Anda dapat memilih langganan yang tepat.

Memulai
Otomatisasi pencocokan tiga-arah: tabel dan alur kerja untuk penahanan pembayaran AP | AppMaster