IZAPzoo
IZAP, a brick-and-mortar retail chain, wanted its own loyalty programme on customers' phones instead of plastic cards. We designed and built the whole thing — Android and iOS apps, a cloud backend and an admin platform — and store staff now run points, rewards and promotions themselves.
- Client
- IZAP, a brick-and-mortar retail chain selling pet supplies and fishing gear.

Project context
IZAPzoo is the loyalty programme of IZAP, a pet-supply and fishing retail chain, moved entirely into the digital world. Instead of a plastic card, the customer carries an app: they create an account, collect points on purchases, redeem rewards and vouchers, follow promotions and see their full transaction history. We designed and built the whole thing, from the Android and iOS apps through the cloud backend to the company's admin platform.
The heart of the system is the customer's QR code. At the till, showing the phone screen is enough: the cashier scans the code, the transaction lands in the system, points are credited automatically and the customer sees them on their account right away. On the other side sits the admin platform, where the company manages rewards, vouchers, promotions and users, with permissions matched to each role — a cashier sees different things than a store manager, and a manager different things than an administrator.
Both apps went through the release process and are available on Google Play and the App Store. The backend runs in the cloud and was designed to grow with the chain, so bringing another store on board requires no code changes.
Business challenge
A loyalty programme in physical retail has one non-negotiable constraint: the queue at the till. The entire flow — identifying the customer, crediting points, redeeming a voucher — has to close in a few seconds and work reliably on any phone, including for customers who are not technically fluent. If the app slows the till down even slightly, staff stop recommending it and the programme dies in practice, no matter how good it looks in marketing materials.
The second challenge was data consistency and trust in the points balance. Many stores, many cashiers and thousands of small operations mean the system needs a single source of truth: a balance that cannot be corrupted from the customer's side or by a slip at the till. Add to that the personal data of programme members, which has to be stored and processed lawfully, and the requirement that promotions and rewards be managed by company staff without a developer involved in every change.
Scope of delivery
The delivery covered the whole system: analysis of the chain's needs, the architecture and data model, the Android and iOS apps, the cloud backend, the admin platform with role-based permissions, and taking both apps through the Google Play and App Store review processes, store listings included.
We worked to standards carried over from enterprise projects: in the environments at PwC, Roche and E.ON where the firm's founder worked, version control, testing, separate environments and documentation are a condition of shipping rather than an extra. For the chain that means a system which can be developed safely and, if it ever comes to that, handed to another team.
Founder's role
Delivered personally, end to end, by the firm's founder, Jakub Zając — from analysis with the client and the architecture through both mobile apps, the backend, the admin platform and the releases. The chain spoke directly to the person writing the code, so decisions from the shape of the cashier screen to the database structure were made without intermediaries.
Capabilities involved
- Product and technical analysis
- Turning a wish list into a scope that can be priced and built.
- Solution architecture
- The decisions that are expensive to reverse a year into production.
- Frontend engineering
- Applications that stay fast and accessible on a poor connection too.
- Backend and APIs
- Business logic and integrations that survive a change of requirements.
- Mobile development
- One codebase for iOS and Android, published in both stores.
- Cloud and DevOps
- Repeatable deployments and environments you can rebuild.
- Database engineering
- Data models and queries that don't slow down as the business grows.
The disciplines this delivery required — a list of disciplines, not of job titles.
Solution
Registration and the loyalty account
The customer creates an account in the app in a few steps and immediately gets an active loyalty card. We built sign-in on Supabase Auth — an email address and a password, with the session carried by a JWT — and limited the data collected to the minimum the programme needs to operate. The account keeps everything in one place: the points balance, available rewards, vouchers and purchase history.
The QR code and the checkout flow
Every customer has a personal QR code in the app, and it acts as an identifier — nothing more. The cashier scans the code, the system recognises the account and records the transaction, and points are credited on the server. We designed the cashier screen for shop-floor reality: a minimum of steps, clear confirmations, and predictable behaviour even when the code is shown on a scratched screen or in poor light.
Points, rewards and vouchers
We store points as a ledger of operations rather than a single overwritten number: every credit and every redemption leaves a permanent trace, so a balance can always be explained and verified. The rewards catalogue and voucher system build on that: the customer exchanges points in the app, and redemption at the till is confirmed by the system, which closes the door on using the same voucher twice.
Promotions and transaction history
For the chain, the app is a direct channel to the customer: promotions and special campaigns are configured in the admin panel and published without a developer's involvement. The customer, in turn, sees the full history of their transactions and points operations. That transparency builds trust in the programme more effectively than any promise in the terms and conditions.
The admin platform and roles
The admin platform handles the programme's daily operations: managing rewards, vouchers, promotions, customer accounts and system users. Permissions are role-based — a cashier performs checkout operations, a store manager sees more, and full programme configuration is reserved for administrators. Sensitive operations are logged, so it is always clear who changed what and when.
The cloud backend and app releases
The backend and the database run on Supabase — the single source of truth for the whole system, used by the mobile app and the admin panel alike. Operations that need elevated privileges live in Edge Functions written in TypeScript on Deno, so they do not depend on which client calls them. The programme's web page and the admin panel are deployed on Vercel; that is web-layer hosting, deliberately kept separate from the platform where the data lives. We took both mobile apps through the Google Play and App Store review processes, including preparing the store listings.
Technology stack
Mobile app
- React Native
- Expo SDK 53
- TypeScript
- Expo SecureStore
Backend and API
- Supabase
- Supabase Edge Functions
- Deno
- TypeScript
- Supabase Auth
Database
- PostgreSQL (Supabase)
- Row Level Security
- Database functions
Cloud and distribution
- Supabase
- Vercel
- Google Play
- App Store
Technical approach
- 01
The server is the single source of truth for points; the mobile app calculates nothing locally and only presents backend state. That eliminates an entire class of balance-drift problems between devices.
- 02
The QR code is purely an identifier, never a carrier of value: scanning it changes nothing on its own, because every operation is authorised by the server. Forging or copying a code therefore gives no access to points.
- 03
Points history as an operations ledger instead of an overwritten balance: any discrepancy can be traced back to a specific transaction, which in a loyalty programme is a precondition of trust on both sides.
- 04
The cashier screen was designed from the queue backwards, not from a feature list: first we established how many seconds and how many taps serving a customer could cost, and only then the interface layout.
- 05
Role-based permissions from day one rather than bolted on later — and enforced in the database through Row Level Security, not in application code. Customer, cashier and administrator are subject to the same rules whether a request arrives from the mobile app, the admin panel or an integration that does not exist yet.
- 06
One codebase in React Native and Expo instead of two separate native apps — a simpler stack and a lower cost of ownership. The loyalty programme looks the same on Android and iOS, so keeping two codebases would have meant double the work on every change and a slow drift between the platforms. On a project delivered end to end by one engineer, that is the difference between a fix shipping this week and next month.
Quality and reliability
- We limited personal data to the minimum the programme needs and designed its processing with GDPR obligations in mind, including handling account-deletion requests.
- We built authentication on Supabase Auth as a managed service: email and password sign-in, with the session proven by a JWT. We wrote no password handling of our own — in a system of this class, home-grown cryptography is a risk rather than an asset. On the phone the session sits in Expo SecureStore, storage protected by the operating system, instead of ordinary app storage. All traffic to the backend is encrypted.
- Authorisation is enforced in the database through Row Level Security rather than checked in the application. That distinction matters: the rules apply to every query that reaches the data, so skipping a check on the client side opens nothing. The mobile app, the admin panel and any future integration are subject to exactly the same rules.
- Operations that carry value — crediting points, redeeming a reward, using a voucher — run as database functions. A client asks for an operation to be performed, not for a particular number to be written, so a balance cannot be set from outside and the same voucher cannot be redeemed twice.
- The customer's loyalty code and voucher tokens are kept separate. The identifier shown at the till every day is one thing; the single-use token that entitles someone to a reward is another. Showing the first grants no access to the second.
- The Supabase service-role key never ships inside the mobile app. A binary published in a store is a public environment — whatever you put in it can eventually be read back out — so privileged access to the data stays on the server side only.
- The admin platform follows least privilege: each role sees only what it needs, sensitive operations go to an audit log, and the data is covered by regular backups.
Outcome
The IZAP chain now has its own digital loyalty channel: customers carry the card in their phone, and staff in every store work from one consistent view of points, rewards and transactions.
The company runs promotions, rewards and vouchers on its own through the admin platform; launching a new campaign requires no developer contact and no app update.
The apps are live on Google Play and the App Store, and the cloud backend is ready for the chain's further growth, in the number of stores and programme members alike.
Gallery



