01
Dashboard with company switcher
Revenue and invoice-status stats from the invoicing service. Switching company changes the active tenant for every API at once.
Case study · 07 / 09
Online invoicing & accounting SaaS
Invoicing and online accounting for small businesses and accounting offices — many companies on one account, every Polish VAT rule handled, data filled in straight from the GUS registry.
VKS
Fintech · Accounting
Web app (PWA) + microservices
Frontend & invoicing service
The product
One login, several companies. Users issue sales, pro forma, draft and correcting invoices, manage contractors and bank accounts, and buy licences and add-on packages on subscription — with exchange rates taken from the National Bank of Poland.
Our part
A Vue 2 + TypeScript PWA talking to three independent microservices — auth, licences and invoices — and the Laravel invoicing service behind it, signed with RS256 JWTs and rendering PDFs with DomPDF.
Under the hood
Separate axios instances and base classes per service, with the active company sent to every API in an X-company header.
Every change of quantity, price, discount or VAT rate is recalculated by the invoicing service — net and gross strategies, discounts and rounding to the grosz.
Previews grouped by seven VAT rates (23/8/5/0%, exempt, n/a, n/a EU), amounts written out in Polish words, and corrections showing before, after and the difference.
Contractor data pulled from the GUS REGON registry by tax number, declarative validation with Polish messages and numbering series that reset every month.
The outcome
Inside the product
Demo data · click any screen to enlarge
01
Revenue and invoice-status stats from the invoicing service. Switching company changes the active tenant for every API at once.
02
A live line-item table: each change of quantity, price, discount or VAT asks the server calculator for VAT, net and gross. The contractor’s default 5% discount fills in by itself.
03
Totals broken down by every VAT rate — including exempt and EU reverse charge — and the amount written out in Polish words.
04
Server-side filtering, sorting and paging: date range, document type, minimum amount and payment status (paid, partly paid, unpaid).
05
Step one of four: licence, billing period with a length discount and add-on packages, priced live in the basket before invoice details and online payment.
06
Type the tax number, click “Fetch from GUS” and name and address fill in from the REGON registry. Validation errors speak Polish.
Stack
Next case