IZAPzoo
Sieć sklepów stacjonarnych IZAP chciała mieć własny program lojalnościowy w telefonach klientów zamiast plastikowych kart. Zaprojektowaliśmy i zbudowaliśmy całość — aplikację na Androida i iOS, backend w chmurze i panel administracyjny — a punkty, nagrody i promocje personel sklepów obsługuje dziś samodzielnie.
- Klient
- IZAP — sieć sklepów stacjonarnych z artykułami zoologicznymi i wędkarskimi.

Kontekst projektu
IZAPzoo to program lojalnościowy sieci sklepów zoologiczno-wędkarskich IZAP przeniesiony w całości do świata cyfrowego. Zamiast plastikowej karty klient nosi w telefonie aplikację: zakłada konto, zbiera punkty za zakupy, odbiera nagrody i vouchery, śledzi promocje i widzi historię swoich transakcji. Zaprojektowaliśmy i zbudowaliśmy całość — od aplikacji mobilnych na Androida i iOS, przez backend w chmurze, po panel administracyjny dla firmy.
Sercem systemu jest kod QR klienta. Przy kasie wystarczy pokazać ekran telefonu — sprzedawca skanuje kod, transakcja trafia do systemu, punkty naliczają się automatycznie, a klient od razu widzi je na koncie. Po drugiej stronie działa panel administracyjny, w którym firma zarządza nagrodami, voucherami, promocjami i użytkownikami, z uprawnieniami dopasowanymi do roli: kasjer widzi co innego niż kierownik, a kierownik co innego niż administrator.
Obie aplikacje przeszły proces publikacji i są dostępne w Google Play oraz App Store. Backend działa w chmurze i został zaprojektowany tak, żeby rósł razem z siecią — dołączenie kolejnego sklepu nie wymaga zmian w kodzie.
Wyzwanie biznesowe
Program lojalnościowy w handlu stacjonarnym ma jedno bezwzględne ograniczenie: kolejkę przy kasie. Cała obsługa — identyfikacja klienta, naliczenie punktów, realizacja vouchera — musi zamykać się w kilku sekundach i działać niezawodnie na dowolnym telefonie, także u klientów, którzy nie są biegli technicznie. Jeżeli aplikacja spowalnia kasę choćby o chwilę, personel przestaje ją polecać i program umiera w praktyce, niezależnie od tego, jak dobrze wygląda w materiałach marketingowych.
Drugim wyzwaniem była spójność danych i zaufanie do salda punktów. Wiele sklepów, wielu kasjerów i tysiące drobnych operacji oznacza, że system musi mieć jedno źródło prawdy — saldo, którego nie da się „popsuć” ani po stronie klienta, ani przez pomyłkę przy kasie. Do tego dochodzą dane osobowe uczestników programu, które trzeba przechowywać i przetwarzać zgodnie z przepisami, oraz wymaganie, żeby promocjami i nagrodami zarządzali pracownicy firmy — bez udziału programisty przy każdej zmianie.
Zakres realizacji
Zakres objął cały system: analizę potrzeb sieci, architekturę i model danych, aplikacje mobilne na Androida i iOS, backend w chmurze, panel administracyjny z uprawnieniami opartymi na rolach oraz przeprowadzenie obu aplikacji przez proces recenzji w Google Play i App Store, razem z materiałami do sklepów.
Pracowaliśmy na standardach przeniesionych z projektów enterprise — w środowiskach PwC, Roche i E.ON, w których pracował założyciel firmy, kontrola wersji, testy, oddzielne środowiska i dokumentacja są warunkiem wydania, a nie dodatkiem. Dla sieci oznacza to system, który da się bezpiecznie rozwijać i który w razie potrzeby przejmie kolejny zespół.
Rola założyciela
Całość zrealizował osobiście założyciel firmy, Jakub Zając — od analizy z klientem i architektury po obie aplikacje mobilne, backend, panel i publikację. Sieć rozmawiała bezpośrednio z osobą, która pisała kod, więc decyzje od kształtu ekranu kasjerskiego po strukturę bazy zapadały bez pośredników.
Zaangażowane kompetencje
- Analiza produktowa i techniczna
- Zamiana listy życzeń w zakres, który da się wycenić i zbudować.
- Architektura rozwiązania
- Decyzje, których nie da się tanio odkręcić po roku działania systemu.
- Frontend
- Aplikacje, które są szybkie i dostępne również na słabym łączu.
- Backend i API
- Logika biznesowa i integracje, które wytrzymują zmianę wymagań.
- Aplikacje mobilne
- Jedna baza kodu na iOS i Androida, z publikacją w obu sklepach.
- DevOps i chmura
- Powtarzalne wdrożenia i środowiska, które da się odtworzyć.
- Bazy danych
- Model danych i zapytania, które nie zwalniają razem ze wzrostem firmy.
Lista dyscyplin, których wymagała ta realizacja — nie lista stanowisk.
Rozwiązanie
Rejestracja i konto lojalnościowe
Klient zakłada konto w aplikacji w kilku krokach i od razu dostaje aktywną kartę lojalnościową. Logowanie oparliśmy na Supabase Auth — adres e-mail i hasło, sesja podtrzymywana tokenem JWT — a zakres zbieranych danych ograniczyliśmy do minimum potrzebnego do działania programu. Konto trzyma wszystko w jednym miejscu: saldo punktów, dostępne nagrody, vouchery i historię zakupów.
Kod QR i przepływ przy kasie
Każdy klient ma w aplikacji swój kod QR, który pełni rolę identyfikatora — i tylko identyfikatora. Kasjer skanuje kod, system rozpoznaje konto i rejestruje transakcję, a punkty naliczają się po stronie serwera. Ekran kasjerski zaprojektowaliśmy z myślą o realiach sklepu: minimum kroków, czytelne potwierdzenia i zachowanie przewidywalne także wtedy, gdy klient pokaże kod z zarysowanego ekranu albo przy słabym oświetleniu.
Punkty, nagrody i vouchery
Punkty zapisujemy jako rejestr operacji, a nie jedną nadpisywaną liczbę — każde naliczenie i każda realizacja nagrody zostawia trwały ślad, więc saldo zawsze da się wyjaśnić i zweryfikować. Na tej podstawie działa katalog nagród i system voucherów: klient wymienia punkty w aplikacji, a realizacja przy kasie jest potwierdzana przez system, co zamyka drogę do wykorzystania tego samego vouchera dwa razy.
Promocje i historia transakcji
Aplikacja jest dla sieci bezpośrednim kanałem kontaktu z klientem: promocje i akcje specjalne konfiguruje się w panelu i publikuje bez udziału programisty. Klient z kolei widzi pełną historię swoich transakcji i operacji punktowych — ta przejrzystość buduje zaufanie do programu skuteczniej niż jakakolwiek regulaminowa obietnica.
Panel administracyjny i role
Panel administracyjny obsługuje codzienną pracę programu: zarządzanie nagrodami, voucherami, promocjami, kontami klientów i użytkownikami systemu. Uprawnienia oparliśmy na rolach — kasjer wykonuje operacje przy kasie, kierownik sklepu widzi więcej, a pełna konfiguracja programu zarezerwowana jest dla administratorów. Wrażliwe operacje są rejestrowane, więc zawsze wiadomo, kto i kiedy wprowadził zmianę.
Backend w chmurze i publikacja aplikacji
Backend i baza danych działają na Supabase — to jedyne źródło prawdy dla całego systemu, z którego korzystają zarówno aplikacja mobilna, jak i panel. Operacje wymagające podwyższonych uprawnień wydzieliliśmy do funkcji Edge napisanych w TypeScripcie na Deno, więc nie zależą od tego, jaki klient je wywołuje. Strona internetowa programu i panel administracyjny są wdrożone na Vercelu; to hosting warstwy webowej, świadomie oddzielony od platformy, na której żyją dane. Obie aplikacje mobilne przeprowadziliśmy przez proces publikacji i recenzji w Google Play oraz App Store, razem z przygotowaniem materiałów do sklepów.
Stos technologiczny
Aplikacja mobilna
- React Native
- Expo SDK 53
- TypeScript
- Expo SecureStore
Backend i API
- Supabase
- Supabase Edge Functions
- Deno
- TypeScript
- Supabase Auth
Baza danych
- PostgreSQL (Supabase)
- Row Level Security
- Database functions
Chmura i dystrybucja
- Supabase
- Vercel
- Google Play
- App Store
Podejście techniczne
- 01
Serwer jest jedynym źródłem prawdy o punktach — aplikacja mobilna niczego nie nalicza lokalnie, tylko prezentuje stan z backendu. To eliminuje całą klasę problemów z rozjazdem sald między urządzeniami.
- 02
Kod QR to wyłącznie identyfikator, a nie nośnik wartości — samo zeskanowanie kodu niczego nie zmienia, bo każdą operację autoryzuje serwer. Podrobienie czy skopiowanie kodu nie daje więc dostępu do punktów.
- 03
Historia punktów jako rejestr operacji zamiast nadpisywanego salda — każdą rozbieżność można prześledzić do konkretnej transakcji, co przy programie lojalnościowym jest warunkiem zaufania obu stron.
- 04
Ekran kasjerski projektowany od kolejki, nie od funkcji — najpierw ustaliliśmy, ile sekund i ile dotknięć ekranu może kosztować obsługa klienta, a dopiero potem układ interfejsu.
- 05
Uprawnienia oparte na rolach od pierwszego dnia, a nie dodane później — i egzekwowane w bazie danych przez Row Level Security, nie w kodzie aplikacji. Klient, kasjer i administrator podlegają tym samym regułom niezależnie od tego, czy zapytanie przychodzi z aplikacji mobilnej, z panelu, czy z integracji, której jeszcze nie ma.
- 06
Jedna baza kodu w React Native i Expo zamiast dwóch osobnych aplikacji natywnych — prostszy stos i niższy koszt utrzymania. Program lojalnościowy wygląda tak samo na Androidzie i iOS, więc utrzymywanie dwóch kodów oznaczałoby podwójną pracę przy każdej zmianie i powolny rozjazd między platformami. Przy projekcie prowadzonym w całości przez jedną osobę to różnica między poprawką wydaną w tym tygodniu a w przyszłym miesiącu.
Jakość i niezawodność
- Zakres danych osobowych ograniczyliśmy do minimum potrzebnego do prowadzenia programu, a ich przetwarzanie zaprojektowaliśmy z myślą o wymogach RODO — łącznie z możliwością obsługi żądań usunięcia konta.
- Uwierzytelnianie oparliśmy na zarządzanej usłudze Supabase Auth: logowanie adresem e-mail i hasłem, sesja potwierdzana tokenem JWT. Własnej obsługi haseł nie pisaliśmy — w tej klasie systemów samodzielna kryptografia jest ryzykiem, nie atutem. Sesja na telefonie leży w Expo SecureStore, czyli w magazynie chronionym przez system operacyjny, a nie w zwykłej pamięci aplikacji. Cała komunikacja z backendem jest szyfrowana.
- Autoryzacja jest egzekwowana w bazie danych przez Row Level Security, a nie sprawdzana w aplikacji. To ważna różnica: reguły obowiązują każde zapytanie, które dociera do danych, więc pominięcie kontroli po stronie klienta niczego nie otwiera. Aplikacja mobilna, panel administracyjny i każda przyszła integracja podlegają dokładnie tym samym zasadom.
- Operacje wpływające na wartość — naliczenie punktów, realizacja nagrody, wykorzystanie vouchera — działają jako funkcje bazodanowe. Klient prosi o wykonanie operacji, a nie o zapisanie konkretnej liczby, więc salda nie da się ustawić z zewnątrz, a ten sam voucher nie zostanie zrealizowany dwa razy.
- Kod lojalnościowy klienta i tokeny voucherów są rozdzielone. Identyfikator pokazywany przy kasie codziennie to jedno, a jednorazowy token uprawniający do odbioru nagrody to drugie — pokazanie pierwszego nie daje dostępu do drugiego.
- Klucz service-role Supabase nigdy nie trafia do aplikacji mobilnej. Binarka opublikowana w sklepie to środowisko publiczne — co do niej włożysz, prędzej czy później da się odczytać — więc uprzywilejowany dostęp do danych zostaje wyłącznie po stronie serwera.
- Panel administracyjny działa na zasadzie najmniejszych uprawnień: każda rola widzi tylko to, czego potrzebuje, wrażliwe operacje trafiają do dziennika zdarzeń, a dane są objęte regularnymi kopiami zapasowymi.
Efekt
Sieć IZAP ma własny, cyfrowy kanał lojalnościowy: klienci noszą kartę w telefonie, a personel we wszystkich sklepach pracuje na jednym, spójnym obrazie punktów, nagród i transakcji.
Promocje, nagrody i vouchery firma prowadzi samodzielnie w panelu administracyjnym — uruchomienie nowej akcji nie wymaga kontaktu z programistą ani zmian w aplikacji.
Aplikacje są opublikowane w Google Play i App Store, a backend w chmurze jest gotowy na dalszy wzrost sieci — zarówno pod względem liczby sklepów, jak i liczby uczestników programu.
Galeria



