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

DRAFTaccountant edits freely
PENDING_APPROVALsubmitted
APPROVEDby a different user
POSTEDcounts on ledger

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

  1. Go to Expenses → New.
  2. Enter the transaction date, amount, payment mode, category, and payment account.
  3. Pick the vendor if this is a vendor expense; otherwise enter a free-text payee name.
  4. Write a description — this is the single most useful field when reading the ledger months later.
  5. If the expense is GST-bearing, fill in CGST / SGST / IGST.
  6. 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_APPROVED is recorded.
  • Reject requires a reason and bounces the expense back to DRAFT, visible to the submitter in their My drafts panel.
Sukrit Nidhi blocks any user from approving their own submission. This is the SoD rule you can’t override. The system also refuses self-payments (approving an expense where you are the payee).

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.