← Work
02  ·  Product Engineering  ·  Live

PsTally.

A multi-tenant SaaS built on WordPress Multisite for managing gaming lounges — sessions, staff, shifts, credit, and daily operations, all in one place.

PsTally — Gaming Lounge Management

Gaming has always been one of my hobbies. At some point I decided to turn that into a business and opened a game lounge. It was my first business, and I went into it with very little experience on the operational side.

What started as something I enjoyed quickly turned chaotic. Constant disagreements with staff over shifts. Cash discrepancies at the end of every day. Customers underpaying for the time they had actually played. Small problems that kept piling up until managing the lounge started eating all the time that should have gone into running it.

I was spending most of my time resolving disputes instead of building a business. Something had to change.

Live numbers
882
Sessions tracked
129
Sessions per week
Ksh 96K
Revenue recorded
7
Shifts per week
Ksh 0–50
Typical close variance
4
Stations managed
Since March 2026  ·  7 weeks running  ·  avg 11.6-hour shifts

01  ·  Looking for a Solution

As a developer, my first instinct was to look for something that already existed. I searched for a POS system, a management tool, anything that could bring order to the business. I found nothing that truly addressed the problem — not even partially.

What I found instead was that most gaming lounges were running on notebooks. Handwritten tallies. End-of-night mental arithmetic. Many owners had simply accepted the chaos as part of the job.

They had not accepted it because there was a better way. They had accepted it because there was no other way.

That realisation changed the question. It was no longer about finding a tool. It was about whether I was the right person to build one.

02  ·  Building the First Version

The business was already running. I could not pause it to build a full system from the ground up over several months. So I started small and built a WordPress plugin for internal use — something that could manage sales, staff, shifts, and daily operations without disrupting what was already in motion.

That alone changed everything.

Shift disputes dropped to near-zero. The expected till figure was calculated before anyone started counting — no mental arithmetic, no guesswork, no accusations. Staff had the same number the owner had. When a discrepancy appeared, it was named and sized immediately, not discovered the next morning after the memory of the shift had faded.

The close variance settled to between Ksh 0 and Ksh 50 per shift — the natural tolerance of cash handling in an 11-hour day. Anything beyond that was now traceable to a specific session, a specific moment, a specific decision.

The first version did not ship a product. It shipped clarity — and clarity ended the arguments.

03  ·  From Personal Tool to Product

As I kept using the system, the same thought kept returning. If I had faced these challenges and solved them in a structured way, then other gaming lounge owners were going through the same thing. The notebook was not a Nairobi problem or a small-business problem. It was an industry-wide gap.

The question became how to turn what I had built for myself into something others could use. I did not want to rebuild everything from scratch. So I looked for a way to extend what already existed.

WordPress plugin — single lounge
WordPress Multisite network
Each lounge: isolated subsite
Shared codebase, separated data
New lounge: one activation
PsTally multi-tenant architecture
Multi-tenant architecture  ·  one codebase, isolated lounge environments

WordPress Multisite gave each lounge its own contained environment — its own data, its own staff, its own reports — while running on a unified platform. What started as a personal tool became the foundation of a scalable product without having to rebuild everything.

PsTally Admin Dashboard — total revenue, sessions, outstanding debts, console performance

owner dashboard  ·  revenue, sessions, debts, and console performance — one unified view

04  ·  Solving the Core Problem

At the centre of every gaming lounge dispute is the session. A customer sits down, games are played, time passes, and somewhere in that process the record breaks down — either between staff and the customer, or between staff and the owner when the shift does not add up at close.

PsTally handles both time-based and price-based gameplay. Every action within a session is timestamped at the exact moment it happens. Games added, payments taken, session opened, session closed — all of it is recorded automatically, not written down by hand.

Human flow System mirror
Customer sits down Session created · console locked to staff shift
Staff adds games Timestamp logged per game · amount accumulates
Customer pays Cash / MPesa / split recorded · debt captured if partial
Shift ends Expected till calculated from owned sessions only
Owner reviews Discrepancy named, sized · traceable to session level
PsTally session state machine
Session lifecycle  ·  every state system-controlled, not memory-dependent
PsTally active session screen — PS5 and Xbox bays with live timestamps and running totals

staff view  ·  active sessions across bays, timestamps locked at every game added

Session start and end times are controlled by the system, not by memory.

Everything that happens during a shift is tied to the staff member who opened it. At close, the system calculates what should be in the till based on every session and every sale during that shift. There is no mental arithmetic. There is no guesswork. There is a number — and then there is what was actually counted.

05  ·  The Shift Close