Related services
The scope this project drew on, described in more depth on the service pages.
We build Android and iOS apps from one React Native codebase — loyalty, customer-facing and internal — and run them from design through store release to maintenance after launch.
Browser-based systems — operations panels, client portals, dashboards and SaaS products — with permissions, integrations and performance sized for a real load.
Software written for a specific problem: internal systems, MVPs, integrations and taking over an application from another vendor — designed around how your company works, not the other way round.
PostgreSQL design and optimisation, migrations, reporting and automated data validation, so the numbers across your company finally agree.
More work

02Private opportunity-discovery tool with AI-assisted analysis
ThomasSeekerAI
A private trader was combing OLX, Otomoto, Allegro and a handful of smaller sites by hand, every day, for things worth reselling. We built an internal tool that takes that work over: searches described in a plain sentence run on a schedule in the background, the noise is filtered out, and what is left is ranked by how good the opportunity looks — hours of manual browsing turned into an automated job.
Read the case study
03Client site
Kamil Rosikiewicz
Kamil Rosikiewicz needed a website that proves quality through imagery yet still opens fast on a phone. We built a site where the portfolio plays like a showreel and every page leads the visitor down a clear path — to an enquiry, or to a place on a training course.
Read the case study
Let's talk about your project
Happy to walk you through how a similar approach would work in your case — and what we would avoid.