AGENCY
ZGRZ Agency

Online service for the Registration Department of Kharkiv City Council

A service where citizens can book appointments, run their documents through online verification, and pay for services in one simple, intuitive flow.

 

Portal
B2C
GovTech
Directus CMS
Back-Office Development
Role-Based Access
Content Management

About the Project

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.

 

About Customer

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.

 

Proposed Solution

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.

 

Directus CMS
PostgreSQL
Node.js
NestJS

+5 Resource

Results

After launch, the department got a managed online process for requests and integrations — less manual work, lower risk of data errors.

 

60–70% fewer manual clarifications

on requests, thanks to transparent statuses and in-flow guidance

2–3 minutes

average time to submit a request for standard services

Zero duplicate payments

in normal operating scenarios

90%+ of requests

flow through to the verification stage without operator involvement

Integration incidents resolved 3–5× faster

the event log immediately shows where the failure occurred

One back office

instead of spreadsheets and email chains

Get in Touch

Or send us a message and we'll get back to you within 15 minutes during business hours

Enter your name

Enter your email

Enter your message

Andrii Trubai

Andrii Trubai

CEO | Head of WebDev department

More Success Stories