The shift close is the moment that used to cause the most conflict. Staff count the till at the end of the night. The owner expects a number. If they do not match, the evening ends in a dispute that no one can resolve because there is no reliable record to refer to.

With PsTally, the expected figure is calculated before anyone starts counting. Staff enter what they found. If it matches, the shift closes clean. If it does not, the discrepancy is immediate — named, sized, and recorded — not discovered the next morning.

The number is not an accusation. It is a reference point. That is all it needs to be.

PsTally shift close — expected cash vs counted, Balanced
staff view  ·  expected vs counted
PsTally shift management — owner reconciliation view with sessions, products, cash breakdown
owner view  ·  sessions + products + cash count

This protects staff as much as it protects the business. When the system produces the expected figure, the staff member is not being doubted — they are being given the same information the owner has. If there is a discrepancy, everyone knows at the same time, from the same source.

06  ·  Handling Real Customer Behaviour

Regular customers are valuable. And in this type of business, relationships matter. A customer who has been coming for two years might ask to play now and pay later. Refusing rigidly damages the relationship. Accepting without a record creates a debt that quietly disappears.

PsTally captures every unpaid balance at the moment the session closes — customer name, phone number, amount owed, date opened. When they come back and pay, the payment logs against the same record. The history is there without any extra effort.

PsTally partial payment — end session with partial payment option, customer name and phone captured
session close  ·  partial payment recorded
PsTally outstanding debts — customer balances with amounts owed and record payment action
outstanding debts  ·  nothing goes invisible
  • Debts approaching 30 days become visible again automatically
  • Balances past 60 days are flagged for follow-up
  • Full payment history on every customer balance
  • Nothing accumulates unnoticed

The goal is not to make credit difficult. It is to make sure nothing goes invisible. A lounge that knows exactly who owes what, and for how long, can have the right conversation at the right time.

07  ·  Beyond Game Time

Gaming lounges generate revenue beyond sessions. Drinks, snacks, merchandise — in my lounge, we sold football jerseys. This revenue exists alongside game time every day, but most systems either ignore it or track it separately, forcing the owner to piece together the full picture at the end of the day.

In PsTally, products are treated the same way as sessions. Set them up once with pricing and optional stock tracking. Staff record a sale the same way they open a session — within the same workflow, no switching between screens. Stock updates automatically if enabled.

At the end of the day, the owner sees one number. Gaming revenue and product sales, unified.

Everything feeds into the shift reconciliation. The expected till figure includes product sales. Nothing is left outside the calculation.

08  ·  Staying Updated Without Logging In

Gaming lounges close late. Owners are not always there, and logging into a dashboard at midnight to check how the day went is not a realistic expectation. I experienced this personally — the business ran late, I needed visibility, but I also needed to sleep.

At the close of each shift, staff can send a summary directly to the owner’s WhatsApp. Not a notification that a report is ready. The report itself — sales figures, cash reconciliation result, any discrepancies — in plain language, on the owner’s phone, before anyone has to ask.

The owner knows how the day went before the lights go off.

Resolution

The result was simple but significant. The arguments stopped. The confusion reduced. I finally felt in control of a business I had started with the intention of enjoying.

PsTally is not about surveillance or adding complexity. It is about removing uncertainty from a business type that has historically operated without the tools to do so. Every session tracked, every shift closed cleanly, every credit balance visible — these are not features. They are the conditions under which a gaming lounge can actually be run rather than just managed.

Building it taught me something I still think about. Just as people adapt to their environment, systems must evolve based on how they are used. PsTally started as a survival tool. It grew into a platform. It continues to evolve. But its purpose has not changed — to give lounge owners the clarity they need to run their business instead of being run by it.

The lounge needed clarity, not surveillance. That is still what PsTally delivers.

Key Decisions

Three architectural choices that shaped how the system thinks.

Decision 01
Session ownership at the data layer, not the UI layer

Each session is tied to the shift that opened it at the database level. When a staff member ends their shift, the system calculates the expected till only from sessions they personally owned. No amount of client-side manipulation can expose another staff member’s sessions or pull them into the wrong reconciliation.

This came from a real incident where two staff members were logged in simultaneously and sessions were bleeding across shifts, creating discrepancies that neither person had caused. The fix was not a UI patch — it was enforcing ownership where it cannot be bypassed.

Rejected: hiding other staff’s sessions in the frontend only
Decision 02
Per-game as the primary pricing model

98% of the 882 sessions tracked so far are per-game, not time-based. That ratio did not come from a product decision — it came from watching how customers in this lounge actually think. They ask for two games, not twenty minutes. A time-based system would have introduced a mental model that did not match how transactions were already happening, creating friction at the point of payment.

The software modelled the customer’s mental model, not an imported one.

