Implementation Consultant + BA for the financial tracking of Newton Sixth Form's STEM enrichment programme on XeerSoft Financial Accounting — seven lab and competition subjects billed per student. Designed AR billing structure, configured collection tracking, set up cost allocation, and produced per-subject P&L with margin analysis. Go-Live June 2026 — post-go-live dunning recovered collection to 95%, with ฿110K still in run-off.
Newton Sixth Form ran a recurring STEM enrichment programme (Jan 2025 – Go-Live June 2026): students attended hands-on university lab sessions and academic competitions, billed per family. I owned the full financial lifecycle on XeerSoft: invoicing each family, tracking payment collection, investigating discrepancies, allocating cost, and reporting per-subject P&L to management.
The programme spanned seven subjects, billed per student: six hands-on lab subjects (Robotics, Biology Lab, Math Camp, Physics Lab, Chemistry Lab, Engineering Design) at ฿3,000/student, and an in-house Math Competition at ฿500/student. Each carried a different attendance and cost profile.
Three streams running concurrently on XeerSoft Financial Accounting: (1) AR Billing Design for per-student invoicing, (2) Cost Allocation per session and subject, and (3) Management Reporting with session-level P&L.
| Subject | Fee / student | Direct cost |
|---|---|---|
| Six lab subjects | ฿3,000 | lab + transport + materials |
| Math Competition | ฿500 | staffing (in-house, no venue) |
| Subject | Revenue | Gross Profit | Margin | Collection |
|---|---|---|---|---|
| Biology Lab | ฿555,000 | ฿268,374 | 48% |
91% |
| Robotics | ฿534,000 | ฿267,020 | 50% |
94% |
| Math Camp | ฿390,000 | ฿185,302 | 48% |
100% |
| Physics Lab | ฿267,000 | ฿138,504 | 52% |
100% |
| Chemistry Lab | ฿264,000 | ฿140,094 | 53% |
98% |
| Engineering Design | ฿126,000 | ฿54,575 | 43% |
86% |
| Math Competition | ฿45,000 | ฿27,000 | 60% |
96% |
Each session's cost splits across three categories — one variable (materials, per student), two fixed (lab fee, transport) — producing the cost side of the P&L.
| Cost category | Type | Basis | Per session |
|---|---|---|---|
| Lab fee | Fixed | per session (lab) | ฿40,000 |
| Materials | Variable | ฿900 × 50 students | ฿45,000 |
| Transport | Fixed | per session | ฿12,000 |
| Total cost / session | ฿97,000 | ||
The STEM billing & profitability process as configured in XeerSoft, module → function paths.
| # | Process Step | XeerSoft Module → Function |
|---|---|---|
| 1 | Student enrolment per session | Enrolment › Register Session |
| 2 | Create per-student AR invoices | Financial Accounting › AR Invoice |
| 3 | Track collection status | Financial Accounting › AR Open Items |
| 4 | Investigate discrepancy | Financial Accounting › Payment Matching |
| 5 | Cost allocation per session | Cost Allocation › Session Order |
| 6 | Session P&L reporting | Reporting › Session P&L |
The AR posting and reporting logic I authored in the FSD and submitted to the XeerSoft development team.
An interactive simulation that runs the FSD logic above directly in your browser: it reproduces the specified behaviour I designed, not the proprietary XeerSoft UI.
Session inputs · FSD-P4-01
Session P&L · FSD-P4-02
AR position
Per-invoice posting
On XeerSoft Cloud ERP I worked as Functional Consultant / Business Analyst, owning requirements, configuration, FSD authoring, UAT and defect management. The custom logic below was implemented by XeerSoft’s in-house development team against my specifications.
The pseudocode shown is the specified expected behaviour (my FSD deliverable), not vendor source code, and deliberately platform-neutral so it reads the same to a XeerSoft or generic ERP reviewer.
Per-student invoicing is the visible surface. Underneath, this was a financial accounting and management controlling implementation: seven subjects had to stay separated as profit centers, costs had to derive to the right branch cost centers, the AR sub-ledger had to reconcile to the GL control account every period, and revenue recognised on a billed (accrual) basis had to be tracked apart from cash collected. Each of those is a place the books can silently go wrong, and together they are why the build took the time it did.
| Financial-control dimension | Why it is hard | How I handled it |
|---|---|---|
| Profit-center separation | 7 subjects, one revenue stream; pool them and per-subject P&L becomes fiction | Profit center per subject, derived on every revenue posting |
| Cost-center derivation | Lab, materials and transport split across 3 branches (1100/1200/1300) | Substitution rules map each cost to its branch CC + dept 110 Academic |
| Sub-ledger ↔ GL tie-out | AR sub-ledger must equal GL 110100 control at every close, to the baht | Nightly reconciliation routine plus an exception report on any variance |
| Accrual vs cash | Margin is billed-basis; collection is a separate cash metric; mixing them misstates both | Revenue booked on invoice; collection tracked on a parallel AR status model |
| Period-end close | 17 monthly closes, each blocked if the books do not tie out | Close checklist: post → reconcile → clear disputes → sign-off |
| Dunning & recovery | ฿375K outstanding across families with partial and disputed balances | AR-aging-driven dunning recovered ฿267K, lifting collection 82.4% → 95.0% |
A financial build runs long because of volume across dimensions, not one large task. Over the engagement the programme moved roughly ฿2.18M across seven subjects and three branches, and every baht of it was invoiced, reconciled and closed.
| Dimension | Count | Note |
|---|---|---|
| Per-student AR invoices | 802 | 712 lab + 90 Math Competition, across multiple intakes |
| Subjects as profit centers | 7 | 6 labs @ ฿3,000 + 1 competition @ ฿500 |
| Branch cost centers | 3 | 1100 / 1200 / 1300 + dept 110 Academic |
| GL accounts in scope | 14 | AR, revenue, cost, contra, dunning, tax & bank clearing |
| Monthly period closes | 17 | each gated on a clean sub-ledger ↔ GL tie-out |
| FSD iterations | v1 → v3 | two re-specs after the GL-separation defect |
| UAT cycles | 5 | 1 pre-defect + 3 regression + 1 cutover dress run |
| AR recovered via dunning | ฿267K | of ฿375K outstanding, lifting collection to 95.0% |
At UAT Cycle 1 the build looked right on a single invoice and failed at the books. Every subject posted to the same AR and revenue control account with no profit-center or cost-center derivation, so two things broke at once: the AR sub-ledger stopped tying to the GL, and per-subject P&L could not be produced. In financial-control terms that is a go-live blocker, not a cosmetic bug: you cannot close a period whose sub-ledger does not reconcile. Closing it meant re-specifying the posting model and re-testing it across three regression cycles.
| Posting dimension | FSD v1 (defect) | FSD v3 (re-spec) |
|---|---|---|
| Revenue account | 400150, all subjects pooled | 400150 + profit center per subject (PC01–PC07) |
| AR control | 110100, no family sub-ledger key | 110100 with per-family sub-ledger, tied nightly |
| Cost derivation | single cost bucket, no branch | cost-center substitution → 1100/1200/1300 + dept 110 |
| Sub-ledger ↔ GL | out of balance at close | reconciles to the baht; variance report on exception |
| Per-subject P&L | not derivable | 7 profit centers, margin per subject |
| Period close | blocked | passes the close checklist |
I did not sign off the build as one pass/fail. I decomposed the billing → AR → profitability scope into 10 sub-unit tests, each run as a manual test case of ~10 ordered steps validated against 5 complex conditions, with one written specific assurance per sub-unit (the exact thing the test guarantees). This is the breakdown behind the 5 UAT cycles already noted — 1 pre-defect + 3 regression + 1 cutover dress run — including the GL-separation defect that moved Go-Live.
Each sub-unit test is a manual procedure: log in under the correct role, drive the transaction step by step, and confirm the posting, derivation and data outcome at each gate. Every test carries 5 complex conditions — multi-subject split / discount / refund / period boundary / derivation paths — not just the happy path. A sub-unit only closes when its specific assurance holds under all five and a regression retest is clean.
Manual procedure · 10 steps
Complex conditions · 5 paths
Guarantees that every subject's revenue lands in its own GL and profitability segment, so per-subject profitability is real, not blended — discounts and refunds route to the correct contra / subject account and never distort gross revenue. This is the exact failure the FSD v1→v3 re-spec fixed: it broke the core promise of the build — per-subject P&L — and is closed as DEF-P4-01.
| ID | Sub-unit | What broke (symptom) | Sev | Root cause | Fix I specified to dev | Days | Retest |
|---|---|---|---|---|---|---|---|
| DEF-P4-01 | UT-02 revenue determination | All STEM subjects posted to a single revenue GL, so per-subject P&L was blended and meaningless. | HIGH | FSD v1 account determination keyed only on billing type, not subject. | Re-spec'd account determination to derive a per-subject revenue GL (FSD v1→v3). | 5 | ✓ PASS |
| DEF-P4-02 | UT-04 segment derivation | Segment came through blank for competition subjects, so their revenue was unattributed. | HIGH | No derivation rule mapped material → subject characteristic for that group. | Added the derivation rule so segment = subject is always populated. | 3 | ✓ PASS |
| DEF-P4-03 | UT-05 value fields | Discount was double-counted in the contribution margin. | MED | Discount mapped into both revenue and its own value field. | Mapped discount to a single dedicated value field. | 2 | ✓ PASS |
| DEF-P4-04 | UT-09 dunning / AR | Partial payments in run-off were ignored by aging. | MED | Aging keyed on invoice gross, not open residual. | Age on the open residual after partial payment. | 1 | ✓ PASS |
| DEF-P4-05 | UT-07 P&L report | Report total did not tie to the GL by a small rounding gap. | LOW | Currency rounding differed between report and posting. | Aligned rounding / currency settings in the report. | 1 | ✓ PASS |
5 defects raised to the XeerSoft dev team, ~12 working days of fix-and-retest in total. The GL-separation blocker (DEF-P4-01) is the one that moved Go-Live — it broke the core promise of the build, per-subject profitability, by blending every subject into one revenue GL. All five closed with a clean regression retest. The discipline is the point: every defect has a named symptom, a root cause, a fix I specified, days-to-resolve, and a clean regression retest — nothing closed on assertion.
Each student invoice flowed through four distinct status codes: OPEN → PARTIAL → CLEARED in the standard path, with DISPUTED as the exception branch when a bank receipt didn't match the expected amount. I personally managed the reconciliation for any DISPUTED items, cross-checking bank statements against expected receipts until every one was cleared.
· Total Collected: ฿2.071M (95.0%), across all seven subjects
· Total Outstanding: ฿110,000 (5%), in post-go-live run-off
· Recovered ~฿267,000 of ฿375,000 outstanding AR via post-go-live dunning, raising collection 82.4% → 95.0% (margin is gross, on a billed/accrual basis, before staff & overhead)
The per-subject margin showed where the programme generated the most economic value. Math Competition led at 60% margin on a small revenue base, while Biology Lab produced the highest absolute gross profit (฿268K). Overall programme margin is 49.6%, gross and on a billed (accrual) basis — before staff and overhead. This data informed pricing and session planning.
The measurable outcome was a reconciled STEM financial model across 802 transactions and 7 subjects: ฿2,181,000 revenue tracked, ฿2,071,000 collected, 95.0% collection rate, ฿110,000 outstanding AR, ฿1,080,869 gross profit, and 49.6% overall margin on a billed accrual basis.
How the project was actually run end-to-end after the consulting work above: the timeline and where it was at risk, how I specified the build for the developers and verified it, the weekly Agile cadence, and the stakeholder network I coordinated as the single point of accountability.
This was a recurring revenue cycle, not a one-off: every STEM intake billed each family ฿500–3,000. Late or inaccurate billing directly delayed cash collection, so the schedule pressure repeated every intake until the programme reached Go-Live in June 2026.
Project timeline · month-by-month
Planned as a 12-month delivery (Jan–Dec 2025, the same shape as Project 02). A GL multi-account separation defect in the dev build surfaced at UAT Cycle 1: per-subject revenue and cost postings were collapsing into single control accounts, so the AR sub-ledger would not reconcile to the GL and per-subject P&L could not be trusted. Closing it took an FSD re-spec (v2–v3) plus three regression cycles, moving Go-Live to June 2026: a +5-month slip, fully recovered to 95% collection.
Schedule risk & recovery
The dev build posted all seven subjects to single AR and revenue control accounts with no profit-center or cost-center derivation, so the AR sub-ledger did not tie to the GL and per-subject P&L was unreliable: a hard blocker for period close, and therefore for go-live. Resolved → I re-specified the posting model (FSD v2–v3) with a profit center per subject, branch cost-center substitution, and a nightly sub-ledger ↔ GL reconciliation, then ran three regression cycles to zero blocking defects before cutover.
Mid-programme, collection sat around 82.4% with outstanding AR carried per family — cash tied up in OPEN/DISPUTED items. Resolved → AR aging per family plus DISPUTED reconciliation against bank receipts and post-go-live dunning recovered ~฿267,000 of ฿375,000 outstanding, raising collection 82.4% → 95.0% (฿110,000 still in run-off).
Without per-session P&L, management couldn’t see which subjects actually earned money. Resolved → I built session-level revenue-vs-cost reporting so pricing and session planning are now driven by margin data.
Spec design → developer handoff → build verification
How I spec for developers
How I verify the build (functional, not source-code review)
Weekly Agile cadence
AR aging review + DISPUTED follow-up
Bank reconciliation matching
Cost allocation / session orders
P&L + margin report refresh
Management update + dev sync
Stakeholder network & RACI
| Stakeholder | Count | Their part | RACI |
|---|---|---|---|
| You · BA + Implementation | 1 | Billing design, AR ops, P&L reporting | A / R |
| Management | few | Consume P&L; pricing decisions | C / I |
| Families | per intake | Billed; payment collection | I |
| Lab partner | 1 | Lab fee / cost input | C |
| XeerSoft dev team | remote | Built AR posting + report from FSD | R |
A financial operation I ran single-handedly end-to-end — sole owner of billing, collection, reconciliation and the P&L management used to plan sessions. Went Go-Live in June 2026; AR recovered to 95% via dunning, with a clean handover to BAU.
The programme went Go-Live in June 2026. Post-go-live dunning recovered ~฿267,000 of ฿375,000 outstanding AR, raising collection 82.4% → 95.0% (฿110,000 still in run-off). The final per-subject P&L — gross profit ฿1,080,869 at a 49.6% overall margin on a billed (accrual) basis — is handed to management; billing, cost allocation and margin reporting run live in production, with a clean handover to BAU.