SSocietyHub Pro

SocietyHub Pro

Membership, dues, giving, messaging, and reporting — all in one place. A production-ready membership/society management platform built with Laravel, Inertia.js, React, and MySQL — designed to install and deploy cleanly on shared hosting (cPanel/Hostinger) as well as a VPS.

Status: v1.0.0

Features

  • Installation Wizard — guided web-based setup (/install): requirements check, database connection/creation, organization + administrator setup, migrations — no SSH required. Self-locks once complete.
  • Authentication — email/password + optional Google OAuth, role-based access (Member/Administrator), Cloudflare Turnstile or reCAPTCHA bot protection, password reset, and optional TOTP two-factor authentication (QR enrollment, recovery codes, "remember this device")
  • Member Portal — dashboard, notifications, messaging (member↔admin and member↔member, with file attachments and voice notes), payments, digital membership card, profile
  • Admin Portal — members, dues, donation campaigns, transactions, notifications, messaging inbox, reports, roles & permissions, audit logs, settings, system status, global search
  • Payments — live Paystack and PayPal integration (webhook-verified, never trusts client input), branded receipts, public payment-status page
  • Messaging — grouped-bubble chat with attachments (documents/images/spreadsheets/archives/audio), voice note recording, message deletion, access strictly scoped to conversation participants
  • Reporting & Exports — 7 report types with CSV/Excel export; Members/Transactions/Campaigns/Settings also export to CSV/Excel; Settings additionally supports full JSON export/import/backup/restore
  • Email & SMS — branded transactional email via any SMTP provider (configured live from Settings — no redeploy needed), SMS via Hubtel/Arkesel/Twilio (admin-selectable, all optional)
  • Automation — configurable reminder engine (upcoming/overdue dues, renewals, campaign endings, birthday greetings), runnable either via Laravel's own scheduler (php artisan reminders:send) or an external cron hitting a protected endpoint — whichever your host supports
  • PWA — installable, offline fallback page, generated app icons/shortcuts, update notifications
  • System Health Center — live health checks across 18 integrations/modules, 30-day uptime history, configuration warnings, log viewer, diagnostics export (Admin → Status)
  • Deployment Center — a go-live readiness checklist (storage symlink, .env sanity, database/mail/queue/cache, scheduler wiring, filesystem permissions, pending migrations) with fix instructions per item, plus an on-demand "Optimize Application" action (config/route/view/event caching)
  • Backup & Restore — on-demand or scheduled Database/Uploads/Complete backups, download/restore/delete, all audit-logged
  • Security Center — login history, failed-attempt tracking with repeated-failure alerts, active sessions (force-logout support), trusted devices, IP allow/blocklist, password policy summary
  • Licensing — adapter-based (Development Mode by default, no key required; KMD Hub adapter ready to activate once published), with activation history
  • Update Center — installed/latest version display, changelog, update history
  • White Label — organization branding, logo/favicon/navbar/email logos, login page branding, browser tab title, company name, slogan, live preview, and a togglable "Provided by" attribution
  • Public Website — public campaign donation pages, no account required
  • Public Verification — membership card and receipt QR codes resolve to a public, no-login verification page

Stack

Laravel 12 · Inertia.js v2 · React 19 · TypeScript · Tailwind CSS v4 · MySQL/MariaDB · Eloquent · session-based auth · Zod · React Hook Form · TanStack Query · shadcn/ui-derived components (Base UI)

Getting started

Production / a real deployment: upload the app, point your domain at public/, and visit it — the Installation Wizard (/install) walks through requirements, database, organization, and administrator setup with no SSH access needed. See docs/DEPLOYMENT.md.

Local development: see docs/INSTALLATION.md for the full walkthrough. Quick version:

composer install
npm install
cp .env.example .env
php artisan key:generate
# create a MySQL database and set DB_* in .env
php artisan migrate --seed
npm run build
php artisan serve

Open http://localhost:8000. --seed here also runs DatabaseSeeder's demo data (fake members/campaigns/transactions) for local development — this is dev-only and is never run by the Installation Wizard, so a real production install starts with an empty database and only the administrator account you create in the wizard.

Demo accounts (local dev seed only — never present after a real install)

RoleEmailPassword
Memberkwame.owusu@gmail.comMember@123
Administratorselina.a@civicasociety.orgAdmin@123

Documentation

Environment variables

Required: APP_KEY, APP_URL, DB_* (connection to your MySQL/MariaDB database).

Everything else (payment gateways, Google OAuth, SMTP, SMS providers, CAPTCHA, branding) is configured from Admin → Settings, stored in the database, and rotatable without touching the server. The remaining env vars are infrastructure-level and optional:

  • CRON_SECRET — required only if you trigger automated reminders/backups via the POST /cron/reminders or POST /cron/backup endpoints instead of Laravel's own scheduler
  • FILESYSTEM_DISK — defaults to local; media/avatars are served from storage/app/public via the storage:link symlink
  • LICENSE_DRIVER, LICENSE_VALIDATION_INTERVAL_HOURS, LICENSE_GRACE_PERIOD_DAYS, KMD_HUB_BASE_URL, KMD_HUB_TIMEOUT — see docs/ADMINISTRATOR_GUIDE.md#licensing; the shipped defaults need no changes until KMD Hub's API is published

See docs/CONFIGURATION.md for what's env-var-based vs. Settings-based and why.

Scripts

  • php artisan serve — local dev server
  • npm run dev — Vite dev server with HMR (run alongside php artisan serve)
  • npm run build — production frontend build
  • php artisan migrate / php artisan migrate:fresh --seed — apply migrations / reset + reseed demo data
  • php artisan reminders:send — run the automation/reminder engine once (also schedulable via routes/console.php)
  • php artisan backup:run — run the scheduled-backup check once (no-ops unless a backup is actually due)
  • php artisan test — run the test suite

Project structure

app/Console/Commands/    Scheduled/manual artisan commands (RunScheduledBackup, ...)
app/Enums/                PHP backed enums shared between DB columns and app logic
app/Exports/              Maatwebsite\Excel export classes (Members, Transactions, ...)
app/Http/Controllers/     Member controllers (root), Admin\* controllers, Auth\*, public controllers
app/Http/Middleware/      HandleInertiaRequests (shared props), EnsureRole, ...
app/Http/Requests/        Form request validation, grouped by feature (Admin/, Auth/, ...)
app/Jobs/                 (none — everything runs synchronously; QUEUE_CONNECTION=sync by default)
app/Mail/                 Mailable classes (BrandedEmail)
app/Models/               Eloquent models (ULID primary keys, #[Fillable]/#[Hidden] attributes)
app/Providers/            Service providers (AppServiceProvider, LicenseServiceProvider)
app/Services/             Business logic — MessagingService, PaymentService, HealthCheckService,
                       DeploymentService, Security/, License/, Backup/, PaymentGateways/, ...
config/                   Laravel config + permissions-catalog.php (the RBAC source of truth)
database/migrations/      One file per schema change, numbered sequentially
database/seeders/         PermissionCatalogSeeder (production-safe) vs DatabaseSeeder (dev-only demo data)
docs/                     Deployment, configuration, and integration guides (this folder)
resources/js/Layouts/     Page shells — AuthLayout, MemberLayout, AdminLayout, PublicLayout
resources/js/Pages/       Inertia pages, mirrored Admin/*, Public/*, Auth/* structure
resources/js/components/  ui/ (design system), layout/, dashboard/, messaging/, system/, content/, ...
routes/                   web.php + per-feature route files (member/, admin/, public.php, webhooks.php, ...)

License

Proprietary — see LICENSE.