Contents

Key takeaways

  • A single iOS and Android app for two audiences: clients and tailors.
  • A complete in-app journey: request, offer, appointment, job, payment, review.
  • Offers and appointments synced in real time between both phones with Firestore.
  • Stripe and Apple Pay payment, adjustable commission and VAT, PDF invoice sent by email.
  • React back office to manage users, payments, categories, reviews and reports.

Zzigs is an iOS and Android mobile app that connects individuals and businesses with tailors and alteration specialists. The client posts a request, nearby tailors send an offer with a price, and everything else happens in the app: chat, appointments, job tracking, card payment and reviews. Ahmed Sanoko designed and built the whole thing: the app, the payment API and the admin back office.

The need: find a tailor without searching

Getting a hem taken up, a jacket adjusted or a made-to-measure piece usually means finding a craftsperson, calling them, comparing prices and paying in cash. Zzigs reverses that flow: the client describes the project once, and the tailors come to them.

The app serves two very different audiences from a single codebase:

  • Clients, individuals or businesses, who post a request for alterations, made-to-measure work or repairs.
  • Tailors and alteration specialists, who browse requests around them and offer their services.

The role is chosen at sign-up, on descriptive cards. That choice is not a detail: some tailors were signing up as clients and posting their profile instead of a request. The sign-up screen was therefore redesigned, and a short three-step introduction explains how the app works after the first login.

The journey, from request to payment

Each job follows a precise path, which the app makes visible at every moment:

  1. The client posts a project: type of service (categories managed from the admin), detailed description, budget and up to 10 photos.
  2. Tailors see the request in their feed, with the distance and estimated travel time, then send an offer with their price and an introduction message.
  3. The client accepts or declines the offer. The tailor can also change the price within the conversation.
  4. Once the offer is accepted, the client proposes an appointment slot, which the tailor confirms or declines.
  5. The tailor starts the job, then marks it as completed.
  6. The client pays in the app, receives an invoice by email and can leave a review rated from 1 to 5 stars.
Zzigs tailor area: nearby projects sorted by categorySewing project detail with distance, map and a button to make an offer
Tailor side: the feed of nearby projects, then a request's detail with the map and distance.

Features

For the client

  • Create, edit and delete projects, with photos compressed before upload.
  • Offers arrive in a dedicated inbox, with status filters.
  • Accept or decline an offer in one tap, with a system message in the conversation.
  • Propose an appointment, and cancel it with a mandatory reason.
  • Card payment through Stripe, and Apple Pay on compatible devices.
  • Review the tailor at the end of the job.

For the tailor

  • Feed of available requests, filterable by category and postcode.
  • Project page with a map, distance in kilometres and estimated travel time.
  • Send an offer with a price and a message of 20 to 400 characters.
  • Change the price during the conversation.
  • Appointment calendar with statuses: pending, confirmed, in progress, payment, completed.
  • Enter bank details (IBAN checked and formatted) to get paid.

For everyone

  • Public profiles with average rating and recent reviews.
  • Anonymous reporting of a user or a project.
  • Push notifications at every step, also stored in the database.
  • Sign-in with email and password, or with a phone number and a 6-digit SMS code.
  • App available in 5 languages: French, English, German, Spanish and Italian.
  • Account deletion from within the app.

The technical challenges

A shared real-time state machine

The real difficulty in Zzigs is not any single screen. It is that two people act on the same job, each on their own phone, and each must see straight away what the other has just done.

An offer goes through several states (pending, accepted, declined), then the resulting appointment through others (proposed, confirmed, declined, cancelled, in progress, awaiting payment, paid). Each transition is allowed for only one of the two parties. The client accepts the offer, the tailor confirms the slot, the tailor starts and completes the job, the client pays.

