Skip to content
CodeDock
← Back to case studies
Case Study5 months6 min read

Website, member area and admin for the Czech Association of Occupational Therapists — 16 modules in one system

The Czech Association of Occupational Therapists (ČAE) brings together occupational therapists from across the country. It needed more than a website: member and membership-fee records, accreditation of training events, lifelong-learning certificates and a member area. We delivered a Next.js 15 public site, a 16-module admin and a .NET 9 backend connected to Fio bank — with the first CMS and admin release in 15 days.

I want a similar solution →Czech Association of Occupational Therapists ↗
16admin modulesrecords · content · system
15 daysto the first CMS and admin releaseMay 5 → May 20, 2026
3 typesof online filing requestswith signed PDF output
146commitsMay–October 2026
01 — Starting point

The association needed a website that also runs its membership agenda

An association runs on people and paperwork: new member applications, annual membership fees, requests to accredit training events, lifelong-learning certificates, job ads and events with registration. The website had to handle these processes online — from submitting a request through payment to issuing a confirmation — and give the association office a single place to manage it all.

Membershipapplication → candidate → member
Membership feesannual, with payment matching
Training eventsaccreditation + credits
Lifelong-learning certificatessigned PDF
Events and webinarsregistration and invoicing
Website contentmanaged without a developer
Scope
website + member area + adminone system for the public, members and the association office
02 — Solution

One Docker image: .NET 9 API, Next.js 15 website and React admin

We designed and built the whole system from scratch. The .NET 9 application serves the API and the admin and forwards public pages to Next.js via YARP. One image, one pipeline, simple operations.

01

Public website with a CMS page tree

Next.js 15 with server-side rendering. Content is a page tree with four page types: category, Markdown page, system page and document. System pages cover news, events, accredited training events, contacts, full-text search and a map-based therapist finder.

02

Member area

Sign-in with Google or a one-time code sent by e-mail. Members get job ads, webinars and partner discount codes, pay their fee via QR code and download a PDF membership confirmation. The public can verify membership online.

03

Online filing office

A step-by-step form for three request types: training event accreditation, lifelong-learning certificate and job ad publication. Each request gets a reference number, an "awaiting payment" state and, once processed, an electronically signed PDF.

04

Automatic payment matching via the Fio API

A background job downloads transactions from Fio bank and matches them to membership fees and requests using QR payment data (SPAYD). The integration replaced the previous processing of bank e-mail notifications. Annual membership renewal runs automatically.

05

Events with registration and credits

Event registration with ticket types, custom form fields and billing details (auto-filled from the ARES company registry). Attendees receive credits and a certificate of attendance.

06

16-module admin

React 19 + MUI 7 in three groups — Records (members, groups, pricing, facilities, partners, filing office, invoices), Content (pages, job ads, webinars, events, discount codes, contacts, e-mailing) and System (CDN, users). Per-module permissions, a Markdown editor and drag-and-drop page ordering.

07

Legacy link migration

Old URLs of journal articles 308-redirect to their new addresses, so links from other websites keep working.

03 — Architecture

Solution architecture

A single Docker image built in four stages. .NET 9 serves /api and /admin and forwards everything else to Next.js SSR via YARP. Data in PostgreSQL accessed via Managed Identity, documents in Cloudflare R2, secrets in Azure Key Vault. Traefik handles TLS, Cloudflare provides CDN and WAF. Azure DevOps pipeline: gitleaks → ACR → deploy → health check.

Solution architecture
  1. Users: Public · members · admins
  2. CDN: Cloudflare (CDN · WAF)
  3. Proxy: Traefik (reverse proxy · TLS)
  4. Apps: Next.js 15 SSR (public web · member area); React admin (16 modules · MUI 7)
  5. Core: .NET 9 API + YARP (/api · /admin · background jobs)
  6. Data: PostgreSQL (Managed Identity); Cloudflare R2 (documents · media); Key Vault (secrets)
  7. Integrations: Payments & registries (Fio API, QR payments (SPAYD), ARES); Documents & sign-in (QuestPDF · iText (PAdES), Google Sign-In, Leaflet · Nominatim)
  8. Deployment: Azure DevOps → gitleaks → ACR → deploy → healthcheck
04 — Results

Results

Payments match themselves

A direct Fio API integration matches incoming payments to fees and requests. The office no longer has to compare bank statements by hand.

Signed documents, no printing

Lifelong-learning certificates and membership confirmations are generated as electronically signed PDFs (PAdES), ready to download.

Online requests with reference numbers

Training event accreditation, certificates and job ads are submitted through a step-by-step form. Every request has a reference number, a state and a history in the admin.

Therapists on a map

The public can find an occupational therapist or facility nearby on a map (Leaflet, geocoding via Nominatim).

The office manages everything itself

Pages, events, webinars, job ads, partners and e-mail campaigns are managed by the association in the admin. Per-module permissions control who can do what.

Secure, simple operations

One Docker image, secrets in Azure Key Vault, passwordless database access via Managed Identity, and a pipeline with secret scanning (gitleaks) and a post-deploy health check.

Technologies

  • .NET 9
  • ASP.NET Core
  • EF Core
  • C#
  • YARP
  • Next.js 15
  • React 19
  • TypeScript
  • Material-UI 7
  • Vite
  • PostgreSQL
  • Docker
  • Azure
  • Azure Key Vault
  • Managed Identity
  • Azure DevOps Pipelines
  • Cloudflare R2
  • Cloudflare CDN
  • Traefik
  • Fio API
  • ARES
  • QuestPDF
  • iText (PAdES)
  • Leaflet
  • Google Sign-In

More case studies

All case studies

ClinicDent

Multitenant SaaS for dental clinics — from booking to insurance billing

HealthcareSaaSMultitenant
Read more

Magistra a.s.

Data warehouse on Microsoft Fabric for a 200+ pharmacy chain

DataEnterpriseMicrosoft Fabric
Read more

JUST CS spol. s r. o.

Full replacement of an MLM sales network management system in 3 months

EnterpriseSystem replacementAzure
Read more

Related reading

Deeper technical notes on the topics from this case study.

Architecture & Consulting · 9 min read

Off-the-shelf vs. custom software: when each one wins

Custom software development pays off when off-the-shelf does not fit — but not always. Five signals you need custom, plus a build vs buy decision framework.

Read article
Enterprise Integration · 8 min read

Enterprise integration: 5 things that break in production

Every integration looks fine until the producer has a bad day. Five failure modes we see repeatedly in enterprise systems — and the unglamorous fixes that prevent each one.

Read article
A senior architect on every project · About us →

Want a similar solution?

Send us a message — we respond within one business day and schedule an intro call.
Get in touch