Skip to main content
All manual pages

Fees and payments

Enrollments, fees and payments

Enroll a student in a batch, understand the frozen enrollment total, adjust a fee with a recorded reason, take a payment and print a slip.

Last updated August 15, 2026

What you'll do

Put a student into a batch, which creates the money record for the whole course: what they owe, what they have paid, and what is left. Then take payments against it and print a slip.

Before you start

  • The student exists (see Students) and the batch has a Fee set (see Courses, batches and schedules).
  • A decision on any discount, before you enroll — a discount is much easier to set at enrollment than to correct afterwards.
  • Enrollments permissions to enroll, and Payments create permission to take money.

How the money model works

Read this once; it prevents most of the confusion around fees.

Which of the two models applies depends on the batch's Billing cycle. A batch set to One-time (course fee) works exactly as described in this section, and that is the rest of this page. A batch set to Monthly works differently: the enrollment total is frozen at 0 and every taka lives in monthly invoices instead. If that is your batch, read Monthly fees and invoices — the two never overlap, so a student's debt is in one place or the other, never both.

For a one-time batch:

  • A batch has a Fee — the price of the course today.
  • When you enroll a student, CampusQ computes batch fee − discount and freezes it on the enrollment. On screen this is the Enrollment Total.
  • Everything afterwards — dues, payment status, the guardian's balance, your outstanding-dues report — is measured against that frozen total, not against the batch's current fee.

So re-pricing a batch never changes what an existing student owes. That is the behaviour you want: a student who joined at ৳2 000 keeps that price when you raise the batch fee to ৳2 500 in January. The Update Enrollment screen shows both numbers side by side, labelled Batch Fee (current): and Enrollment Total:, precisely so you can see the difference.

The enrollment total is a frozen financial figure. The only way to change it is the deliberate, reason-required, audit-logged adjustment described below.

Enroll a student

Go to EnrollmentsView and manage all student enrollments. — and press Add Enrollment.

FieldNotes
StudentRequired.
CourseRequired.
BatchRequired. Pick the course first — Select a course first. Each option shows the fee and N seat(s) left.
Total AmountRead-only. Total fee (auto-filled from batch), with the hint Batch default: ৳2,000. You cannot type over it here.
DiscountOptional discount. This is the one lever on the total at enrollment time. When it is above zero a Net payable line appears.
Amount PaidOptional. Initial payment (optional) — the money in your hand right now. Leave blank to enroll with nothing paid.
Payment MethodBecomes required once Amount Paid is above zero.
Transaction IDBank ref / cheque no. (optional).
Payment Notes, RemarksOptional.

The Payment details section states its own scope: Optional. Record the initial payment alongside the enrolment. Leave empty to enrol with no payment.

Press Add Enrollment. Two things happen automatically:

  • A Roll number is allocated for this batch — highest existing roll plus one. See Students for why gaps are deliberate.
  • If Enrollment confirmation SMS is switched on, the student is texted. See SMS and notifications.

Payment status

The status on each enrollment is derived from the amounts — you cannot set it by hand, and there is nothing to keep in sync:

StatusWhen
PendingNothing paid yet.
Partially PaidSomething paid, something still due.
Fully PaidNothing remaining.
RefundedWritten by a refund. Never derived.
FailedWritten by declining a pending payment. Never derived.

A zero-total enrollment stays Pending, not Fully Paid — which is what you want for a free or sponsored seat, so it still shows up as something you have decided about rather than something collected.

The words above are what you see in the Update Enrollment dialog. In the Enrollments table and on the payment slip the same values appear in their raw English form (PartiallyPaid, FullyPaid) even when the app is in Bengali.

Adjust a fee

Sometimes the frozen total is genuinely wrong — a sibling discount agreed after the fact, a scholarship, a correction. Open the enrollment's Edit action.

The dialog opens with a read-only summary: Student:, Course:, Batch:, Batch Fee (current):, Enrollment Total:, Amount Paid, Due: ৳500 and Payment Status. Note its own signpost: To record a payment, use the "Take Payment" action on the enrollment row.

To change the total:

  1. Turn on the Adjust total fee switch. Until you do, the total is read-only — that is on purpose.
  2. Type the new Total Amount.
  3. Fill in Adjustment Reason. It is requiredWhy is the total being changed?, up to 500 characters. There is no way past it: the form, the client validation and the server all insist.
  4. Press Update.

The adjustment is written to an append-only audit record. Every adjustment stores the old total, the new total, your reason, who you are and when you did it, in a table whose rows are never updated or deleted — corrections are new adjustments, not edits to old ones. It exists to answer the ISO 9001 and ISO 27001 question of who changed a financial figure, when, and why.

Two consequences for how you should write the reason:

  • Write it for a stranger. "Sibling discount agreed with the director, 2 of 2 siblings" is an audit record. "adjust" is not. Somebody may read it in two years with no memory of the conversation.
  • Remarks is not the audit trail. The Remarks field on the same dialog is free text that anyone can later edit. The adjustment record is the permanent one. Put the real reason in Adjustment Reason.

There is no screen that shows you the enrollment adjustment history. The records are kept, but CampusQ has no enrollment adjustment log for you to browse. If you need to see the history of a disputed enrollment fee, ask support to retrieve it. Invoice corrections are different — those have an Audit trail button on the row, see Monthly fees and invoices.

