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.


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.
- Angular consumerCatalog · auth · redemptionNestJS API
- QR / NFC PointRevocable URL · token hashRedemption
- RedemptionRedemption + visit · transactionPostgreSQL
- Admin / BusinessRoles · membership · metricsNestJS → 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.