The solution relies on Firebase Firestore and its real-time listeners. The conversation, the offer and the appointment are tracked live: when the tailor confirms a slot, the banner at the top of the client's chat changes instantly, the right button appears ("Pay", "Leave a review"…) and a system message is added to the thread. The client always knows what is expected of them, and so does the tailor.

The app header also listens to offers in real time, to show the number of pending actions without reloading the screen.

Zzigs conversation with an offer to accept or renegotiateDialog for accepting a tailor's offerList of conversations with tailors and status filters
Messaging carries the whole negotiation: offer, acceptance, then tracking conversations by status.

Geolocation without tracking the user

A tailor wants to know whether a request is worth the trip. Rather than constantly asking for the phone's location, the app starts from both users' addresses and postcodes. They are converted into coordinates with OpenStreetMap's geocoding service, then the distance is computed with the haversine formula. A travel time is estimated from that distance, and a map shows both positions.

The tailor's feed can also be filtered by postcode, using a local table of more than 35,000 French towns with their postcode.

Payment, commission and invoice

Payment happens only inside the app. At checkout, the app reads the offer price and the payment settings, then computes the total: service price, VAT and platform commission. Both rates are set from the back office, with no new app release.

A small PHP API creates the Stripe payment intent on the server, so the secret key is never inside the app. The client pays with the Stripe payment sheet or with Apple Pay. A signed Stripe webhook receives the confirmation on the server side.

Once payment succeeds, the appointment moves to the paid state, the payment is recorded, and the API sends three emails: a PDF invoice to the client (generated with mPDF), a payment notice to the tailor and a summary to the administrator.

Zzigs My appointments screen with offers, confirmed appointments and payments
Appointments bring together offers, confirmed slots and payments.

Reliability, security and updates

  • Network loss: the app detects a lost connection, shows a dedicated screen and reloads data as soon as the network is back.
  • Account blocking: an account deactivated from the admin is blocked in the app immediately, through a listener on the user record, without waiting for a new login.
  • Complete profile first: a tailor must fill in name, address, postcode and phone before accessing requests.
  • Remote updates: fixes ship through Expo Updates, without going back through the stores.
  • Minimum version: on launch, the app compares its version with the one required by the API and prompts an update from the App Store or Google Play if needed.

The back office

The Zzigs team runs the platform from a React web interface, connected to the same Firebase database:

  • dashboard with charts (sign-ups, breakdowns);
  • management of users, projects, offers and appointments;
  • payment tracking by status (pending, completed, refunded, failed);
  • commission rate and VAT settings;
  • management of service categories;
  • moderation of reviews and reports;
  • push notifications to a selection of users;
  • editing of the terms of use, privacy policy and legal notice.

The tech stack

  • App: React Native with Expo, a single codebase for iOS and Android, React Navigation, react-native-maps for maps, i18next for translations.
  • Data and accounts: Firebase Firestore, Firebase Authentication (email and phone) and Firebase Storage for photos.
  • API: PHP with the Stripe SDK, PHPMailer for emails and mPDF for invoices.
  • Notifications: Expo's push notification service.
  • Back office: React with Recharts for charts.

Zzigs is published on the App Store and Google Play. Ahmed led the project end to end as lead full-stack developer: user flows, mobile app, API, admin and publishing on both stores.

A marketplace project?

Zzigs shows how to fit a negotiation, an appointment and a payment between two people into one app, with clear tracking at every step. If you have a marketplace or on-demand service project, the easiest way is to get in touch. You can also see all the screenshots of the app.

Frequently asked questions

Can a marketplace app be built for iOS and Android at once?

Yes. Zzigs uses React Native with Expo: a single codebase produces both apps, published on the App Store and Google Play.

How does the platform earn money on each job?

The total paid by the client includes the service price, VAT and a platform commission. Both rates are set in the back office, with no new app release.

Can the app be fixed without waiting for store review?

Yes for JavaScript code: Zzigs receives fixes remotely through Expo Updates. A minimum version can also be enforced from the API to prompt users to update.