Skip to main content

Education & training centres

Courses, applications, waitlist and reminders in one database: the site, the admin and a Telegram bot read the same rows. Case: NRC.

The problem

The schedule in one place, applications in another, reminders by hand. Two systems drift apart and nobody knows which one is right. Anyone without a browser falls out of the process entirely.

What we do

  • ✓ One database: courses, applications, waitlist, reminders, news
  • ✓ A Telegram bot that guides the conversation and matches a course, instead of mirroring the site menu
  • ✓ A place frees up and the offer goes to the waitlist automatically
  • ✓ Bilingual content as data: every entity has its own translation table
  • ✓ Role-based access in the admin, background jobs on a queue
Схема: Освіта

Case

For the NRC training centre in Zaporizhzhia we built a course platform in which one database feeds the site, the admin panel and a Telegram bot. An application from the bot and one from the site are a single record, not two.

A separate three.js front end gives the site a 3D presentation that does not get in the way of indexing: the content stays data. NestJS, Prisma, PostgreSQL, Next.js, grammY.

The result: the timetable, applications and reminders stopped drifting apart, because they share one source.

How it works

1. A course is described once

The course, its timetable and the number of places live in one database. The site, the admin panel and the Telegram bot read the same rows, so there is nothing for them to drift apart on.

2. A person picks a course

In a browser or in a messenger. The bot does not mirror the site menu — it runs a conversation and matches a course to what the person answered.

3. The application becomes a row

An application from the bot and one from the site are a single record, not two. Sign-up can happen entirely in a messenger, with no browser at all.

4. The waitlist

When there are no places left, the person joins the waitlist. As soon as a place frees up the offer goes out to the queue automatically, with no manual calling round.

5. Reminders

Reminders are scheduled as background jobs on a queue instead of being sent by hand before every session.

6. The admin and its roles

Role-based access: the administrator, the teacher and the manager each see something different. Bilingual content is data: every entity has its own translation table.

Plain explanations without marketing — useful even if you never hire us.

Frequently asked questions

Can someone sign up without the site?
Yes. Sign-up runs entirely in a messenger: the bot holds the conversation, matches the course and creates the same record the form on the site would.
How do the timetable and the applications stay in step?
They share one source. Courses, applications, waitlist and reminders live in one database, so there are no two systems to guess between.
What is it built on?
NestJS, Prisma, PostgreSQL, Next.js and grammY. A separate three.js front end adds a 3D presentation that does not get in the way of indexing: the content stays data.