ACU Enterprise Suite — Building a Multi-Country ERP from Scratch
The Inspiration
I've always believed that small and medium-sized businesses operating across multiple countries deserve the same powerful tools that large enterprises use — without the six-figure price tags of SAP or Oracle. This belief became the foundation of ACU Enterprise Suite.
As someone with a background spanning Turkey, Switzerland, and broader Europe, I witnessed firsthand how businesses struggle when they expand across borders. Different tax systems, different languages, different currencies — and no affordable software that handles all of it seamlessly. That gap became my mission.
What I Built
ACU Enterprise Suite is a production-ready, multi-tenant SaaS ERP platform supporting 8 countries and 5 languages, built entirely with modern web technologies:
- Frontend: React 18 + Vite + TailwindCSS
- Backend: Supabase (PostgreSQL + Auth + Storage)
- Hosting: Vercel (global CDN)
- Languages: Turkish, English, German, Italian, French
The platform covers 12+ integrated modules:
| Module | Description |
|---|---|
| Finance & Accounting | Invoices, VAT, 8 currencies |
| Human Resources | Personnel, leave, documents |
| Payroll | Auto tax brackets, social security |
| Attendance | Daily tracking, payroll integration |
| CRM | Customer management, auto-coding |
| Stock & Purchasing | Inventory, orders, critical alerts |
| Tourism | Reservations, tours, hotels, guests |
| Education | Students, courses, grades, fees |
| Transfer | Inter-company employee transfer |
| Reports | CSV export/import, 9 report types |
| Roles & Permissions | Module-level permission matrix |
| AI Assistant | Real-time answers from system data |
Country Support
Each country has its own tax brackets, VAT rules, and social security rates hardcoded into the system:
| Country | Currency | VAT | Social Security |
|---|---|---|---|
| 🇹🇷 Turkey | TRY | 20/10/1% | SGK |
| 🇩🇪 Germany | EUR | 19/7% | RV+KV |
| 🇨🇭 Switzerland | CHF | 8.1% | AHV+ALV |
| 🇮🇹 Italy | EUR | 22/10% | INPS |
| 🇬🇧 UK | GBP | 20% | NI+PAYE |
| 🇺🇸 USA | USD | Sales Tax | SS+Medicare |
| 🇫🇷 France | EUR | 20% | Sécu+CSG |
| 🇧🇪 Belgium | EUR | 21% | ONSS |
The payroll module automatically calculates:
$$\text{Net Salary} = \text{Gross} - T(\text{Gross}) - SS(\text{Gross}) - \text{Other Deductions}$$
Where $T(\text{Gross})$ is computed using progressive tax brackets specific to each country.
How I Built It
The entire system was built iteratively over several months, module by module. I started with the core architecture — multi-tenant data isolation, authentication, and role-based permissions — before building individual modules on top.
Architecture Decisions
Multi-tenancy: Every table has a company_id column. All queries filter by the authenticated user's company, ensuring complete data isolation between tenants.
Security layers:
- Input sanitization against XSS/injection
- Rate limiting (100 requests/minute)
- Supabase Row Level Security (RLS)
- Session management with 30-minute timeout
Localization: I used react-i18next with 5 locale files. Every string in the UI is translated — including dynamic content like tax labels, salary type names, and country-specific field placeholders.
Print Engine: Built a custom HTML/CSS print system that generates professional A4 documents — invoices, waybills, payslips — in 7 languages with proper formatting for each country.
Challenges
1. Tax System Complexity
Every country has a completely different tax structure. Switzerland uses Quellensteuer, Belgium uses ONSS, the UK uses PAYE with National Insurance. I had to research and implement each one accurately, storing them in a tax_brackets table with year-based validity.
2. Multi-Language UI Consistency
With 5 languages and 12+ modules, keeping translations consistent was a constant challenge. A single missing key could break an entire page. I built a structured locale system with nested objects matching the component hierarchy.
3. Real-Time Payroll Calculation
The payroll module needed to pull attendance data, apply progressive tax brackets, calculate social security, deduct absences, and display everything in real time as the user fills out the form — all without a backend API, using only Supabase queries and client-side calculations.
4. Data Security for Multi-Tenant SaaS
Ensuring that Company A can never see Company B's data required careful RLS policies across 30+ tables. Every insert, select, update, and delete had to be scoped to the correct company.
5. Keeping it Simple for the End User
Despite the complexity under the hood, the UI needed to be intuitive for a non-technical business owner in Turkey, Germany, or Belgium. This meant careful UX decisions — smart defaults, auto-generated employee IDs and student numbers, inline calculations, and contextual help text.
What I Learned
- Supabase is incredibly powerful for solo developers — auth, storage, real-time, and a full PostgreSQL database in one platform
- i18n is harder than it looks — it's not just translation, it's date formats, number formats, currency display, and cultural context
- Tax law is complex — each country has edge cases that require research beyond the obvious
- Multi-tenancy requires discipline — every single query must be scoped or you risk data leaks
- Iterative development works — starting with core infrastructure and adding modules one by one kept the codebase manageable
The Result
A fully functional, production-ready ERP that a business in Zurich, Rome, London, or Istanbul can use on day one — with their local tax rates, their local language, and their local currency. No configuration needed, no consultants required.
Live Demo: acu-erp.vercel.app
Built With
- react
- supabase
- vercel
- vite