Mobile App

Pump — Home Services Marketplace

Dual-sided real-time mobile marketplace connecting Saudi Arabian homeowners with verified service technicians — live on Google Play with 10+ service categories and full Arabic RTL support.

Timeline: 11 months — May 2025 to April 2026 Google Play production release

Key Results

Google Play

Platform

Live at play.google.com/store/apps/details?id=app.pump with marketing site at pumpnow.app

47 screens

Screen Count

Dual-interface: customer browsing/booking + technician dashboard/earnings

12+

Service Categories

Plumbing, Electrical, AC, Cleaning, Painting, Carpentry, CCTV, Pest Control, Moving, Car Wash, and more

11 months

Time to Production

From initial commit (May 2025) to Google Play production release (April 2026)

The Problem

Home maintenance in Saudi Arabia relies on fragmented, word-of-mouth networks. Customers struggle to find available, verified technicians on demand, while independent technicians have no reliable channel to receive job requests in their area.

  • Customers have no centralized platform to compare service pricing or book verified home technicians — they rely on personal contacts or unvetted listings.
  • Technicians waste time traveling to distant jobs with no location-based matching — no system to route nearby requests to available workers.
  • No real-time communication between customer and technician during a job, leading to missed addresses, schedule confusion, and no-shows.
  • The Saudi market is Arabic-first but most platforms offer poor RTL support and lack proper Arabic localization.

The Solution

Built a complete two-sided Flutter marketplace — customers browse a 3-tier service catalog, book tasks, and track orders in real-time; technicians receive geo-matched job notifications, accept/decline with one tap, and manage their earnings. Firebase handles real-time data, auth, and push notifications while a Laravel API manages secure OTP delivery.

  1. 1Designed a 3-level service architecture — Services → Sub-Services → Tasks with per-task pricing in nested Firestore subcollections. Seeded 12+ main categories (Plumbing, Electrical, HVAC, Cleaning, Painting, Carpentry, CCTV, Satellite, Appliances, Pest Control, Moving) with Arabic + English names.
  2. 2Built dual authentication flows — Firebase Phone Auth (SMS) with automatic WhatsApp OTP fallback via a Laravel server proxy that keeps Meta API credentials off-device. Added Google Play reviewer bypass with hardcoded test numbers.
  3. 3Implemented geohash-based technician matching — encodes customer coordinates into a geohash, queries nearby technicians by hash prefix (1km → 7 chars, 5km → 6 chars, 20km → 5 chars), filters by availability, schedule conflicts (±3h window), and service specialization, then sorts by rating.
  4. 4Created real-time order lifecycle — full status machine (pending → confirmed → in_progress → completed/cancelled) with Firestore listeners. Each state transition triggers FCM push notifications to both parties through dual channels.
  5. 5Built technician-side dashboard — earnings breakdown, ratings history, order queue, availability toggle, and a modal notification overlay with sound for new job matches.
  6. 6Implemented real-time chat — Firestore subcollection per order with read receipts, delivered status, and batch marking.
  7. 7Added promotional system — offers with audience targeting, promo codes with per-user limits, first-order-only discounts, service-specific applicability, and real-time expiration streaming.
  8. 8Built dynamic theming from Firestore — admin can change colors, typography, and button styles live without requiring an app update.

Architecture Decisions

Key technical decisions made during the project and the reasoning behind them.

Firebase Firestore over REST API Backend

Reasoning

The app needs real-time updates throughout — order status changes, technician availability, chat messages, notification counts, and live theme updates. Building a WebSocket server for all this would be significant infrastructure. Firebase gives real-time listeners out of the box with offline persistence and automatic sync.

Outcome

Zero backend servers for core data operations. Real-time updates work across 10+ app screens with simple StreamBuilder widgets. Offline-first behavior comes free.

Geohashing for Technician Discovery (Client-Side)

Reasoning

Firestore cannot do native geo-radius queries. Options were: Cloud Functions computing distances on every order, a third-party geo service, or encoding location as geohash strings with prefix queries. Geohashing requires no server, scales with Firestore indexing, and keeps matching logic in the app.

Outcome

O(1) lookup complexity for nearby technicians using geohash prefix matching instead of O(n) full-collection scans. Configurable radius via prefix length.

WhatsApp OTP via Server Proxy over Direct Client Integration

Reasoning

Meta WhatsApp Cloud API credentials cannot be embedded in a mobile app — they'd be extractable from the APK. Also, Firebase Phone Auth SMS has delivery issues in some Saudi carrier configurations. The Flutter app generates OTP locally, sends it to a Laravel endpoint, and the server forwards to Meta's API.

Outcome

API credentials never leave the server. The app gracefully falls back from Firebase SMS → WhatsApp → admin manual delivery. Play reviewers use hardcoded test numbers that bypass both channels.

Provider + ChangeNotifier over Riverpod/BLoC

Reasoning

The app's state management needs are straightforward — user session, theme, offers list, and cart. Provider is bundled with Flutter, has zero learning curve for maintenance, and ChangeNotifier integrates naturally with Firestore's StreamBuilder pattern.

Outcome

98 Dart files with clear separation — no state management boilerplate. Theme, offers, and user state each have a dedicated ChangeNotifier consumed via Provider.

The Tech Stack

Flutter

Dart 3.7+ — 98 files, 47 screens, Provider + ChangeNotifier state management, Easy Localization for Arabic RTL + English

Firebase

Firestore (12+ collections with nested subcollections), Auth (Phone + WhatsApp OTP), FCM (dual-channel push), Storage (profiles, ID verification)

Google Maps

Interactive maps for address selection, technician location display, and geohash-based proximity matching with Haversine distance calculation

Laravel

PHP server on Hostinger — WhatsApp OTP proxy (Meta Cloud API), file upload/download/delete endpoints with API key authentication

WhatsApp Cloud API

OTP delivery fallback for Saudi carriers where Firebase SMS has delivery issues — credentials secured server-side via Laravel proxy

The Impact

A production app live on Google Play (play.google.com/store/apps/details?id=app.pump) with a marketing website at pumpnow.app — serving the Saudi Arabian home services market with full Arabic RTL support, real-time technician matching, and 47 screens across dual customer/technician interfaces.

Deep dives and comparisons related to the technologies used in this project.

Explore similar case studies with overlapping technologies and challenges.