Built by Monthos · Case Study
sv.co.za
uat.sv.co.za
Monthos built a production-grade bursary platform that automates the full beneficiary lifecycle for large South African corporates—now running six enterprise clients on one codebase.
Who this is for: large corporates and funders running bursary, learnership or CSI/L&D programmes in South Africa and the broader SADC region.
Running a corporate bursary programme at scale is operationally intensive. The problems Monthos was asked to solve were concrete and recurring across every prospective client:
Monthos designed Student Village around four guiding principles:
Isolation by design. Every corporate client is a discrete tenant. Data, branding, budgets, funding categories, eligibility rules, application dates, e-mail templates, and user accounts are all scoped to the owning company. No client ever sees another client's beneficiaries or spend.
Configurable, not customised. Rather than shipping bespoke code per client, the platform exposes a rich administration layer—application form field toggles, custom questionnaires, per-company e-mail template overrides, configurable age and eligibility thresholds, disbursement fee settings, and per-company payment gateway keys. Clients configure; Monthos maintains one codebase.
Audit-ready by default. Every approval decision, status transition, disbursement, and document upload is captured in structured activity logs. Invoice approval follows a mandatory five-step workflow (submitted → line manager → operations → released → paid), with timestamps and actor identities at every step.
Automation reduces human error. Scheduled Artisan commands handle the tasks most likely to be missed under manual operation: auto-rejecting stale applications, reminding managers of pending queues, verifying bank accounts, releasing payments to the Peach Payments gateway, and importing HR batch files from SFTP.
company_dates
bursary:company_add_year
bursary:applicant_add_year
bursary:batch_file_report
patrickallaert/php-saml
league/oauth2-google
arcturial/clickatell
league/flysystem-sftp-v3
phpseclib
tecnickcom/tcpdf
logtail/monolog-logtail
Domain-based multi-tenancy. Each corporate client is identified by a unique domain_name on the companies table. Applicant-facing portals are served on client-specific subdomains (e.g. nedbank2.bursary.sv.co.za). API requests are validated against the resolved company. All data queries flow through the company context, making cross-tenant data leakage structurally prevented rather than policy-enforced.
domain_name
companies
nedbank2.bursary.sv.co.za
Bounded context organisation. The app/Contexts/ directory groups the codebase into 17 explicit domains — Applicant, Auth, BatchFiles, Bursar, Company, CompanyProgram, File, Master, Payment, Qualification, Report, SortList, Tutor, University, User, Workshop — each with its own Models, Actions, Tasks, UI (Controllers, Middleware, Requests, Transformers, Routes), isolating domain logic and making the system maintainable as it scales.
app/Contexts/
Action-based controller pattern. Controllers are thin dispatchers; all business logic lives in discrete Action classes injected by Laravel's service container. This makes individual operations independently testable and reusable across routes.
Role-based access control with API-level enforcement. 17 distinct roles (Super Admin, Company Admin, Company Operations, Company Finance, Company Report, Company Settings, SV Admin, SV Operations, SV Finance, Applicant, Bursar, Line Manager, L&D Manager, Programme Manager, Batch, Program, and a standalone Batch-import role) are enforced by dedicated middleware (userAccess, adminRoleAccess, companyRoleAccess, financeAccess, roleAccess, checkApiAccess). Bursar-portal API endpoints have a separate access map (BURSAR_API_ACCESS) that can selectively expose or hide portal sections per company.
userAccess
adminRoleAccess
companyRoleAccess
financeAccess
roleAccess
checkApiAccess
BURSAR_API_ACCESS
Scheduled automation. 20 Artisan commands cover every recurring operational task, scheduled to run at appropriate intervals without human trigger:
bursary:batch_file_import_check — Poll SFTP, decrypt, ingest HR batch files bursary:batch_file_data_process — Validate and apply batch file rows to user/applicant records bursary:batch_file_data_send — Transmit completed reports to corporate SFTP bursary:batch_file_report — Assemble and stage the structured CSV activity report bursary:payment_release — Dispatch approved invoices to Peach Payments bursary:bank_verify — Validate student and supplier bank accounts via Peach bursary:auto_reject_email — Auto-reject and notify on stale applications bursary:manager_reminder_mail — Send manager reminder digests bursary:pending_company_approval_reminder — Notify on pending approvals bursary:applying_mail — Send application confirmation e-mails bursary:send_mail — Process the outbound e-mail queue bursary:send_sms — Process the outbound SMS queue bursary:bulk_message — Dispatch bulk e-mail/SMS/chat campaigns bursary:workshop_reminder — Send workshop attendance reminders bursary:tutor_reminder — Send tutor-session reminders bursary:company_add_year — Roll company budgets to new academic year bursary:applicant_add_year — Roll applicant records to new academic year bursary:delete_db_logs — Prune request and activity log tables
Document pipeline. Uploads go directly from the browser to a pre-signed S3 URL (no file passing through the server). Documents are stored in typed S3 folders (attachment, lease, signed contract, id, disability, certificate, acceptance, parent, fee, book, eea1) and served via expiring pre-signed download URLs, keeping sensitive student documents private even when URLs are shared.
SFTP + SSH for HR data exchange. Batch files delivered by corporate HR systems to a shared SFTP server are picked up via phpseclib SSH, a remote decryption shell script is executed server-side, and the decrypted CSV is pulled into S3 for processing. This handles corporate security requirements around data-in-transit without requiring client changes to their existing HR export workflows.
Dual SAML 2.0 SSO. Separate service-provider entity IDs and Azure AD application registrations are maintained for the admin/operations portal and the student-facing portal, each with environment-specific certificates. SAML assertions are validated server-side; a Sanctum token is issued on success and returned to the frontend via a redirect, keeping tokens out of SAML responses.
Structured batch reporting schema. The outbound batch report (used by Nedbank and other clients for Skills Development and B-BBEE reporting) covers a precisely defined 130-column CSV schema (BATCH2_FIELDS), including all approval actors, full semester-by-semester subject results, invoice financials, programme metadata (SAQA ID, accreditation number, NQF level, capability), and budget consumed/balance. The schema is defined as a constant and validated at source, meaning it cannot drift silently.
BATCH2_FIELDS
┌─────────────────────────────────────────────────────────────────────┐ │ Corporate Clients │ │ Vodacom · Nedbank · MultiChoice · Adapt IT · AECI · 36ONE │ └───────────────┬─────────────────────┬───────────────────────────────┘ │ Company subdomain │ SFTP (HR batch files) ▼ ▼ ┌───────────────────────────────────────────────────────────────────┐ │ Student Village Platform │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │ │ │ Student / │ │ Admin / │ │ Operations / │ │ │ │ Applicant │ │ Company │ │ Finance Portal │ │ │ │ Portal │ │ Portal │ │ (SV team) │ │ │ │ (SAML SSO) │ │ (SAML SSO) │ │ (SAML SSO) │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────────┘ │ │ │ │ │ │ │ └─────────────────┴─────────────────────┘ │ │ │ │ │ Laravel 12 API (Sanctum) │ │ │ │ │ ┌────────────────────────┼─────────────────────────────────────┐ │ │ │ 17 Bounded Contexts │ │ │ │ Applicant · Company · Bursar · Payment · Report · Auth ··· │ │ │ └────────────────────────┼─────────────────────────────────────┘ │ │ │ │ │ ┌─────────────────┼───────────────────┐ │ │ ▼ ▼ ▼ │ │ MySQL DB AWS S3 Scheduled Jobs │ │ (multi-tenant (documents, (20 Artisan commands) │ │ by company_id) branding) │ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Integrations │ │ │ │ Peach Payments (bank verify + payout) · ClickATell SMS │ │ │ │ AWS SNS (SMS) · Azure AD (SAML) · SFTP (HR + reports) │ │ │ └─────────────────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────────────────┘ │ ┌──────────┴──────────┐ ▼ ▼ AWS Lambda SFTP (Bref serverless) (outbound reports to corporates)
Student Village is one of the most complete reference implementations of a corporate bursary management system built for the South African market. It demonstrates:
For any corporate running a bursary or CSI programme in South Africa—or any software studio building in this space—Student Village is a strong, production-proven reference.
If your organisation runs a bursary, learnership, or CSI programme and needs a production-grade management platform—or if you are looking for a software studio to design and ship a custom enterprise application—Monthos would be glad to hear from you.
Talk to Monthos →
Case study prepared for Monthos.com · Project: Student Village Bursary Management System
Monthos Group — Cheltondale, Johannesburg, SA. Email info@monthos.com, phone +27 (68) 750 7313.
Case studies · Privacy Policy · Terms of Service