FAQ

General

Can one deployment run several schools? No, and that is deliberate. There is no school_id column anywhere. Run one deployment per school. The absence of a tenant column is what makes a leak between schools structurally impossible rather than a matter of remembering a WHERE clause on every query.

Can we change the terminology — "class" to "grade", "guardian" to "parent"? Yes. Every user-facing string goes through the translation layer, so you can retitle them without touching code.

Does SkoolyHub take a commission on fees? No. Payments go directly to your own gateway account. The system never holds funds.

Setup

Where do I start? Settings → School, then Academics → Academic Setup. Nothing else works until an academic year exists — timetables, fees, exams and enrolment all hang off it.

Do I have to run migrations after upgrading? No. Every table is created and altered by idempotent functions that run on first use. A fresh database and one several versions old converge on the same schema.

Why does every photo upload fail? Storage is not connected. Admin → Settings → Channels → Storage. Until then uploads return "Storage is not configured" — a setting, not a bug.

I connected storage but it still says not configured. Almost always: you have more than one database, and you configured the add-on on a different one than this deployment reads. Check the DATABASE_URL the running app is using.

Students and guardians

How do parents get their login? They do not receive one. The school creates the guardian record from the phone and email it already holds; the parent activates it themselves with a 6-digit code sent to that contact. Nobody at the school can see or set a parent's password.

A family has three children. Three logins? One. A guardian is linked to as many students as they have, and switches between them in the app.

Can I delete a student? Not one with fee history — receipts already in a parent's hands cannot be un-issued. Set their status to transferred or withdrawn instead.

What happens to last year's data when we promote? Nothing. The student moves to the new class and an enrolment row records where they were, so last year's attendance, invoices and results still resolve correctly.

Attendance

Does taking a register twice create duplicates? No, it overwrites — so a latecomer can be corrected minutes later.

Are parents notified of every absence? Of a day absence, yes, automatically. A per-period absence is not notified: that is a lesson matter rather than a safeguarding one.

Why is the attendance percentage higher than I expected? It divides by the days a register was actually recorded, not by calendar days. A day nobody took the register counts against nobody — the alternative would penalise a family for the office's paperwork.

Fees

How do we take payments online? Connect a gateway under Settings → Channels → Payments. Twenty ship as add-ons. Whatever you connect is what parents see.

We take fees at the office only. Connect nothing. The app then tells families to pay at the office, rather than showing a button that cannot work.

A parent says they paid but the invoice is unpaid. If they were sent to a payment page and closed it before finishing, nothing was charged and the invoice is correctly untouched — the ledger is only credited once the gateway confirms. Every attempt is recorded with its reference, so you can check what happened. If money genuinely left their account, that reference is what to give your gateway's support.

Can a parent underpay or overpay? They can pay less — part payments are allowed. They cannot pay more: the amount is computed server-side from the invoice, and the request cannot raise it.

Why can't this parent pay? Payment requires a verified guardian. They need to complete the code verification first, so money cannot move on a guessed password alone.

Exams

We published results and parents still can't see them. Two flags are required: the report card must be published and its exam's status must be published. This stops a half-marked exam leaking.

Can a teacher publish results? No. Teachers enter marks; the school publishes. That separation is why a partly-marked paper never reaches a parent.

Apps

Is there an app in the stores? The APIs are complete and documented; the apps themselves are a separate build. Point your developer at /api/docs/v1, which is generated from the code and so cannot drift.

Can a parent's login be used on a teacher endpoint? No. The token carries its role and a mismatch is rejected before any data is touched.

What does the parent app home screen show? One chronological feed — announcements, absences, homework set and marked, exam schedules, results, invoices, receipts, leave decisions and holidays. Each card opens its own screen.

Technical

Which database? PostgreSQL 14+. The Neon serverless driver is used over HTTP in production; any PostgreSQL works.

Where do integration credentials live? Encrypted in the database, not in environment variables — so they survive and travel with a database dump. The only required environment variables are DATABASE_URL and JWT_SECRET.

How do I add an endpoint? Add the route, then run npm run gen:openapi so the reference stays accurate.