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.
- 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.
- 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.
- 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.
- 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.
- 5Built technician-side dashboard — earnings breakdown, ratings history, order queue, availability toggle, and a modal notification overlay with sound for new job matches.
- 6Implemented real-time chat — Firestore subcollection per order with read receipts, delivered status, and batch marking.
- 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.
- 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
Dart 3.7+ — 98 files, 47 screens, Provider + ChangeNotifier state management, Easy Localization for Arabic RTL + English
Firestore (12+ collections with nested subcollections), Auth (Phone + WhatsApp OTP), FCM (dual-channel push), Storage (profiles, ID verification)
Interactive maps for address selection, technician location display, and geohash-based proximity matching with Haversine distance calculation
PHP server on Hostinger — WhatsApp OTP proxy (Meta Cloud API), file upload/download/delete endpoints with API key authentication
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.
Related Reading
Deep dives and comparisons related to the technologies used in this project.
Offline-First Architecture in Flutter: A Production Guide
How to build Flutter apps that work seamlessly without internet — covering SQLite sync strategies, conflict resolution with vector clocks, and background sync patterns used in the PUMP fitness app.
Flutter vs. React Native — Which Should You Choose in 2025?
Senior mobile developer compares Flutter and React Native for cross-platform apps. Covers performance, developer experience, cost, and when to use each framework.
Related Projects
Explore similar case studies with overlapping technologies and challenges.