Powiązane usługi
Zakres, z którego korzystał ten projekt — opisany szerzej na stronach usług.
Budujemy aplikacje na Androida i iOS z jednej bazy kodu w React Native — lojalnościowe, sprzedażowe i wewnętrzne — i prowadzimy je od projektu po publikację w sklepach i utrzymanie po premierze.
Systemy działające w przeglądarce — panele operacyjne, portale klienckie, dashboardy i produkty SaaS — z uprawnieniami, integracjami i wydajnością policzoną pod realne obciążenie.
Oprogramowanie pisane pod konkretny problem: systemy wewnętrzne, MVP, integracje i przejęcie aplikacji po innym wykonawcy — zaprojektowane pod procesy firmy, nie odwrotnie.
Projektowanie i optymalizacja PostgreSQL, migracje, raportowanie i automatyczna walidacja danych — żeby liczby w firmie wreszcie się zgadzały.
Inne realizacje

02Prywatne narzędzie do wyszukiwania okazji z analizą AI
ThomasSeekerAI
Prywatny handlarz codziennie ręcznie przeczesywał OLX, Otomoto, Allegro i kilka mniejszych serwisów w poszukiwaniu rzeczy wartych odsprzedaży. Zbudowaliśmy wewnętrzne narzędzie, które przejmuje tę pracę: wyszukiwania opisane zwykłym zdaniem prowadzi cyklicznie w tle, odsiewa szum i układa resztę według oceny okazji — godziny ręcznego przeglądania zamienione w automat.
Zobacz case study
03Strona klienta
Kamil Rosikiewicz
Kamil Rosikiewicz potrzebował strony, która udowadnia jakość obrazem, a mimo to otwiera się szybko także na telefonie. Zbudowaliśmy witrynę, w której portfolio ogląda się jak showreel, a każda podstrona prowadzi odwiedzającego prostą ścieżką do zapytania ofertowego albo do zapisu na szkolenie.
Zobacz case study
Porozmawiajmy o Twoim projekcie
Chętnie opowiemy, jak podobne podejście sprawdziłoby się u Ciebie — i czego byśmy uniknęli.