Recording expenses
Expenses carry more risk than donations — money leaves the NGO — so the workflow has explicit approval gates. You will move an expense through four states: DRAFT → PENDING_APPROVAL → APPROVED → POSTED. Only POSTED rows count on the books.
The full lifecycle
Rejected expenses bounce back to DRAFT with the rejection reason attached. Voiding a POSTED expense follows the same step-up + reason pattern as voiding a donation.
Stage 1 — Create a draft
- Go to
Expenses → New. - Enter the transaction date, amount, payment mode, category, and payment account.
- Pick the vendor if this is a vendor expense; otherwise enter a free-text payee name.
- Write a description — this is the single most useful field when reading the ledger months later.
- If the expense is GST-bearing, fill in CGST / SGST / IGST.
- Save as DRAFT.
You can edit a DRAFT as many times as you like. Nothing is committed to the ledger at this stage.
Stage 2 — Attach the bill
Go to the draft and click Attach. Upload the
invoice, receipt, or cheque image. See
Attachments for
file-type, size, and AV-scanning rules.
You can submit an expense without an attachment, but if your NGO’s config requires one, the approver will reject it.
Stage 3 — Submit for approval
Click Submit. The status moves to
PENDING_APPROVAL, the row locks so the submitter can no longer edit it, and a
notification is sent to every user with approval rights for this centre.
Stage 4 — Approve or reject
A different user with approval rights opens the expense. They see:
- The full expense details.
- A preview of each attachment (thumbnails for images, page 1 for PDFs).
- A sidebar listing any prior rejections and their reasons.
From there:
- Approve moves the expense to APPROVED. An audit event of
type
EXPENSE_APPROVEDis recorded. - Reject requires a reason and bounces the expense back to DRAFT, visible to the submitter in their My drafts panel.
Stage 5 — Post the expense
Approved expenses need one final click to actually hit the ledger —
Post. This creates the money movement in the
chosen payment account and writes an
EXPENSE_POSTED audit event.
In most centres the same user who approves will also post, immediately after approval. Splitting the two actions gives you room to run a quick last-mile review (is the amount right?) before money shows as spent on the dashboards.
Voiding a posted expense
Same rules as voiding a donation: open the row, click
Void, step-up with your MFA code, enter a reason.
A voided expense is excluded from all statements but remains visible in the
audit log and in the bundle.
Quick filters
The expenses list supports these filters, combinable:
- Status — DRAFT, PENDING_APPROVAL, APPROVED, POSTED, REJECTED, VOIDED.
- Mine only — your own submissions across all statuses.
- Awaiting my approval — pending rows you can act on.
- Date range, category, payment account.