Solavel Solavel Docs

Retainers

docs/solavel-finance/retainers.md

Who can use this: Owner, Manager, Accountant. URL / Route: /finance/ar/retainers (finance.ar.retainers.index). Detail: finance.ar.retainers.show, create, store. Action endpoints: finance.ar.retainers.allocate, allocations.reverse, refund, void. Plan / feature gate: feature:finance.retainers (default: enabled on standard plans). Permissions: sales.invoices.view, sales.invoices.create, sales.invoices.unpost.

Purpose

A Retainer records money received from a customer in advance, before any invoice has been issued. Use it for:

  • a deposit at the start of a project,
  • a prepayment on a future service or order,
  • a security advance you'll later apply against the customer's invoices.

The retainer sits as a liability on the books — it's the customer's money until you earn it by issuing an invoice and allocating the retainer against it.

Compared with a Credit note: a credit note is issued by you (reduces a receivable). A retainer is received from the customer (creates a liability). Both can end up offsetting future invoices.

Step by step

Browse retainers

Open /finance/ar/retainers. Each row shows the retainer number, date, customer, amount received, amount allocated, unallocated balance, and status.

Create a retainer

Route: finance.ar.retainers.create / store. Permission: sales.invoices.create.

  1. Click New retainer.
  2. Pick the Customer.
  3. Set the Date.
  4. Pick the Deposit account (Cash / Bank).
  5. Enter the Amount and a Reference / Method.
  6. Save.

Posting writes the GL journal:

  • Debit the Cash / Bank account.
  • Credit the Customer Deposits / Retainer Liability account.

Allocate a retainer to an invoice

Route: finance.ar.retainers.allocate. Permission: sales.invoices.create.

From a retainer with an unallocated balance, click Allocate to invoices. Tick one or more open invoices for that customer and enter the amount to apply to each — the total cannot exceed the retainer's unallocated balance.

Allocating writes a journal:

  • Debit the Customer Deposits / Retainer Liability account.
  • Credit the AR control account (reducing the invoice's open balance).

Reverse an allocation

Route: finance.ar.retainers.allocations.reverse. Permission: sales.invoices.create.

Removes a specific allocation, freeing the retainer to be allocated elsewhere or refunded.

Refund a retainer

Route: finance.ar.retainers.refund. Permission: sales.invoices.create.

If the project is cancelled or the customer asks for the deposit back, refund the unallocated balance. This creates a Refund receipt linked to the retainer — money out of Cash / Bank, the retainer liability is cleared.

Void a retainer

Route: finance.ar.retainers.void. Permission: sales.invoices.unpost.

Reverses the retainer's GL journal, removes any allocations, and marks the retainer Void. The document number stays for the audit trail.

How the journal looks

A JOD 500 retainer received from a customer for an upcoming project:

Account Debit Credit
Bank 500.00
Customer Deposits (liability) 500.00

No revenue is recognised yet — the money is a liability until you earn it.

Allocating JOD 300 of the retainer against a JOD 300 invoice for milestone 1:

Account Debit Credit
Customer Deposits (liability) 300.00
AR — Customer control 300.00

The retainer's unallocated balance drops to JOD 200; the invoice flips to Paid.

Refunding the remaining JOD 200 unallocated balance because the project was cancelled (this creates a linked Refund receipt):

Account Debit Credit
Customer Deposits (liability) 200.00
Bank 200.00

The retainer's unallocated balance becomes zero and the deposit liability is fully cleared.

When to use which customer-advance pattern

Situation Use this
Customer pays before any service is delivered or invoice exists Retainer (this page)
You've issued an invoice already and want a deposit line on it Deposit line on the invoice
You over-billed and want to reduce AR without cash moving Credit note
Customer cancelled — return their unallocated retainer balance Refund receipt linked to the retainer

The retainer is the cleanest pattern when the money lands before you know exactly what invoices it will cover.

Common mistakes

  • "My retainer didn't reduce the customer's AR." That's correct — a retainer sits as a liability, not as negative AR. Until you Allocate it against an invoice, it shows on the customer's profile as "unallocated retainer," separate from their AR balance.
  • Allocation greater than retainer balance. Allocations cannot exceed the retainer's unallocated balance — the form blocks it. Apply only what's available; create a new retainer (or take more cash) if you need more.
  • "Voided retainer left allocations behind." Void reverses the GL and removes every allocation — invoices it was allocating to flip back to open. Re-allocate from a different retainer or take a fresh payment.
  • Period locked. Posting, voiding, allocating, and refunding all require an open period.
  • Currency. The retainer is in the customer's currency. Allocating to an invoice in a different currency is not allowed — match currencies, or take a fresh payment.

Behaviour and rules

  • Retainers are a liability, not income. Receiving a retainer does not affect revenue — it parks the money on the books until you earn it.
  • Allocation moves the money from liability to AR. Only when allocated against an invoice does the customer's receivable balance change.
  • Retainer JE source label. On the Journal entries page, the retainer JE is tagged with the green Retainer chip.
  • Payments page. Retainers also surface on the Payments page as a "Retainer" row under Money In.
  • Period lock. Posting / voiding / allocating require the date's period to be open.

Permissions / restrictions

  • View / create / allocate / refund: sales.invoices.{view,create}.
  • Void: sales.invoices.unpost.

Related

  • Customers — retainer balances shown on the customer profile.
  • Invoices — retainers are allocated against open invoices.
  • Refund receipts — refund an unallocated retainer.
  • Payments — every retainer appears here as a "Retainer" row.
  • Reports — Customer Balance Summary, Customer Deposits.
Source: docs/solavel-finance/retainers.md ← All documentation