MF.
ESEN
Back to the portfolio

Case study / Mobile-first product · Transactional rules

Kender Club

Discover places. Redeem benefits with clear rules.

A mobile-first application for editorial discovery, partner businesses and benefits, with QR/NFC points and management dashboards.

Technologies used
Angular · NestJS · TypeScript · PostgreSQL · Prisma · JWT · S3

The product on screen

Actual development screenshots with test data. They do not represent users or commercial activity.

Actual Kender Club discovery screen in development with a test catalog.
Mobile-first discoveryOpen full screenshot
Actual Kender Club results dashboard in development with test metrics.
Partner resultsOpen full screenshot

The problem

An attractive catalog is not enough to operate benefits: editorial places must be distinguished from partner businesses, capacity and usage periods enforced, receipts recoverable and each partner’s data isolated.

My contribution

I build the Angular experience for consumers, administrators and businesses alongside the NestJS backend and PostgreSQL/Prisma domain. I design redemption rules, idempotency, permissions and metrics supporting the commercial journey.

What the product enables

Discovery with editorial intent

A mobile-first experience connects the catalog, place details, photos, opening hours and perks. Editorial places can exist without a partner; content does not depend on a commercial transaction.

From physical point to receipt

QR and NFC open the same URL for a revocable Point. The backend validates the partner, place, benefit, capacity and frequency; it confirms redemption and a valid visit in one transaction and supports authenticated receipt recovery.

Management and business signals

Admin onboards businesses, places, benefits and points. The partner dashboard shows confirmed redemptions and visits by source. Reviews require authentication and moderation; they are not presented as proof of purchase or a visit.

How the pieces fit together

Two Angular applications share contracts with a NestJS API: consumer and Admin/Business. PostgreSQL preserves commercial truth. Place, Partner, Perk, Point and Redemption have explicit identities and relationships. User membership in a partner is checked in the backend; photos use S3-compatible storage.

MVP component relationships
  1. Angular consumer
    Catalog · auth · redemption
    NestJS API
  2. QR / NFC Point
    Revocable URL · token hash
    Redemption
  3. Redemption
    Redemption + visit · transaction
    PostgreSQL
  4. Admin / Business
    Roles · membership · metrics
    NestJS → PostgreSQL

Engineering decisions

Confirm atomically

A Serializable transaction revalidates the Point and usage rules before consuming the last available slot. The idempotency key and fingerprint allow replay without a duplicate redemption or a different intent under the same key.

Separate editorial catalog and commercial relationships

A place can exist without a partner, while perks and physical points require a valid commercial relationship. I model these entities separately and snapshot the perk and business at redemption. Catalog edits or place reassignment cannot rewrite the receipt or its historical attribution.

Resolve access through membership

Consumers, businesses and administration share a domain but have different visibility. The backend derives the allowed partner from membership and scopes queries and metrics to that identity. Receipts are owner-only; business dashboards expose aggregates without consumer emails or physical tokens.

Challenges addressed

Concurrency and lost responses

PostgreSQL tests exercise last-slot races, concurrent same-key requests and rollback. If a response is lost after commit, the user recovers their own receipt instead of consuming another benefit.

Data isolated between partners

Dashboard queries start from user membership. Aggregates and history preserve commercial attribution without exposing consumer emails or physical tokens to other businesses.

Demonstrable capabilities

A complete commercial journey

Confirmation preserves the visit, receipt and benefit terms across retries and later catalog changes.

Verifiable frontend and domain

Permission, privacy and concurrency tests back error and recovery states. Displayed figures are development fixtures, not commercial adoption.