Security & Data Protection
How we protect your school's data
Last changed: 28 September 2026
Sajama Campus uses role-based access, school-scoped APIs and database policies to protect school records. These controls require correct deployment and ongoing review; this page is not a security or legal certification.
Encryption
- In transit: Production connections should use HTTPS for pages, API calls and uploads. Hosting and proxy configuration must preserve it.
- At rest: Production database storage relies on the managed provider’s encryption controls. Backups and exported files require appropriate protection too.
- Passwords: Production sign-in uses Supabase Auth. Invitation and reset tokens are hashed before storage; invitation emails do not contain account passwords.
- Sensitive fields: Access is controlled by role and school. Not every record field has separate application-level encryption.
Authentication & Access Control
- Multi-layer auth: JWT validated against Supabase (not trusted from cookies alone). Role checked from database on every request.
- Role-based access: Five roles (platform operator, school admin, teacher, student and parent) have different permissions. Users can only see data their role permits.
- School isolation: School administrators are scoped to their own school; students and parents are scoped to their own or linked records. Authorized platform operators can review multiple schools.
- Invite-based accounts: Teachers and students receive cryptographically secure invite links (bcrypt-hashed, 24-hour expiry) to set their own passwords.
- Rate limiting: Login, password reset, and OTP endpoints are rate-limited (IP + account level) with escalating lockouts to prevent brute-force attacks.
Infrastructure
- Hosting: Production records are hosted through Supabase. A provider’s certifications do not certify this application or a school’s practices.
- Row Level Security: Policies constrain direct client access. Privileged server queries bypass RLS, so server routes separately check identity, role and school scope.
- Security headers: CSP, HSTS, X-Frame-Options, X-Content-Type-Options, and more, all set on every response.
- No caching of personal data: All portal pages set Cache-Control: no-store to prevent data leaking through shared browsers or proxies.
Payment Security
- PCI DSS Level 1: All payments processed by Paystack. Sajama Campus never touches card numbers.
- Webhook verification: Paystack webhooks verified with HMAC-SHA512 and timing-safe comparison.
- Idempotent fulfillment: Payment effects applied exactly once, even if webhooks and verify callbacks both fire.
- Server-side pricing: Prices are fixed in server code. Clients cannot modify amounts.
Monitoring & Audit
- Audit logs: Recorded operations include action, actor and timestamp where available. The console displays stored events, not an assumed complete history.
- Login tracking: Authentication events may include IP and user-agent information for security investigations, separate from optional aggregate analytics.
- Request logging: Application/security logs support investigation. Recorded database probes show sampled reachability, not an independent uptime SLA.
Compliance
- Ghana Data Protection Act, 2012 (Act 843): Schools and Sajama must establish lawful processing, appropriate notices and applicable registration/documentation. Review records are evidence tracking, not a declaration that every legal obligation is satisfied. See our Privacy Policy.
- PCI DSS: Payment processing delegated to Paystack (PCI DSS Level 1). We never store card data.
- Data retention: Optional aggregate analytics and health samples have a 90-day retention policy enforced by the configured cleanup job. School and financial records follow separate retention obligations.
Report a Security Issue
If you discover a security vulnerability, please report it responsibly to security@sajamacampus.com. We take all reports seriously and will respond within 48 hours.