You also cannot change the discount and adjust the fee in the same save — the server rejects it. Do one, save, then the other.

Take a payment

Take Payment is on the enrollment's row menu. It disappears once the row is Fully Paid, and needs the Payments create permission.

The dialog shows Course, Batch, Fee, Paid and, prominently, Remaining due.

  1. Press Full (Pay full remaining balance) or Half (Pay half of remaining balance) to fill the amount, or type it into Amount.
  2. Add a Discount (optional) if you are waiving part of this instalment. A To be credited after discount line shows what will actually land.
  3. Choose the Method. The list is: Cash, Bank Transfer, Credit Card, Debit Card, Online Payment, Cheque, Other, Bkash. It defaults to Cash. These labels are English in both languages.
  4. Payment date defaults to today and cannot be in the future.
  5. Add the Transaction ID (optional)e.g. bKash/Nagad/bank ref. Do fill this in for anything that is not cash; it is what you will search for when a transaction is queried.
  6. Add Notes (optional) if anything about the payment needs explaining.
  7. Press Record payment.

You get the receipt number back: Payment recorded — Receipt RCP-000123 created. The enrollment's Amount Paid and Payment Status update immediately.

You cannot overpay. More than the remaining due is refused, inline (Exceeds remaining due (৳500).) and again on submit (Payment (after discount) exceeds the remaining balance. Adjust the amount.). If a student genuinely paid more than they owe, the fee is what is wrong — adjust the total, with a reason, then take the payment.

Print a receipt

There is no print button in the Take Payment dialog. The route is:

  1. Go to Payments.
  2. Find the payment and choose View.
  3. On the payment's detail page, press Print Slip.
  4. Your browser's print dialog opens — print it, or save as PDF.

The slip carries your centre's letterhead (your banner image, or your logo and name — set under Settings → Branding), the receipt number, the generation date, the Student, the Course and Batch, three totals — Total, Paid, Remaining — and a Payment history table of every payment on that enrollment: Date, Receipt, Method, Amount, Discount, Final, Status. It closes with This slip is a record of course enrollment payments. Please retain it for your reference.

So the slip is a statement of the whole enrollment, not just the one payment — hand it over and the guardian can see their full position.

The slip is English only. Unlike the rest of the app it does not switch to Bengali. Names and amounts print as entered; the headings do not translate. Also, only payments attached to an enrollment have a slip — a book sale does not.

Notes

  • Enrollment, not invoice — on a one-time batch. One frozen total, paid down by payments you record. A batch billed Monthly carries its money as invoices instead; see Monthly fees and invoices.
  • Switching a batch to Monthly does not rewrite frozen totals. Existing debts stay exactly where they are, and those students then also start receiving monthly invoices. Switch at a boundary, or plan to settle the old balances by hand.
  • Payments post to your cash book automatically, under a category chosen from the payment type. You never enter fee income by hand — see Accounts and expenses.
  • The Total Amount field on Add Enrollment is display-only and is not sent to the server. Use Discount at enrollment, or Adjust total fee afterwards.
  • Re-pricing a batch is safe. Existing enrollments keep their frozen total.
  • Two filters on the list: by course and by student. Search is separate.
  • Deleting an enrollment is permanent and consumes nothing back — the roll number it used is never re-issued.
  • English-only strings: the Status and Payment Status tags in the table, the payment method names, the status chip in the Take Payment dialog, and the whole payment slip. The Take Payment date picker shows dd/mm/yy regardless of language.
  • Audit and document control. Fee adjustments are recorded permanently. Printed slips and receipts carry roll numbers and totals, so a later Renumber rolls or fee adjustment makes an already-printed document disagree with the system — see Students.
  • Synthetic examples only. Demo Student 1, RCP-000123 and ৳2,000 here are invented.

Troubleshooting

The Batch dropdown is empty. Pick a Course first.

The total came through as ৳0. The batch has no Fee. Set it on the batch, then adjust this enrollment's total with a reason — the total was frozen at zero when you enrolled.

Take Payment is not on the row menu. Either the enrollment is already Fully Paid, or you do not have the Payments create permission.

A payment was recorded twice. Delete the duplicate from the Payments list. The enrollment's paid amount and status recompute themselves.

This enrollment's total is ৳0 and I did not set it that way. The batch is billed Monthly, so the total is frozen at zero on purpose and the money is in invoices. See Monthly fees and invoices.

I raised the batch fee and the students' dues did not change. Correct and intended. Their totals were frozen at enrollment. Adjust each enrollment individually if you really mean to re-price mid-course — and expect to justify it to the guardians.

Update refuses to save when I change the discount and the total together. It is one or the other per save. DiscountAmount cannot be changed in the same request as a fee adjustment. Save one, then the other.

Print Slip is not showing on a payment. That payment is not attached to a course enrollment — book sales have no slip.

A guardian wants to pay online. The guardian link has a Pay now button that takes them to the public payment page, where they look up dues by student ID, send the amount to your centre's own bKash/Nagad/bank account, and submit the transaction ID. The payment lands Pending until staff verify it. See Students.