EdTech Quiz PlatformCase Study

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.

Platform
Flutter + Laravel API
Payments
EasyPaisa · JazzCash · Stripe
Role
End-to-End
Architecture
BLoC + REST
Overview

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.

The Problem

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
The Solution

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.

Key Features

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
My Process

From a quiz screen to a paid content platform

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Technical Implementation

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.

Flutterflutter_blocget_itDioflutter_secure_storageLaravel 12PHP 8.2Laravel SanctumEasyPaisa APIJazzCash APIStripePayPalLaravel DompdfMaatwebsite Excel
Challenges & How I Solved Them

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.

Outcome

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.

Chat with us