Rejected: time-based as default with per-game as secondary
Decision 03
Discrepancy visibility over false accuracy

The system does not smooth over gaps. Every shift closes with an exact figure: what was expected, what was counted, and the difference. The target is Ksh 0–50 — the natural tolerance of cash handling across an 11-hour shift. Anything beyond that triggers a session-level audit trail.

A system that rounds to zero would feel cleaner but would hide the information that matters. Visibility is the product. The number is not an accusation — it is the beginning of an honest conversation.

Rejected: rounding small discrepancies to show clean reconciliation
Built with
WordPress Multisite PHP MySQL Custom Plugin Vanilla JS Multi-tenant
Live site → Try demo →
In Progress
Full log →
May 15
Migrated PsTally to pstally.com — database moved, DNS cutover with no downtime. Demo lounge, existing sessions, and the nightly seeder cron all intact at the permanent domain. The app is at its address.
May 14, 2026
Closed the monitoring loop — desktop app, cloud layer, and owner dashboard tested on live hardware. Console state hits the dashboard within seconds. Ghost alerts fire on long unlogged sessions. The system watches without being watched.
May 13, 2026
Built a Windows desktop app that runs in the background on the lounge PC and feeds console state to the monitoring system automatically. Staff do not manage it — it stays quiet and keeps the system aware.
May 12, 2026
Launched pstally.com/controller-test — a browser-based diagnostic for PS5, PS4, and Xbox controllers. Every input maps live: trigger pressure, stick range, deadzone drift. Verify a controller works before it reaches a customer.
May 11, 2026
Hardened the super admin — lounge status controls added alongside impersonation and cross-lounge revenue. Admins can suspend a lounge, step into any owner account, and see aggregated revenue without switching between accounts.
May 9, 2026
Completed the onboarding wizard — new owners run through 4 steps before the dashboard opens: lounge name, consoles, game types, and staff PINs. A setupComplete flag gates the experience. First impressions are now deliberate.
May 8, 2026
Built the admin organizer panel — create tournament organizer accounts, view per-organizer stats (tournaments, players, prize totals), and toggle access. The tournament system now has a dedicated admin surface alongside the lounge panel.
May 7, 2026
Completed the tournament day surface — staff panel cycles through check-in, live bracket scoring, and close. Console cards get a violet tournament state. Owner gets a read-only auto-refreshing bracket view. Full system is live on app.tempforest.com.
May 6, 2026
Built the organizer panel — create tournament, view live registrations, confirm M-Pesa payments, close registration and generate bracket. Public registration page has a live slot counter and M-Pesa code entry, no redirect on confirm.
May 5, 2026
Scaffolded the tournament system — 4 DB tables, a bracket engine covering knockout, groups+knockout, and league formats, and a full tRPC router. Tournament organizers get their own auth surface, separate from lounge owners.
May 4, 2026
Launched the marketing site with landing page, pricing calculator, and public register flow. Added a super admin panel for cross-lounge oversight — lounge creation, revenue aggregation, and owner impersonation.
May 3, 2026
Seeded a live demo lounge with realistic session data — 7 days of shifts, cashouts, and expenses rebuilt daily at midnight. Any visitor can walk through the full owner experience without signing up.
May 2, 2026
Added PWA support — installable on Android and iOS from the browser with a custom manifest and icon set. First-time owners now go through a 4-step setup wizard: lounge name, consoles, game types, then staff PINs.
May 1, 2026
Built the analytics dashboard — revenue trend over 7 and 30 days, peak-hour heatmap, and a breakdown by console, game type, and payment method. Numbers that used to live in mental notes now have charts.
Apr 30, 2026
Connected the monitoring script to the new Next.js endpoint. Both WordPress and Next.js receive events during migration — lounges move one at a time.
Apr 20, 2026
Scaffolded the rebuild — Next.js 15, TypeScript, PostgreSQL, Drizzle ORM, tRPC. Moved off WordPress. Staff PIN auth and core DB schema in place.
Apr 18, 2026
Built the owner dashboard — revenue stats, 7-day trend, console performance, staff leaderboard. AI chat bubble for querying numbers in plain language.
Apr 15, 2026
Wired up smart monitoring — PS5 state detection via UDP port 9302, ghost alerts when a console runs too long without a logged session, heartbeat every 5 minutes.
Feb 25, 2026
Built the staff dashboard — console cards, session logging, shift management, lock screen. Session starts in three taps, shift closes with automatic cash reconciliation.

If this way of building resonates —

No brief required · Tell me what you’re trying to make

What came next

The platform that ended the arguments was rebuilt from the ground up — with the GTM layer engineered in.

PsTally Rebuilt →