Client project · Training and consulting
IAGO System – from course catalogue to e-invoice
For IAGO GmbH, a training and consulting firm for dangerous goods, aviation security, data protection and compliance, I built website, internal system and client portal as one connected system. It replaces an older ERP.
My role Concept, development, data migration and operations – for IAGO GmbH
- 3 applications from one codebase: website, internal system, client portal
- EN 16931 e-invoicing as ZUGFeRD or XRechnung, selectable per company
- 1,400+ automated checks against a dedicated test database
- 2 languages on the website and in the client portal
Context and approach
Courses, dates and prices lived in an older ERP, the website was a separate system, and whatever corporate clients wanted to know about their staff – certificates, dates, invoices – went back and forth by email.
Today it is one system with three interfaces. What is maintained in the system appears on the website without a rebuild; bookings from the website land as cases on the booking board, and corporate clients see their status in their own portal. The data of the old ERP was migrated.
What the system does
- 01
Bookings as a sales board
Every case moves from lead through quote and negotiation to order, separated into training, e-learning, consulting and books. A wizard brings client, date, participants, documents and shipping together.
- 02
Courses, dates and calendar
Courses with formats, prices and tiered pricing, dates with trainer, location and checklist. The calendar syncs both ways with Nextcloud.
- 03
Certificates with authenticity check
Certificates are created once per participant as PDF, stored immutably with a checksum and can be verified on the website – only with three details, so nobody can find out by trial and error who was trained.
- 04
Documents, dunning and e-invoicing
Quote, order confirmation, invoice, credit note and reminder, every issued version archived immutably. Invoices go out per company as PDF, ZUGFeRD or XRechnung; deadlines count working days without public holidays.
- 05
Consulting billing with contingents
Consulting contracts with monthly fee, hour contingent and a rate for extra hours. Hours come from appointments and minutes; the invoice carries the contingent status and a statement of work as an attachment.
- 06
Newsletter with consent records
Audiences are derived from bookings, and only people with documented consent are contacted. The log of every sign-up and opt-out is immutable; the system keeps the send schedule itself.
- 07
Self-hosted podcast
Upload, schedule, publish: the website serves audio and the feed for Spotify, Apple Podcasts and others. Statistics follow the IAB rules and store no IP addresses.
- 08
Client portal for companies
Corporate clients see their staff’s certificates, dates, invoices, client file, consulting hours and checklists – in German and English, with their own account and optional second factor.
- 09
Installable app with streamer mode
The system can be installed and sends push notifications per device. Streamer mode makes every euro amount unreadable so a screen share reveals nothing.
Inside the system
Screenshots of the system and portal come from an empty data store with made-up companies, people and figures; amounts are blurred. No real data of IAGO GmbH is shown. The last image shows the public website.
How it is built
- Developed with AI agents (Claude Code) – every commit reviewed by me
- One workspace with three applications and four shared packages: types and business logic, data access, PDF, interface
- One data layer with two implementations: PostgreSQL in production, file storage for development and demos
- Every issued version of a document stays immutable, with a checksum in the archive
- Background tasks such as backup, sync, newsletter and podcast run inside the server process, without a separate service
Technology
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS 4
- PostgreSQL
- Supabase
- pdf-lib
- ZUGFeRD
- XRechnung
- CalDAV
- CardDAV
- Web Push
- Mailjet
- ALTCHA
- Docker
A system like this for your business?
Tell me where things get stuck today — I usually reply within one working day.