Skip to content
Browse documentation

Recording payments & issuing refunds

Platybooks keeps a running record of every payment against each invoice, so the amount paid, the balance due, and the invoice status always reflect reality. This guide covers logging offline payments, reading the payment ledger, handling partial payments, and issuing refunds.

Recording an offline payment

When a customer pays you outside the app — a bank transfer, cash, a card machine, or anything else — you log it manually so the invoice shows as paid. The Record payment button lives in the invoice editor's toolbar. It only appears on a finalized invoice (one that has a number and isn't voided), and only owners and admins can use it; members can build and send documents but can't record money against them.

When you record a payment, the app adds a line to that invoice's payment ledger and immediately recalculates the amount paid and the status. Once the total paid reaches the invoice total it flips to Paid; if some is paid but not all, it shows Partially paid.

  1. Open the invoice and click Record payment in the top tools bar.
  2. Enter the amount in the invoice's currency. Click Pay full to prefill the full outstanding balance.
  3. Choose a method: Bank transfer, Cash, Card, or Other.
  4. Add an optional note (e.g. a reference number).
  5. Check the Outstanding and Balance after this payment lines, then click Record payment.

Partial payments and the running balance

You don't have to be paid in full at once. Record whatever amount actually arrived and the invoice moves to Partially paid, showing how much is still due. You can record as many payments as it takes; each one chips away at the balance until the invoice is fully settled and marked Paid.

The Record payment dialog helps you stay accurate as you go. It always shows the current Outstanding amount, and once you type an amount it shows the Balance after this payment so you can see what will still be owed. The payments panel on the invoice also has a small progress bar that reads something like "paid X of Y" with the remaining amount due, or "Paid in full" once it's settled.

The payments list on an invoice

Every invoice has a Payments panel that is the full ledger for that document. Each row shows the method (as a badge), the date, and the amount. Refund rows are tinted red and shown as negative amounts so collections and refunds are easy to tell apart at a glance. Below the list, the progress indicator summarizes how much has been paid against the invoice total.

This ledger is the source of truth. The invoice's amount-paid figure and its Paid / Partially paid status are calculated from it, so they update the moment you add a payment or a refund — you never edit those fields directly.

The money rules (no over-paying or over-refunding)

The app enforces a few guardrails so your numbers can never go impossible. These checks run on the server, so they hold even if two people act at the same time.

  • You can't pay more than is owed. If the amount is above the outstanding balance, the dialog warns you and the payment is rejected ("Amount exceeds outstanding balance"). Reduce it to the remaining amount or less.
  • You can't refund more than you collected. A refund can never push the collected total below zero ("Refund exceeds collected amount").
  • Drafts can't take payments — finalize the invoice first. Voided invoices reject payments entirely.
  • Recording a payment automatically cancels any open hosted payment link on that invoice, so a customer can't later pay a now-incorrect amount online.
  • A receipt email is queued to the customer for each non-refund payment (refunds don't trigger a receipt).

Refunds: manual (offline) vs. in-app card refund

There are two ways to record money going back to a customer, depending on how they originally paid.

Manual / offline refund. If you refunded the customer yourself (returned cash, reversed a bank transfer), record it through the same Record payment dialog using a negative amount. The dialog reminds you that a negative value records a refund. This adds a refund row to the ledger and reduces the amount paid, but it doesn't move any actual money — it just keeps your books matching what you already did.

In-app card refund. For payments collected through a real card/payment provider, a Refund button appears next to that charge in the payments list (owner/admin only). Clicking it asks you to confirm, then sends the refund back to the payer through the provider — Stripe-collected refunds settle right away, while Paystack-collected refunds are queued and settle shortly after. You can only refund up to what was charged on that payment, and the same Refund-exceeds-collected guard applies. Note that payments currently run on a built-in test gateway by default, so until a live card provider is connected you'll generally be recording refunds the manual (negative-amount) way.

Frequently asked questions

Why don't I see the Record payment button?

Three things have to be true: the document must be an invoice (not a quote), it must be finalized (have a number) and not voided, and you must be an owner or admin. Members can create and send invoices but can't record payments. If the invoice is still a draft, finalize it first.

How do I record a partial payment?

Just enter the amount you actually received instead of clicking Pay full. The invoice moves to Partially paid and shows the remaining balance. Record additional payments as more money comes in; once the total reaches the invoice amount it becomes Paid.

What's the difference between the Refund button and a negative Record payment?

The Refund button (shown next to a card/online charge) actually sends money back to the customer through the payment provider. A negative amount in Record payment is for refunds you handled yourself offline — it only updates your books, it doesn't move any money. Use the negative-amount path for cash, bank-transfer, or test-gateway refunds.

Why was my payment or refund rejected?

Most likely the number didn't fit the rules: a payment can't exceed the outstanding balance, and a refund can't exceed what's been collected. You also can't take payments on a draft (finalize it first) or on a voided invoice. Adjust the amount and try again.

Ready to put this into practice?

Open your workspace