PaymentsRecord a payment

Payments

Record a payment

Mark money you received outside the system, by transfer, cash, cheque or a QR payment, so the invoice shows the right balance.

Recording a payment tells Free Invoice Automation that money arrived for an invoice by a route we cannot see: a bank transfer, a local QR payment, cash, a cheque, or anything else. You enter the amount, date and reference, and the invoice balance goes down. It is the "audited human confirmation" in our paid rule: a named person confirms the money arrived, and the record is kept in the audit log.

When to record a payment

SituationDo this
A client paid by bank transfer and sent a proofAccept the proof, which records the payment for you
A client paid by bank transfer, QR code, cash or cheque with no proofRecord the payment yourself
A client paid by card through StripeNothing: Stripe's verified webhook records it automatically
A client paid on Whop (from February 2027)Nothing: Whop's verified webhook records it automatically
A store order was paid in Shopify or WooCommerceNothing: the store connector records it through its verified channel

What a payment record holds

FieldNotes
InvoiceThe document the money is for
AmountInteger minor units in the invoice currency; must be greater than zero
Date receivedWhen the money arrived
ReferenceFor example the bank reference, so you can find it later
ProofOptional: a proof file, or the client's proof if one was submitted
NotesOptional internal notes
Recorded bySet automatically to you; every manual payment has a named person

The payment's source is manual. Its rail is the instruction rail it came through, or manual when it was not through a connected rail.

Record a payment in the app

1

Open the invoice

Open the invoice from Invoices or Payments. Only invoices that are not void can take payments.

2

Record a payment

Choose to record a payment. Enter the amount that actually arrived, the date, and a reference.

3

Attach a proof (optional)

Attach a proof file if you have one, for example a bank statement extract.

4

Save

The balance goes down at once. The invoice moves to partially paid, or to paid when the balance reaches zero. The invoice timeline and the audit log show who recorded it.

Record what really arrived, not what the invoice says. If a client paid 1,000.00 of a 1,200.00 invoice, record 1,000.00. The remaining 200.00 stays open and reminders keep working on it.

Through the API and MCP

ActionRESTMCP toolPermission
Record a paymentPOST /v1/paymentsrecord_paymentpayments.record
Get payment statusGET /v1/documents/{id}/payment-statusget_payment_statuspayments.view
List paymentsGET /v1/paymentsnonepayments.view
Get a paymentGET /v1/payments/{id}nonepayments.view
Delete a paymentDELETE /v1/payments/{id}nonepayments.record

An Idempotency-Key is required when recording a payment with an API key or over MCP, so a retried request never records the same money twice.

curl -X POST "https://api.freeinvoiceautomation.com/v1/payments" \
  -H "Authorization: Bearer $FIA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pay-inv-0042-cash" \
  -d '{
    "document_id": "0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
    "amount_minor": "100000",
    "currency": "USD",
    "received_at": "2027-01-20T00:00:00Z",
    "reference": "Cheque 004512",
    "notes": "Handed over at the client meeting"
  }'
Response (201)
{
  "data": {
    "id": "0193f2c7-2b3c-7d4e-9f50-6a7b8c9d0e1f",
    "document_id": "0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
    "rail": "manual",
    "source": "manual",
    "amount_minor": "100000",
    "currency": "USD",
    "received_at": "2027-01-20T00:00:00Z",
    "reference": "Cheque 004512",
    "status": "succeeded",
    "refunded_amount_minor": "0"
  }
}

From the week of 25 January 2027 the CLI has the same action (freeinvoiceautomation payment record; command names are proposed). When you ask an AI assistant to record a payment, it calls record_payment under your permissions; the record still names you as the person who confirmed it.

A recorded payment sends the payment.recorded webhook event, plus document.paid or document.partially_paid.

Correcting a mistake

Payments are never hard-deleted. If you recorded a payment by mistake (wrong invoice, wrong amount), delete it: this is a soft delete, allowed only for manual records, and it is marked destructive, so the app asks you to confirm and the API needs "confirm": true. The invoice balance goes back up, and the record is kept in the database rather than erased, with the deletion in the audit log.

Payments that came from Stripe, Whop or a store cannot be deleted this way, because they reflect money the provider confirmed. To give that money back, use a refund.

Rules and edge cases

  • Partial payments are recorded as they arrive; several payments can add up to the total.
  • From the week of 25 January 2027, payments on invoices with a payment schedule are allocated to instalments, oldest first.
  • Void invoices cannot take payments. An invoice that already has payments cannot be voided; issue a credit note instead.
  • Currency. A payment is recorded in the invoice's currency.
  • Reminders stop when the invoice is paid (from January 2027). Late fees are worked out on the overdue balance, so recording what arrived keeps them fair.

Permissions

KeyNeeded forDefault roles
payments.recordRecording and deleting manual paymentsOwner, Admin, Editor
payments.viewSeeing payments and payment statusOwner, Admin, Editor, Viewer, Accountant

Errors

CodeWhen
validation_failedThe amount is zero or negative, or a field is missing
document_voidedThe invoice is void
idempotency_key_reusedThe same key was used with a different body
idempotency_in_progressThe same request is still running
confirmation_requiredDeleting a payment without "confirm": true
permission_deniedYour role lacks payments.record