Replacing paper stamp cards with intelligent digital loyalty. Built with .NET 10, Python ML, and React Native — production-ready from day one.
Small cafes lose customers every day to poor retention tooling. LoyaltyWallet closes every gap — from data blindness to manual reward tracking.
One backend, three specialized frontends — each built for the exact workflow of its user.
Each campaign type is a separate Strategy pattern evaluator. Adding a new type requires zero changes to existing code — open/closed by design.
TargetUserIdsJson
list — enabling one-to-one personalized marketing to a single VIP or an entire RFM segment. This is a
commercial feature usually found only in enterprise platforms.
Deterministic scikit-learn pipelines give explainable results. LLM integration adds creative, natural-language workflows. Both coexist behind a tabbed UI — nightly scheduled by Celery.
ai_campaign_feedback
(Hangfire, 3-retry, batch 200) and fed back to the Python service — the AI learns which campaign types perform
better per tenant over time.
Not a toy project — multi-tenant isolation, circuit breakers, idempotency via inbox pattern, audit logging, and Azure Container Apps deployment.
| Layer | Technology |
|---|---|
| Backend API | .NET 10ASP.NET CoreClean ArchitectureCQRS · MediatR |
| Background Worker | .NET 10 Worker ServiceMassTransitHangfire |
| ML / AI Service | Python 3.12FastAPIscikit-learnLangChainCelery |
| Database | PostgreSQL 17EF CorePer-Tenant DB |
| Cache / Messaging | RedisRabbitMQ |
| Mobile Apps | React Native (Expo)TypeScriptEAS Build |
| Admin Dashboard | React 19 · ViteTypeScriptTanStack Query |
| Real-Time | ASP.NET Core SignalR |
| Cloud | Azure Container AppsKey VaultBlob StorageStatic Web Apps |
| Observability | SerilogPrometheusPostHogAzure Log Analytics |
Each cafe chain gets a dedicated PostgreSQL database. EF Core global query filters enforce row-level isolation as a second layer of defense.
Seven engineering decisions that separate this from typical student projects.