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:

  1. Input sanitization against XSS/injection
  2. Rate limiting (100 requests/minute)
  3. Supabase Row Level Security (RLS)
  4. 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

Share this project:

Updates

Submission history