Skip to content

P/N 03Case studyEpoka University, graduation project

Three Ritema app screens on phones, Home with a Beats balance and a live Drop, the membership card with its QR code, and a place's standing, on a café counter beside an espresso machine and cups

Ritema — Loyalty Program Platform

A loyalty and rewards platform for local businesses. Businesses manage customers, points, rewards and coupons, and customers collect and redeem benefits by QR code in a mobile app. My solo graduation project, built and documented end to end.

Role
Solo full-stack software engineer
Team
Solo
Duration
One semester
Year
2026
Stack
Java · Spring Boot · Spring Security · JWT · MySQL · Redis · Flutter · Dart

Outcomes

  • Solo

    Full-stack build, from API and database to mobile app

  • On time

    Delivered with full documentation by the graduation deadline

  • QR

    Instant point collection and reward redemption

Problem

Local businesses rarely have a loyalty program that is easy to run. Paper stamp cards get lost, and large commercial platforms are expensive and complex. Ritema gives a small business a simple way to reward returning customers, and gives customers one app to collect points and redeem rewards.

Constraints

A solo project with a fixed graduation deadline, covering backend, mobile app, database and full written documentation. Security mattered from the start, because points and coupons have real value.

Architecture

A Spring Boot API secured with Spring Security and JWT manages businesses, customers, points, rewards and coupons. MySQL stores the core records and Redis caches frequently read data. A Flutter mobile app lets customers collect points and redeem rewards by scanning QR codes.

Flutter mobile app calling a JWT-secured Spring Boot API, with MySQL for records and Redis as a cache.

4 parts, 3 connections.

  • N01 — Flutter app
  • N02 — Spring Boot API
  • N03 — Redis cache
  • N04 — MySQL
  • Flutter app to Spring Boot API, JWT
  • Spring Boot API to Redis cache, cache
  • Spring Boot API to MySQL, records

Key decisions

Stateless JWT authentication with Spring Security, so every request is verified and the API can scale without server-side sessions.

QR codes for collecting and redeeming points instead of manual codes, which keeps the interaction at the counter fast and simple.

Redis as a cache in front of MySQL for frequently read data, to keep the app responsive.

Core features first, extras later. With one developer and a fixed deadline, I protected the complete earn-and-redeem flow and scheduled smaller features after it.

Three Ritema app screens on phones, Home with a Beats balance and a live Drop, the membership card with its QR code, and a place's standing, on a café counter beside an espresso machine and cups
The Ritema app: Beats, places and rewards for a returning customer.

Results

Delivered a complete, working product and its full documentation on time for graduation, built entirely by me across backend, mobile app and database.

The screens below are the customer app, from sign-in to the wallet and profile. Customers earn Beats at each place and build a standing there, from First Beat to Known by Name. Across every place they build an access status, from Active to Crown, which the membership card shows beside a QR code. Rewards arrive as coupons and limited-time Drops that are claimed in the app and shown at the counter, and every Beat earned or spent stays on record in the wallet's ledger. Swipe a strip, or use its arrows.

Getting started

4 screens
  • Ritema sign-in: the line Return in rhythm. Become known., fields for email or username and password, a Forgot your password link and a Sign in button

    Sign in

  • A welcome screen reading You're in rhythm: your profile is set, and every visit from here builds your Glow, with an Enter Ritema button

    Welcome

  • The Home tab: a greeting, a card with 2,480 Beats and the Ritema Select access status, and a live Source Drop with a countdown

    Home

  • Home scrolled: cards showing how close the customer is to the next recognition level at two places, then a list of recent Beats earned and redeemed

    Next level

From sign-in to Home: a welcome, the customer's Beats and access status, and where they stand with the places they return to.

Discover

2 screens
  • Discover with the Places tab open: a search field, category filters, and recommended places with their opening hours, rating and the customer's recognition level

    Places

  • Discover with the Map tab open: a dark map of Tirana with a pin for each place, zoom controls and the label 55 places on Ritema

    Map

Finding places and rewards, as a list with filters or as pins on a map.

A place

6 screens
  • A place's Status tab: the customer's standing, Regular, with 3,180 lifetime Beats, 620 available Beats and a five-step path from First Beat to Known by Name

    Your standing

  • A place's Coupons section: a limited Drop for free churros with a Tap to redeem prompt, beside tabs for the customer's own coupons and the ones released

    Coupons

  • A place's menu: category filters and dishes with their prices and the Beats each one earns

    Menu

  • A place's House Rules: one Beat earned per ten euros spent, a cap of 500 Beats per visit and Beats that expire after 12 months without a visit, above the customer's own timeline there

    House rules

  • A place's community and hours: friends who returned this week, the trending and most redeemed items, a count of regulars and the opening hours by day

    Community and hours

  • A place's contact options and amenities, with a Call button, a Website button, Wi-Fi, Pet friendly, Parking and Accessible tags, and a map of its location in Tirana

    Contact and map

One place, from the customer's standing and coupons to its menu, house rules, hours and location.

At a place

3 screens
  • The Reserve your table sheet: the name it is reserved under, a choice of date and time, party size, a notes field and a note that the reservation earns Beats on arrival

    Reserve a table

  • The Rate a place sheet: five empty stars, tags such as Great service and Good value, a field for more detail and a Post review button, with a note on how lower ratings are handled

    Rate a place

  • A menu item, Mango Lemonade, with its description, a choice of two sizes with prices, a quantity stepper and an Add to order button

    A menu item

What a customer can do at a place: reserve a table, leave a rating, and choose from the menu.

Drops and coupons

4 screens
  • A Drop for free churros: what the customer gets, a short instruction to show the code at the counter and a Use button

    A Drop

  • A live Drop, a limited 20% off with a countdown, in a sheet over Discover, with a note that it is first come, first served and a Claim button

    A live Drop

  • The same live Drop with its sheet fully open, showing the limited-time notice and the Claim button

    Claim it

  • Redeeming a free protein shake coupon: its code and expiry, a prompt that it is ready to redeem at the counter and a Use button

    Redeem a coupon

Limited-time Drops are claimed in the app, and coupons are shown at the counter to redeem.

Wallet, membership and profile

5 screens
  • The Wallet tab: a ring showing 2,480 available Beats, lifetime, status and expired Beats, counts of coupons ready, redeemed and expired, and the customer's recognition and access levels

    Wallet

  • The Wallet scrolled to Places in rhythm: a paged list of places with the customer's level and Beats at each, and the number of coupons ready

    Places in rhythm

  • The Wallet's ledger: every Beats earn and redemption grouped by day, each with its place, amount and time

    Ledger

  • The membership card: the customer's name, a QR code and member code, and a five-step access path from Active to Crown

    Membership card

  • The Profile tab: the customer's name, member since date, recognition and access levels, an Edit profile button and a line chart called Your signature

    Profile

Beats, coupons and the full ledger in one place, the membership card with its QR code, and the customer's profile.

Reflection

I would add automated end-to-end tests for the redemption flow and a web dashboard for business owners. I would keep the discipline of defining the core flow first and protecting it from scope creep.