Skip to content
All Projects
E-commerce
WebAndroid2025

SoqEgy

Two apps. One backend. Egyptian payment gateways. One sprint.

Customer app + delivery-agent app shipped in parallel — both live within the same sprint.

SoqEgy screenshot
2
Apps shipped
Paymob + Fawry
Payment gateways
Web + Android
Channels
Shared Firebase
Backend

The Challenge

Two completely different user roles — shoppers who browse and order, and delivery agents who receive and fulfil those orders — each needed their own optimised UX. The budget allowed for one backend, not two. On top of that, Egyptian payment gateways (Paymob and Fawry) have non-standard API documentation and require custom integration work that most off-the-shelf solutions don't support.

The Solution

I built two separate Flutter apps that share a single Firebase backend. The customer app targets Web and Android with a standard storefront UX. The delivery-agent app is Android-only with a map-based order routing interface and real-time status updates. Both apps read from the same Firestore collections — when a customer places an order, the delivery agent's feed updates in real time. Payment gateway clients are isolated behind an adapter interface so adding a third gateway later requires zero changes to the checkout flow.

Key Engineering Decisions

Shared Firestore data model

Orders, products, and user profiles live in a single Firestore schema that both apps read. Write access is locked per role using Firestore Security Rules — delivery agents can update order status but cannot read payment details.

Payment gateway adapter pattern

Paymob and Fawry have very different API shapes. I wrapped both behind a PaymentGateway interface — checkout code calls one method and the adapter handles gateway-specific serialization. Swapping or adding gateways is a one-file change.

Role-based Firebase Auth claims

Custom auth claims mark a user as 'customer' or 'agent'. Both Firestore Security Rules and the app's routing layer check this claim — a customer who somehow loads the agent APK gets redirected immediately.

RTL-first layout

Both apps support Arabic RTL out of the box. Layout direction is set at the MaterialApp level; every widget inherits it without per-widget overrides.

Tech Stack

FlutterFlutter WebDartFirebase AuthFirestoreCloud FunctionsFirebase StorageREST APIsProviderPaymobFawry

Outcomes & Results

2
Apps shipped
Customer + delivery agent, same sprint
2
Payment gateways
Paymob and Fawry fully integrated
Real-time
Order routing
Firestore listeners — no polling required
1
Shared backend
One Firebase project serving both apps

Live Links

Ready to build?

Need something similar built?

I'm available for new projects. Discovery calls are free and I typically respond within 24 hours. You'll work directly with me — from the first call to launch.