Nairobi · SACCO Banking · In Delivery

Banking reports,
delivered through a tunnel.

A Kenyan SACCO on Apache Fineract needed a template-driven report portal that could reach a locked-down core banking database over SSH and email out password-protected PDFs, CSVs, and Excel files to thousands of members — without ever exposing the DB to the public internet.

SSH
Tunneled MySQL access
3
Output formats · PDF · CSV · XLSX
AES
Password-protected outputs
Queue
Redis-backed with retries

A Kenyan SACCO — savings and credit co-operative — runs their member accounts on Apache Fineract / Mifos X. The platform is capable, but its native reporting is inflexible: templates ship as XML, they're painful to author, and the output options are limited. Meanwhile, members expect monthly savings statements, loan schedules, and portfolio reports in a form they can read on a phone or print at a shop.

The blocker: the core banking database cannot be exposed to the public internet. That's non-negotiable for the SACCO's regulator, and it should be. Any report tool has to reach the DB through a tunnel, on demand, without leaving the door open.

The team needed:

An admin panel to define reports as templates (SQL + a few conventions). An operator panel to run them — one-off for a single member, or in bulk against a member list. Sensitive-data masking on outputs. Password-protected files. Queued email delivery so a bulk run doesn't block the app. And a full audit trail — who ran what, when, and against which member.

A Laravel engine with a template-driven report generator. Templates are SQL with a couple of Laravel conventions on top. The conventions matter — they're what make the template library maintainable as it grows.

Underscore-prefixed SQL aliases mark header-only variables that don't render as data columns — the template author doesn't have to fight the renderer. FORMAT(value, 2) is the enforced pattern for monetary columns so nothing prints with three decimals or missing thousands separators.

An SSH tunnel service establishes the connection to Fineract's MySQL. The tunnel opens only when a report needs to run, closes when done. The DB stays private; the portal reaches it on demand.

Queued PDF, CSV, and Excel generation via Redis. dompdf for the PDF layer, PhpSpreadsheet for XLSX. Outputs are password-protected on write — the password format is documented and predictable so members can open their own statements without a support call.

Resend handles email delivery. Bulk runs queue up as individual jobs so a single failure doesn't tank the batch. Failed jobs retry with backoff. Every generated file, every email sent, every failed job is logged.

Two panels: admin defines templates, operator runs them. Full audit trail per member per template per run.

What we built it with.

Application
Laravel 10
Queue system, migrations, and Blade for admin/operator UI in one framework.
PHP 8.3
Modern language features and performance.
Blade
Server-rendered admin and operator panels — no SPA overhead needed.
Data & Access
MySQL (Fineract)
The core banking DB. Read-only access from the portal.
SSH Tunnel
On-demand connection to the private Fineract DB. Never publicly exposed.
Redis
Queue backend for report generation and email delivery.
Rendering & Delivery
dompdf
PDF rendering with password protection support.
PhpSpreadsheet
XLSX generation with formatting preserved.
Resend
Transactional email — per-member delivery with retries.

The intelligence layer.

Claude Sonnet 4.6
Development pair — SQL template design, SSH tunnel service, queue architecture, audit logging

From brief to production.

Phase 1 SSH Tunnel + Template Engine
Laravel scaffold, SSH tunnel service, first templates rendered against live Fineract data.
Phase 2 Savings Statement
First production template live — monthly savings statement as password-protected PDF.
Phase 3 Loan Schedule
Second template shipped — loan schedule with XLSX output for the finance team.
Phase 4 Bulk + Queues
Bulk-run against member lists, Redis queue with retry logic, Resend delivery.
In Delivery PostgreSQL + Remaining Templates
PostgreSQL adapter and the remaining three of five templates in delivery.

What shipped.

2 of 5
Templates live
Savings statement and loan schedule rendering against real Fineract data.
Private DB
Never publicly exposed
SSH-tunneled access only. Portal reaches Fineract on demand; the DB stays behind the firewall.
Auditable
Full run history
Every generated file, every email sent, every failed job logged. Regulator-ready.
Bulk-ready
Redis-queued
Bulk runs against member lists queue as individual jobs. Failures retry, batch never blocks.
"
The core banking DB never touches the internet. We define new templates ourselves — no ticket to the developers. Members get their statements on time, every month, without anyone in the office running scripts.
S
SACCO Operations
Kenyan Credit Union

Building something similar?

If your problem lives at the intersection of AI, product, and real business constraints, let's talk.

Trusted Worldwide — Long-Term Partnerships Built on Trust and Results

Take it from leading businesses around the world. Time and time again, our clients experience the quality, speed, and reliability of our AI solutions and automation services, leading to long-term partnerships with AXCEL.

Ready to Automate and Scale Your Business?

We design and deploy AI solutions that streamline operations and accelerate growth.

WhatsApp