A service where citizens can book appointments, run their documents through online verification, and pay for services in one simple, intuitive flow.
A web service that handles public-service requests from end to end: the citizen selects a service, books a time slot, uploads and submits documents for verification, completes the order, and pays online. For department staff, the same system works as a back office with user management, role-based access, request handling, and news management, so day-to-day operations no longer ride on spreadsheets and long email threads.
The Registration Department of Kharkiv City Council is a public body that delivers administrative services and processes a high volume of citizen requests. For the department, predictability of the process was critical — requests had to never get lost, statuses had to be readable, and documents had to be checked against clear rules. Access control mattered just as much, since any glitch in roles or integrations turns instantly into queues, manual clarifications, and data-quality risk.
Multiple integrations
The system had to connect appointment booking, online document verification, service ordering, and payment in a way that keeps data synchronized across every step.
A stable back office
The admin area had to include modules that actually close out daily operational work: users, roles, requests, statuses, news.
Role model
In a public-service environment, staff must see only what they're supposed to see, and every change has to be traceable. That reduces error risk and makes incident investigation manageable.
Simple UX
Citizens need a straight-line scenario: choose a service → understand which documents are needed → upload them → check the status → pay → receive confirmation.
We designed the core processes as managed status chains, with transparent change history and role-based access throughout. Integrations were lifted into a dedicated API layer so every external service stayed under control — with input validation, structured logging, and predictable failure handling on every call.
UI for the citizen's key scenarios
We designed the screens and states for booking, document submission, status checking, payment, and confirmation. We also worked through the awkward moments: a rejected document, a slot taken in parallel, a payment that doesn't confirm.
Frontend as a clear multi-step application
We built a sequential flow where the user sees progress, document requirements, and verification statuses at every step. Draft saving and the ability to reopen an application were built in from day one — citizens routinely don't finish in one sitting.
Node.js API layer for integrations and business operations
We implemented the backend in JavaScript with explicit contracts for booking, document verification, ordering, and payment. A clear status model and input validations make every step unambiguous and recoverable.
Directus as a managed back office
Directus powers the admin panel — users, roles, requests, news, service dictionaries. Roles and permissions were configured against the real job functions of department staff, and change history was layered in so it's always clear who edited what.
Online payment for services
We aligned order and payment statuses so the user always sees an honest result: paid, unpaid, error, or awaiting confirmation.
Notifications and event log
We configured notifications for new requests and status changes and added structured logging of the events that matter, so staff can react quickly and unpack non-standard cases without guesswork.
We started by describing the full citizen journey the way it should actually work in life — where a request appears, which fields are mandatory, when payment is allowed, what to do if a document is rejected, who makes the decision, which rejection reasons are valid. At this stage, we defined a single shared vocabulary of statuses and events, so the frontend, the back office, and the integrations would all interpret the process the same way.
+5 Resource
After launch, the department got a managed online process for requests and integrations — less manual work, lower risk of data errors.
on requests, thanks to transparent statuses and in-flow guidance
average time to submit a request for standard services
in normal operating scenarios
flow through to the verification stage without operator involvement
the event log immediately shows where the failure occurred
instead of spreadsheets and email chains
Or send us a message and we'll get back to you within 15 minutes during business hours