Open to new projects
Work / For an organisation / HR & Payroll Platform
Case study · For an organisation

HR & Payroll Platform.

Payroll, leave and attendance for many businesses in one system, calculated the Kenyan way.

RoleLead Backend Engineer & AI, in a team
ForKenyan employers · Amsol Africa clients
TimelineAug 2025 – ongoing
StackLaravel, MySQL, Reverb, Cloudflare
StatusLive · login required
HR & Payroll Platform HR & Payroll Platform on a phone
200+employees on payroll
100feature test files
129data models
250commits by the team
The problem

Kenyan employers run payroll, leave and attendance across spreadsheets and separate tools. Statutory deductions (PAYE, NSSF, SHIF and the Housing Levy) change often and are easy to get wrong.

Amsol needed one platform it could run for many client businesses, each with its own structure, modules and people.

What I built

One platform, many businesses, each shaped its own way.

A multi-company HR and payroll platform. Each client business gets its own modules, roles and reporting lines, and employees get a self-service portal.

  • PayrollPAYE, NSSF, SHIF and Housing Levy, loans, advances and payslips.
  • LeavePolicies, accruals, encashment and approval routing that follows the organogram.
  • AttendanceRosters, shifts and clock-ins pushed from biometric devices.
  • RecruitmentJob posts, applicants and interviews.
  • PerformanceOKRs and 360 feedback.
  • Self-serviceEmployees see payslips, leave, assets and learning in their own portal.
Modules switched on per business
Modules switched on per business
Set up once, then it runs on your organisation's shape
Set up once, then it runs on your organisation's shape
Architecture

Every query is scoped to a business.

Business-scoping middleware and module gating keep each client's data and features separate. Biometric devices push clock-ins straight to the platform.

Key decisions

Choices that made it hold up.

  • Scope every query to a business

    Middleware attaches the current business to every request, so one client can never see another's data.Why: many businesses share one platform

  • Build a custom role builder

    Clients create their own roles instead of choosing from a fixed list.Why: every organisation's structure is different

  • Accept biometric pushes directly

    Devices post attendance straight to an endpoint, instead of someone exporting files.Why: manual exports were late and error-prone

  • Let support impersonate safely

    Admins can view the system as a client, with every action recorded.Why: faster support without sharing passwords

Across the lifecycle

What each stage looked like on this project.

  • 01IdeaReplace spreadsheets and separate tools for Amsol's client businesses.
  • 02DesignMulti-company data model with modules switched on per business.
  • 03BuildLaravel with services for payroll and entitlements, 210 migrations.
  • 04Test100 feature test files on money, access and data scoping.
  • 05DeployBehind Cloudflare, with environment-based configuration.
  • 06SecureTwo-factor login, banned-IP checks, throttled logins and a full audit log.
  • 07ScaleOne codebase serving many businesses.
  • 08Maintain250 commits of ongoing work across the team.
Evidence

Tested where mistakes cost the most.

CheckWhat it doesResult
Tenant isolationEach business only ever sees its own employeesFeature tests
Payroll rulesEntitlements and statutory formulasFeature tests
AccessCustom roles, impersonation, portal accessFeature tests
AttendanceBiometric device clock-ins land on the right personFeature tests
Gallery
Homepage
Homepage
Modules switched on per business
Modules switched on per business
Set up once, then it runs on your organisation's shape
Set up once, then it runs on your organisation's shape
On a phone
On a phone
What's next

More countries and currencies on the same payroll engine.

Contact

Have an idea or a system to build?

Tell me what you need. I'll reply within a day with questions, a rough approach, or a time to talk.

Phone+254745600377
Based inNairobi, Kenya · working worldwide
What do you need?