Chyzh Agency chyzh.agencyFull-Cycle Digital Agency +38 067 130-93-26
← Chyzh Agency case studiesCase study · Development · Mobile · Flutter
Case · Mobile app development

Sadok.app — the app a kindergarten runs on: children, attendance and payments

A mobile CRM for kindergartens where parents, teachers and the front office share one product, with invoices, bank reconciliation and in-app payment. iOS and Android from a single Flutter codebase, Python on the server.

FlutterPythoniOS + AndroidThree rolesMonoPay checkout
Sadok.app: sign-in screen, admin dashboard with kindergarten figures and an invoice card
Client and brief

Move a kindergarten’s day into an app — money included

Sadok.app is a Ukrainian CRM app for kindergartens, development centres and after-school clubs. The brief only sounds simple: give parents a line to the kindergarten on their phone. Behind it sat the bookkeeping — groups, attendance, clubs, meals and monthly invoices the kindergarten had been running in spreadsheets and messengers. The job was to build a mobile app in Flutter for iOS and Android at once, on a backend that could carry a real institution’s records.

Client: Sadok.app Track: mobile development Platforms: iOS + Android Stack: Flutter · Python
The real challenge

Not one app but three products sharing a database

A parent opens it for a minute: is my child at the kindergarten, what is the group doing. A teacher works in it for a whole shift: marking attendance, keeping lists, adding photos. The office closes the month: issuing invoices, matching payments against the bank statement, pulling reports. Three scenarios, three sets of permissions, one set of data underneath.

Money added its own layer. A wrong invoice is not a ticket in the backlog, it is a phone call with a parent. So the finance side got statuses, drafts, transaction matching and a way back — rather than one number to pay.

⌁

Sign in without a password

Phone number and an SMS code. The number is already tied to a child, so the app shows who it found and asks the parent to confirm: yes, that is my child.

◧

Three roles, one codebase

Parents, teachers and kindergarten staff sign into the same app but see different sections. The role model lives on the server, not in hidden buttons.

◎

Kindergarten catalogue

Search as a list or on a map, filter by region and city, distance to each place. The card carries rating, description, programmes and clubs.

⟲

Clubs that check the clock

Enrolment reads the timetable: if the child already attends another class at that hour, the app refuses the clash and says why.

▤

Groups and daily routine

A group card with age range, occupancy, teachers and the hour-by-hour routine. Lists of children and parents with contacts.

✓

Attendance

Teachers mark who is in and who is out — for the group and for a single paid session with its time and price. Parents see their own child’s status.

⊞

Events calendar

A month view filtered by type: teacher and parent birthdays, group events, institution events. Staff create an event from the app.

◌

Chat with canned replies

Messages with the teacher, video notes in the thread and ready-made phrases for the usual situations — a parent answers with one tap instead of typing on the move.

▣

News and photo gallery

The kindergarten posts news with pictures; each group keeps its own gallery by date. Parents stop digging through chat history for photos.

◔

Polls

Staff build a poll from custom fields and watch the active ones on the dashboard.

₴

Invoices with a lifecycle

Draft → due → paid, and back again. An invoice holds the period, payer, group, service lines, carried-over debt and the total.

⧉

Issue a whole month at once

The office picks a month and the system bills everyone for services, clubs and meals. What is left is to check and publish.

◈

MonoPay checkout

Parents settle an invoice inside the app. Bank details can be copied instead, for anyone who prefers to pay by hand.

⇄

Matching against the bank

Transactions arrive from the bank and split into matched and unidentified. An accountant ties the unidentified ones to an invoice by hand, so money stops falling between the statement and the ledger.

◍

Meals on their own ledger

Sittings with a timetable, menus per group and a separate balance topped up apart from the monthly invoice.

▦

Reports you can export

A monthly sheet by group and child: balance, meals taken, total present and total charged. Exports to a file.

Parent journey

Phone number to child’s card in three screens

No email-and-password sign-up. Parents want an app, not an account.

Phone sign-in, child confirmation and group card in the Sadok.app mobile app
Left to right: sign-in — phone number, password arrives by SMS. Child confirmation — the app found the child by number and shows the kindergarten and group. Group card — age, occupancy, teachers with contacts, daily routine, gallery and documents.
Catalogue

Find a kindergarten, read the programmes, book a club

Kindergarten map, venue card with rating and a club page in Sadok.app
Left to right: map — pins for each place, a list/map toggle and a city filter. Kindergarten card — rating, distance, address and programmes such as Cambridge English. Club — age range, timetable, who runs it, and enrolment that checks for free time.
Communication

Everything about the child in one place, not three chats

Chat with a teacher, news composer and group photo gallery in Sadok.app
Left to right: chat — video notes in the thread and canned replies for the usual messages: “running late, ten minutes”, “he is unwell, not coming today”. News — headline, text and photo, published from the app. Gallery — the group’s pictures gathered by date.
Front office

The whole kindergarten in figures on one screen

The admin home screen is a daily summary rather than a menu: children present, absent and not yet marked; club sessions held and the money charged for them; occupancy, news and running polls. The same data then turns into invoices.

Admin dashboard, invoice card and monthly invoice run in Sadok.app
Left to right: dashboard — attendance, clubs with charges, occupancy, news, polls. Invoice card — service lines with carried-over debt, total due and bank details you can copy. Invoice run — pick the period and the system bills everyone.
People and records

The directories everything else is built from

Staff list, adding a child to a group and marking session attendance in Sadok.app
Left to right: staff — a directory with roles and contacts, searchable. Add a child — pick from the institution’s records into a specific group. Session attendance — time, group, price and who was present, which is where the charges come from.
Money

The hard part is not billing — it is agreeing with the bank

Charging an amount is easy. Working out which parent has already paid is not, when a transfer arrives with someone else’s reference or no invoice number at all. So bank transactions are pulled into the app and split into matched and unidentified, and an accountant ties the unidentified ones to an invoice by hand.

Meals report, bank transaction matching and payment method selection in Sadok.app
Left to right: report — a monthly table per child: balance, meals taken, total present and total charged, exportable. Bank transactions — all / matched / unidentified tabs with a status on every payment. Payment method — choose the institution’s account before confirming.
Meals

A separate ledger, because it is counted differently

A monthly service costs the same whether the child came every day or not. Lunch does not: it is charged on the fact, from the teacher’s marks. Two different mechanics do not fit one invoice line, so meals run on their own module with their own balance.

Meal sittings, meal balance and group menus in Sadok.app
Left to right: sittings — breakfast, lunch and the rest with serving times. Meal balance — the child’s own account with payment history. Group menus — “Kalynka”, “Khmarynka”, “Yalynka”, each with its own set.
Stack

What we built it on

FlutterPythoniOSAndroidSMS authRole modelMonoPayBank matching

Flutter gave us both platforms from one codebase — for a product that keeps growing by modules, the saving lands on every later change, not just the first release. Python on the server holds the roles, the records and the money. The hard part was never drawing screens; it was separating three audiences cleanly enough that each one sees its own app. How that interface was designed sits in a separate case study on the design system.

Need a mobile app for iOS and Android? Let’s talk about your project.
Order app development
Case prepared by Chyzh Agency. Sources: mockups and the project specification for Sadok.app. Updated 17 Sep 2026.