Platform foundation.
Before a single grade is entered or a single fee billed, the platform has already decided who you are, what you can see, and what the school looks like. This is the foundation: the school's identity and currency, the languages it speaks, the roles and permissions that gate every screen, the campuses it federates, the plan it runs on, and the integrations it connects. Get these right once and every other module inherits them.
- 16role types
- 58permission modules
- EN·FR·AR+ RTL Arabic
- ≈12 minto read
Prologue
The load-bearing bones#
Every tenant in YESS is one school, isolated from every other by a school_id on every row and row-level security on every table. The foundation module is where a school sets the values those rules read from — its name and currency, its enabled languages, the roles its staff hold, the campuses it spans, and the plan that decides which features are switched on.
You will not visit these screens daily. You visit them at the start — to stand the school up — and then occasionally, to add a campus, mint a custom role, or change a plan. But every other handbook in this set quietly depends on the choices made here. A new tenant also arrives almost furnished: the moment a school is created, a single database function provisions its baseline roles, a default grading scale, the current academic year and its three terms, the three languages, the starter settings, and a thirty-day free trial — so the foundation is rarely a blank page.
Chapter one
School settings and identity#
The settings hub at /dashboard/settings is the discovery centre for everything school-wide, organised into seven tabs (plus a card that jumps straight to roles):
The settings tabs
- 1
Profile
School name, motto, website, currency, timezone, and default language — plus the academic configuration: the calendar type (semester / trimester / quarter), working days, the minimum attendance threshold, late-arrival grace, and the absence penalty rate. Renaming the school fans out to the schools row, its customization, and system settings — so the topbar, every report, and every certificate update together.
- 2
Branding
The school's logo, the brand colour palette (primary, secondary, tertiary, accent), optional header- and sidebar-background overrides, a font family, and even custom CSS. Set it once and the whole app re-tints to the school's own identity.
- 3
Localization
Per-language enable switches for English, French, and Arabic, the date / time / number formats, and a right-to-left toggle for Arabic. At least one language is always on.
- 4
Security
The school's access policy — two-factor enforcement, session timeout, and the password rules.
- 5
Portal login
How families and staff sign in — the copyable school code, QR codes and deep-links for student, parent, teacher, and staff logins, a batch student QR print sheet, and bulk magic-link invitations.
- 6
Portals
Per-module visibility toggles that hide a module from a portal's sidebar — the school decides exactly which surfaces each audience sees.
- 7
Letterhead
The document header that prints on report cards, certificates, and official letters — ministry header, school header, address, dual-logo placement, with a bilingual preview.
Chapter two
Roles and the permission matrix#
The roles surface at /dashboard/roles is the most powerful screen in the foundation. The catalogue defines sixteen standard role types — from school_admin and principal down to teaching_staff, accountant, librarian, student, and parent_guardian. A freshly created school is provisioned with a baseline set of these, each pre-granted a sensible slice of the platform's permissions ( school_admin gets all of them ); operational roles like the canteen manager, hostel warden, nurse, and proprietor are added as the relevant modules come online. On top of all that, you can create custom roles of your own.
A header KpiStrip counts the roles (system versus custom), permissions, assignments, and campuses. The left rail splits roles into system and custom — system roles wear a lock badge and cannot be deleted, though their permissions can still be tuned. Selecting a role opens its permission matrix: permissions grouped by module, each module collapsible with a “grant all” switch, every action toggleable individually, with a live granted-count. An Assigned-users tab on each role shows — and lets you assign or revoke — exactly who holds it.
Assignment is scope-aware, and the three scopes are real, separate ledgers. A grant can be school-wide (it applies everywhere), campus-scoped (the staff member holds the role only on a chosen campus, optionally with an allowance), or program-scoped (bound to a programme, carrying external credential numbers like an IB-coordinator or WAEC-centre code). On a multi-campus school the assign dialog offers a campus scope picker, so a vice-principal can be powerful on one campus and an ordinary teacher on another.
Chapter three
Many campuses, one school#
A school can be one site or a federation of many. The campuses surface at /dashboard/campuses lists each campus with its student and staff counts, exports to CSV, and — on a multi-campus school — carries the inter-campus mobility policy that governs how students move between sites. Open a campus to reach its own mini-world: an identity header, KPIs for students, staff, classes, and rooms, and a grid of room-cards that lead to its rooms, its attendance blocks, its campus-scoped roles, its per-campus settings, and its conduct — plus an inline announcement composer for that campus alone.
Campus-awareness runs deep: roles, finance, attendance, timetable, and reporting can all be scoped to a campus, so a campus manager sees and acts only within their own site while the proprietor still sees the whole school. Each campus can override its own bell schedule, attendance grace, fee scale, walk-in-admissions policy, and emergency contacts — and the campus role grants (campus principal, vice-principal, operations, admissions) make a manager powerful there and nowhere else.
Chapter four
The plan and what it includes#
The subscription screen at /dashboard/billing shows the school's current plan and status, its billing cycle and price, and — for a school still in its free trial — a countdown to the day it ends, turning urgent (the banner goes red) in the final three days. The features the plan unlocks are listed plainly.
The part schools actually need sits below: usage meters for students, staff, and campuses, each showing how much of the plan's ceiling is used, with a bar that warns from 80 % and badges when a limit is hit. A grid of available plans — Free Trial, Starter, Professional, Enterprise — shows what each tier costs and includes, with an upgrade/downgrade direction hint against the current plan. Changing plan and paying happens at /dashboard/upgrade, where a monthly/yearly toggle and a checkout dialog collect payment by card (Stripe) or mobile money (aggregators such as CinetPay, Campay, NotchPay, PawaPay).
Chapter five
Integrations and ID cards#
The integrations hub at /dashboard/integrations connects YESS to the outside services a school runs itself — grouped by category: communication (Zoom, Microsoft Teams), services (Google Maps), and AI (OpenAI). Each is a card you open to enter its keys, test the connection, and switch it on, with a connected count at the top.
One deliberate absence: online payment collection is not configured here. Each school's payment gateway and its encrypted keys are managed centrally by YESS, never entered on a school dashboard — and the integrations page makes that explicit with a note rather than leaving a confusing gap. (Messaging providers like SMS and WhatsApp are managed centrally too.) Schools share secure payment links from the finance module instead.
Finally, identity made physical: the ID-cards surface at /dashboard/id-cards has two tabs — branded ID cards and official documents. For cards, you choose the audience (students, staff, or parents), bulk-select, and print or export to PNG or PDF, with an issuance ledger that tracks how many of a cohort still need one. The card itself is designed in the versioned /dashboard/id-cards/studio — an interactive canvas for the logo, photo, matricule, and a scannable code. The Documents tab generates enrolment letters, attendance certificates, leaving certificates, fee-clearance, and staff letters from the same place.
What makes it elite
What makes the foundation elite#
Five things that hold the platform up
- 1
Tenant isolation in the database
Every row carries a school_id and every table enforces row-level security keyed to the signed-in user's school. One school can never read another's data — the guarantee is in the database, not the app code.
- 2
Hundreds of permissions, one matrix
Fifty-eight permission modules across eight actions, plus dozens of custom permissions, surfaced in a single grouped matrix. You shape exactly what each role can touch, and the rule is enforced on every query from every device.
- 3
Scope-aware roles
School-wide, campus-scoped, and program-scoped grants — three real ledgers — mean the same role can mean different reach in different parts of a federation, with allowances and external credentials attached where they belong.
- 4
Three languages, RTL, any currency
English, French, and Arabic with right-to-left layout, and money in the school's own currency, set once and inherited by every module.
- 5
A tenant provisioned in one call
Creating a school provisions its roles, grading scale, academic year and terms, languages, settings, and a thirty-day trial in a single database function — so the foundation is ready before anyone touches it.
Adjacent modules
What stands on the foundation#
Every module inherits the foundation. A few feel its reach most directly.
Adjacent modules
- 16Parent & student portalsPortal login methods, branding, and which portal surfaces are on are all set in school settings.
- 18HR & recruitmentStaff hold the roles defined here; campus-scoped grants decide a manager's reach.
- 20Finance, fees & accountingCurrency, the platform-managed payment gateway, and finance permissions all originate in the foundation.
Tutorial
Do it step by step#
Stand a new school up from a freshly provisioned tenant to one that's ready for staff and students. Seven steps, in the order you actually configure the foundation.
- 1
Set the school's identity
On the Profile tab of /dashboard/settings, enter the name, motto, and website, choose the currency and timezone, and pick the academic calendar. The name and currency fan out to every report, certificate, and money figure in the app.Choose the currency before you bill anything — every fee, payslip, and P&L line renders in it.
- 2
Brand it and choose languages
On the Branding tab, upload the logo and set the colour palette; on the Localization tab, switch on the languages the school speaks and enable right-to-left layout for Arabic. The whole app re-tints and re-localises to match. - 3
Shape the roles
Open /dashboard/roles. The provisioned system roles come pre-granted; tune their permission matrices to your school, and create custom roles where you need them. Grant the narrowest role that does the job.On the Assigned-users tab of each role you can assign or revoke holders in bulk — search, tick, assign.
- 4
Add your campuses
If the school spans more than one site, add each at /dashboard/campuses, then open a campus to set up its blocks, rooms, and its own settings — and set the inter-campus mobility policy that governs transfers. - 5
Assign campus-scoped roles
Back on /dashboard/roles, use the campus scope picker in the assign dialog to grant a role on one campus only — so a campus manager is powerful on their site and ordinary everywhere else. - 6
Watch the plan
Check /dashboard/billing for the trial countdown and the usage meters. When students, staff, or campuses near the ceiling, upgrade at /dashboard/upgrade by card or mobile money. - 7
Connect & issue identity
Switch on the outside services you use at /dashboard/integrations (payment collection is set up for you, centrally), then design a card in /dashboard/id-cards/studio and bulk-issue it from /dashboard/id-cards.
A tenant that knows who it is, who can touch what, and what it runs on — ready for every other module to stand on top of.