F

Finlo

B2B
live

Multi-tenant parking and transport SaaS with a stats engine.

Full-stack engineer2023 – 2025Core of a small teamAuribises TechnologiesOperations SaaS
Angular 14
Firebase
TypeScript
Client product. Source is private.

Overview

A management platform for a fleet of parking and transport sites, where every site is set up differently. I built the analytics and dashboard layer that had to adapt to each site's own configuration.

I built the admin-side stats and dashboard engine and the exports. The events and donations expansion in the cloud-functions backend was mostly teammates' work.

How it works

1

Per-site config

Which revenue streams are on

2

Daily records

Keyed by category, operator, mode

3

Fold and total

Walk each record, sum by config

4

Dashboard + export

Charts, Excel, PDF

Each site is configured differently, so the dashboard reads its config to decide what to show, then folds the day's records into the totals.

Engineering challenges

01A dashboard when every site is set up differently

Problem. Each site turns on a different mix of revenue streams (parking, penalties, tickets, bus, billing) and payment methods, and some ran different app versions. So both which numbers exist and how the raw records add up changed from site to site. There was no single fixed shape to total against.

Approach. I drove the dashboard off each site's own configuration. It builds its list of stat sections from the site's flags and only shows what that site actually uses, including handling the older app version's differences. For the totals, the daily records have keys that aren't known ahead of time (per vehicle category, per operator, per payment mode, per stop), so the code walks each record, works out whether it's a single number or a bucket of more numbers, and folds it up, turning ids into names along the way.

Outcome. One dashboard codebase covered every kind of site without a separate build per client, and the same engine handled a second record shape for events.

02Making the money numbers trustworthy

Problem. A finance dashboard that's slightly wrong is worse than none, and operators needed exports shaped differently per client. Early on the totals didn't always reconcile, including a bug that double-counted some amounts.

Approach. I chased the reconciliation issues back to their source so the totals matched the underlying records, and built the exports for Excel and PDF with a configurable option and per-client templates rather than hard-coding each one.

Outcome. Operators could pull correct, client-shaped reports themselves without an engineer in the loop every time.

What I'd do differently

  • The aggregation lists out every metric by hand, with the same fields repeated several times. I'd drive it off a single list of metrics so adding one is a one-line change instead of four.
  • It all runs in the browser. For the larger sites I'd move the heavy aggregation server-side or precompute it.