The hum of servers in a South African data center forms the unseen backbone of a new tool designed to bring order to freelance chaos.
Look, building software that actually works for real people is hard. And when you’re talking about a platform that needs to handle multiple users within a single company, manage sensitive financial data, and integrate with payment gateways? That’s not just coding; that’s architectural gymnastics. TracKeee, a new invoicing application for South African freelancers and small agencies, is exactly this kind of ambitious undertaking, and its creator is sharing the journey—the triumphs and the humbling lessons learned along the way.
From Single User to Org-Wide
At its heart, TracKeee is an invoicing app, a seemingly simple concept. But the devil, as always, is in the details—especially when you’re aiming for strong, scalable multi-tenancy. The initial build? Streamlined, focusing on the individual freelancer. Each user had their own clients, their own projects, their own invoices. A straightforward, single-tenant model.
But the vision expanded. The creator quickly realized that a small agency isn’t just one person; it’s a team. An owner, an accountant, project managers—all needing to collaborate within the same system, but with different levels of access. This is where the real work began: refactoring the entire data model. Not a small tweak. We’re talking about shifting from a user-centric design to an organization-centric one. Every table, every relationship, every query had to be re-examined and rebuilt. It’s the kind of foundational change that bites hard if you don’t plan for it from the outset.
Permissions: The Gatekeepers of Data
Permissions are the bedrock of multi-tenant applications. Who can see what? Who can do what? TracKeee’s approach to managing this is elegantly simple, yet profoundly effective. Instead of scattering role checks throughout the codebase, a single, centralized method acts as the gatekeeper.
Every controller and view calls this one method.
This method, HasPermission, takes the user’s role and the desired action and returns a clear yes or no. It’s a beautifully contained solution. Think of it like a master key system for your entire application. Need to add a new permission? Update one file. Need to add a new role? Again, one file. The code snippet itself illustrates this clarity:
public bool HasPermission(OrganizationRole role, string action)
{
return action switch
{
"ManageClients" => role == OrganizationRole.Owner
|| role == OrganizationRole.Admin
|| role == OrganizationRole.Manager,
"ViewFinancials" => role == OrganizationRole.Owner
|| role == OrganizationRole.Admin
|| role == OrganizationRole.Accountant,
"Delete" => role == OrganizationRole.Owner,
_ => false
};
}
What’s particularly insightful here is the evolution from a more lenient role != Employee check to explicit positive affirmations. This isn’t just about code style; it’s about security. The former would silently grant permissions to newly introduced roles, a potential nightmare. The latter ensures that only explicitly granted roles have access—a crucial safeguard.
Features Powering South African Businesses
TracKeee isn’t just about foundational architecture; it’s packed with features tailored for its target market. This isn’t your generic invoicing tool.
- Local Nuances: It handles South African VAT (a hefty 15%) and operates in ZAR. This local focus is critical for adoption.
- Payment Integration: Direct integration with Yoco, a popular payment gateway in South Africa, means freelancers can smoothly accept payments, with each user connecting their own Yoco account.
- Compliance: POPIA (Protection of Personal Information Act) compliance is woven in, addressing privacy concerns from the ground up.
- Core Functionality: Beyond the essentials like client and project management, it boasts a live start/stop timer, invoice generation from time entries (with VAT applied), branded PDF invoices, direct email invoicing, and a dashboard visualizing key metrics like monthly hours and revenue by client.
- User Experience: Search and filtering across all list pages, alongside five distinct team roles with permission-based UI elements, contribute to a more efficient user experience.
The Road Ahead
What’s next for TracKeee? The roadmap includes a client portal, CSV/Excel exports, and an activity log. There’s also a plan to move away from Bootstrap towards a custom UI—a significant undertaking that promises a more unique and potentially more performant user experience.
Building a SaaS like TracKeee is a monumental task, especially when you’re grafting on complex features like multi-tenancy and strong permission systems. But the transparency in sharing these architectural decisions and learnings is exactly what the open-source community—and indeed, the broader software development world—needs. It’s a proof to the power of iterative development and the willingness to tackle complexity head-on.
🧬 Related Insights
- Read more: Linux’s Hidden Binary Ballet: ELF Parsing, Dynamic Linking, and Runtime Surprises
- Read more: Inner Source: Applying Open Source Practices Inside Your Company
Frequently Asked Questions
What is TracKeee? TracKeee is a new invoicing SaaS application designed specifically for South African freelancers and small agencies. It aims to provide strong features like multi-tenancy, role-based permissions, and local payment integrations.
What technologies are being used to build TracKeee? The project is built using ASP.NET Core MVC (.NET 8) for the backend, Azure SQL with Entity Framework Core for the database, and is hosted on Azure App Service.
How does TracKeee handle payments? It integrates with the Yoco Checkout API, allowing freelancers to connect their own Yoco accounts for secure payment processing.