QuizMaster
A full quiz platform — mobile app, API, and payments — built for real, paying users.
QuizMaster is a full-stack quiz platform: a Flutter mobile app on flutter_bloc talking to a Laravel API with real quiz content, scored attempts, exportable reports, and payment gateways tuned for a Pakistani audience. Instead of a demo with hardcoded questions, it's a product with a real content model, a real auth flow, and a real way to charge for premium content.
A quiz app that gets paid for premium content
QuizMaster is a Flutter application structured around flutter_bloc, with dedicated blocs for auth, quiz, payment, reports, and theme, get_it for dependency injection, and Dio for networking with secure token storage. It talks to a Laravel 12 API built around a real content model — Category, Quiz, Question, Answer, QuizAttempt, and Result — with Sanctum-based auth and a payments layer that supports EasyPaisa and JazzCash for local users alongside Stripe and PayPal for everyone else.
Free quiz apps don't have a business model
Most quiz and trivia apps are throwaway demos with hardcoded questions and no way to monetize. A real product needs premium content gated behind payment, attempt history and reports instead of a single score screen, and — for a Pakistani audience specifically — local payment rails, because plenty of users can't or won't pay with an international card.
- Local users often can't or won't pay with an international card
- Quiz content needs a real backend — categories, questions, scoring — not hardcoded JSON
- Users expect attempt history and PDF reports, not just a final score screen
- Auth needs to survive password resets and session expiry, not just a login demo
A Flutter client backed by a real, payments-aware API
I built the mobile app on flutter_bloc so auth, quiz-taking, payments, and reports each own their own state instead of sharing one fragile app-wide store, with get_it for DI and Dio plus flutter_secure_storage for authenticated networking. The Laravel 12 backend models real quiz content and attempts, and its PaymentController exposes a single payment-intent API that returns a checkout URL or QR code whether the user pays with EasyPaisa, JazzCash, Stripe, or PayPal.
Everything a paid quiz product needs
- Category-organized quiz library with a paginated, searchable, sortable listing API
- Full auth flow — signup, login, forgot/reset password — backed by Sanctum tokens
- Premium quizzes gated behind payment, unlocked automatically once payment is verified
- Local payment rails — EasyPaisa and JazzCash — alongside Stripe and PayPal, with live USD→PKR conversion
- Quiz attempt engine with scoring, pass/fail thresholds, and a full per-question result breakdown
- Reports dashboard with attempt history and statistics, exportable to PDF
- Light/dark theme across both the mobile app and the Laravel-rendered result screens
- Profile, notification, and language settings so the app feels finished, not a demo
From a quiz screen to a paid content platform
- 01
Mobile architecture
Structured the Flutter app around flutter_bloc, with get_it for dependency injection and Dio for networking, so auth, quiz, payment, and reports each have an isolated, testable bloc.
- 02
Backend foundation
Built the Laravel 12 API on Sanctum tokens with a real content model — Category, Quiz, Question, Answer, QuizAttempt, Result — instead of a hardcoded question list.
- 03
Payments
Integrated EasyPaisa and JazzCash as first-class payment methods with sandbox/live environment switches, webhook verification, and a configurable USD→PKR exchange rate, alongside Stripe and PayPal for international users.
- 04
Attempts & reporting
Built the quiz attempt controller to score submissions and store per-question results, feeding a reports bloc and screen with statistics and PDF exports via Laravel Dompdf and Maatwebsite Excel.
- 05
Pagination & search
Enhanced the quiz listing API with page, per_page, search, and sort controls, plus structured pagination metadata, so the mobile app never has to guess whether more results exist.
- 06
Polish & testing
Added dark mode across every result view, localized settings screens, and unit tests around the blocs with mockito and http_mock_adapter before shipping.
A real client-server stack, not a toy
QuizMaster is built natively on Android using a focused, modern stack chosen for performance, maintainability, and a clean user experience.
The decisions that shaped the product
Paying for a quiz shouldn't need a foreign card
Built EasyPaisa and JazzCash into the payment-intent flow alongside Stripe and PayPal by treating "payment method" as pluggable from day one, with each gateway returning its own checkout URL or QR code behind one shared API.
Keeping the exchange rate honest
PKR pricing is derived from a configurable USD_TO_PKR_RATE environment value rather than hardcoded, so pricing can be updated without a redeploy.
State management that doesn't collapse under real features
Gave auth, quiz, payment, and reports their own BLoC instead of one giant app-state object, so a failed payment can't leave the quiz screen in a broken or inconsistent state.
Dark mode as a real requirement, not a toggle
Retrofitted every result view — index, show, and statistics — with matching dark variants instead of leaving the reporting UI half-themed after the rest of the app supported it.
Why this project matters
QuizMaster demonstrates full-stack ownership of a real, monetizable product: a Flutter app with proper state management, a Laravel API with a genuine content and payments model, and local payment integration built for a market international gateways usually ignore. For a client, it shows the same thing every time — the mobile app, the backend, and the money all have to work together, and I build all three.
Have a mobile product idea?
I'm available for client work in Android, mobile product development, and end-to-end app delivery. Let's talk about what you're building.