Custom Web Application

Lumiere Solution Portal

Client: Lumiere Solution Portal

Client Lumiere Solution Portal
Industry RTO
Duration 12 Months
Technologies
PHP Laravel MySQL Xero API dcblogdev/laravel-xero package OAuth 2.0 Blade HTML CSS Javascript

The Challenge

Client Profile: A mid-sized Australian Registered Training Organisation (RTO) operating in the Vocational Education and Training (VET) sector. The client manages both domestic and international student intakes across multiple qualification streams working with various delivery providers agents and assessors. They use Xero as their financial system of record.
What Was Broken: Their existing student management portal could record enrolments but it couldn't keep Xero clean. Every cancellation refund partial payment and credit note required double-entry across two systems and the books drifted from reality every single month. Finance staff were essentially babysitting two ledgers that refused to agree with each other.
The specific pain points:
Two-sided ledger chaos: Every enrolment generates both a student invoice (income) and a provider bill (expense). Keeping these synchronised manually across the portal and Xero was eating hours weekly.
Cancellations after payment were a nightmare: Once an invoice is AUTHORISED in Xero it can't be reverted to draft. Refunds legally require credit notes not edits. Staff were manually raising credit notes in Xero then re-keying the same data into the portal to keep records aligned.
Multi-fee invoices breaking the math: A single student invoice rolls up application fee RTO fee agent fee student fee international student fee and miscellaneous fees. Provider bills use a completely different formula (RTO fee only). Assessor commissions are billed separately again. One miscalculation and the support tickets started flowing: "why is the invoice $XX off?"
"Ghost unpaid" invoices flooding the system: Most Xero integrations only watch the Payments[] array. They miss credit note allocations prepayments and overpayments entirely. Result: invoices that had been paid (via credit note or prepayment) showed as unpaid in the portal triggering duplicate follow-up emails to students who'd already settled their accounts. Embarrassing and trust-eroding.
Agent and assessor commissions contaminating totals: Without ring-fencing these commissions kept leaking into student-facing invoice totals causing disputes and refund requests.
Hard-coded application logic: Adding a new qualification or changing provider routing required developer tickets. Ops staff couldn't move without engineering.
The core issue: most off-the-shelf student management systems handle the basic two-sided ledger and stop. The other four problems are exactly where reconciliation breaks down and where margin quietly leaks through duplicate invoices missed refunds and audit headaches.

Our Solution

Lumiere Solutions built LSPortal a Laravel-based student and application management platform purpose-built for RTOs with deep Xero integration treated as a first-class feature rather than an afterthought.
Tech Stack & Foundation:
Laravel as the core framework (hosted or self-hosted deployment options)
dcblogdev/laravel-xero package for Xero OAuth integration
Role-based access control architecture for admissions finance and assessor users
Full audit trail layer across every financial event
Key Features Built and the reasoning behind each:
1. Bi-directional Xero sync (foundational layer) Student invoices are created in Xero the moment an application is approved with provider bills generated in parallel against the correct supplier. Payment status (Unpaid / Partially Paid / Fully Paid) is calculated and surfaced in real time inside the portal. This decision eliminated the entire class of "did this sync yet?" questions from finance staff.
2. Cancellation & refund workflow (shipped Feb 2026) One-click cancellation that automatically generates the correct Xero artifact based on context: a credit note for paid student invoices or a refund invoice for paid provider bills. Toggle controls let admin staff decide whether to refund write off or hold. Negative payment records are preserved in the application's payment history for audit purposes. This was built because Xero's AUTHORISED-invoice rules made manual handling error-prone; the workflow encodes the correct accounting behaviour so staff can't get it wrong.
3. SyncsXeroCreditAllocations engine (shipped Apr 2026) the unique technical bet This is the feature that separates LSPortal from generic integrations. Instead of only watching the Payments[] array (the standard approach) the engine pulls all four allocation types: payments credit note allocations prepayments and overpayments. An invoice paid via credit note now correctly shows as paid in the portal with no manual ticking no ghost unpaid invoices and no duplicate dunning emails. This was the highest-leverage architectural decision in the build.
4. Correct fee math encoded as logic not configuration
Student invoice total = application + RTO + agent + student + international + misc fees
Provider bill total = RTO fee only
Assessor fees ring-fenced and billed separately
The math lives in the application layer rather than being entered manually per invoice which removes the entire category of "off-by-$XX" tickets.
5. Configurable application modes & provider selection (shipped Apr 2026) Different qualifications can use different application flows and provider routing logic configured by ops staff rather than developers. This decision reduced hard-coded logic across the codebase and unblocked the operations team from the engineering backlog.
The unifying design principle: close the gap at the integration layer not with manual processes. That's the difference between a portal that talks to Xero and one that belongs in a Xero-run finance stack.
Note: team size and project duration aren't specified in the source document worth confirming with Lumiere before publishing externally.

Results & Impact

Weekly hours spent on Xero reconciliation reduced significantly (specific figures pending real client validation)
"Ghost unpaid" invoice false-positives reduced to ~0 per month through the credit allocation sync engine
Zero manual credit notes raised in Xero per month fully automated via the cancellation workflow
Month-end books-vs-portal reconciliation variance reduced to $0 or immaterial
Cancellation + refund processing time cut from minutes of manual work down to a single click
Important caveat for publishing: The Results table in the source document still contains bracketed [X] [Y] [Z] placeholders and a placeholder client quote. Per the document's own appendix notes every bracketed value must be replaced with real client numbers or removed entirely before this goes external. A validated testimonial from a current user of the cancellation/refund or credit-note sync features would be the highest-ROI addition before publication.
Scroll