Imagine: a customer drops off a shirt for dry cleaning, and two hours later can't find out if it's ready. Calling the call center—busy, the administrator is on lunch. Such order losses amount to 20–30%. Companies that implement a mobile app see repeat orders increase by 30–40% and call center load decrease. We've built dozens of such solutions—from local laundries to chains with dozens of locations. Let's break down the technical part.
Why do customers lose orders without an app?
The main pain is chaos in order statuses. Without automation, customers don't know where their items are, and administrators spend hours on phone clarifications. We build a clear status machine: new → picked up by courier → under assessment → in progress → ready → being delivered → handed over. Each transition triggers push notifications via FCM/APNs and updates in real time (WebSocket or Firebase Realtime Database). The customer receives a photo of items upon pickup and an assessment report—transparency that builds trust.
The second common problem is inconvenient booking and slots. Without a calendar, couriers arrive haphazardly, increasing wait times. We implement a smart calendar with available time slots, geolocation for delivery zone calculation, and route planning (MapKit/Google Maps SDK). If you have your own fleet, real-time tracking—like in food delivery apps—reduces customer wait time by 15–20%.
What's included in the work
Each project starts with a business process audit. We provide:
- documentation with status and trigger schemas
- integration plan with your CRM (REST API, WebSocket)
- UI mockups (Figma) for iOS and Android
- a finished product with admin panel and database
- instructions for publishing on App Store and Google Play
- employee training and 3 months of warranty support
How we choose the stack and implement the status machine
For most projects, we choose cross-platform: React Native (TypeScript) or Flutter 3.x (Dart). Backend—Laravel or Node.js with REST API. Database—PostgreSQL or MySQL. Here's a typical implementation of the "order—confirmation" process using Flutter:
// Example of a status machine using Bloc class OrderStatusCubit extends Cubit<OrderStatusState> { final OrderRepository repository; OrderStatusCubit(this.repository) : super(OrderStatusInitial()); Future<void> advanceStatus(String orderId, OrderStatus newStatus) async { try { await repository.updateStatus(orderId, newStatus); emit(OrderStatusUpdated(newStatus)); // Send push via FCM await FirebaseMessaging.instance.sendMessage(...); } catch (e) { emit(OrderStatusError('Error updating status: $e')); } } } We use BaaS (Firebase, Supabase) for rapid prototyping, but in production we prefer a custom backend—it gives full control over logic and security.
Why cross-platform is the best choice for dry cleaning
Native development for iOS and Android requires two teams and stretches timelines by 1.5–2 times. React Native and Flutter allow covering 95% of functionality with one codebase, saving budget without sacrificing performance. For example, complex status transition animations or smooth scrolling of the service catalog—all doable without lags. The cross-platform approach enables launching the app 1.5–2 times faster than native development.
| Criteria | Native development (iOS + Android) | Cross-platform (React Native / Flutter) |
|---|---|---|
| Timeline | 4–6 months | 2–4 months |
| Codebase | 2 separate | 1 shared |
| Performance | 100% | 95–98% |
| Updates | Separate | Synchronous |
How is CRM integration done?
We provide integration via REST API or WebSocket. During analysis, we study your internal CRM structure and set up synchronization of statuses, order data, and customers. This avoids accounting gaps. If the CRM doesn't provide an API, we set up an intermediate layer through a message queue (RabbitMQ).
Process of work
| Stage | Duration | Result |
|---|---|---|
| Analytics | 1–2 weeks | Business process schema, integration plan |
| Design | 2–3 weeks | Prototypes in Figma |
| MVP development | 6–9 weeks | Working app with basic features |
| Testing | 2 weeks | Report, bug fixes |
| Deployment & publishing | 1 week | App on App Store and Google Play |
Timelines and cost
MVP with booking and statuses—6–9 weeks. Full product with courier tracking, payments, and multi-location—3–5 months. The cost is calculated individually during the analysis phase—we'll give you an exact figure after reviewing your case.
How we set up push notifications
- Register the app in Firebase Console (Android) and Apple Developer (iOS).
- Generate APNs keys and upload to Firebase.
- Initialize Firebase Messaging on the client and get the device token.
- On the backend, save the token in the database and send notifications on status change.
- Handle notification receipt in the app to update the UI.
Common mistakes in dry cleaning app development (and how to avoid them)
- Missing offline mode. If the courier is in a basement without internet, the app must save data locally (SQLite / Hive). Otherwise, statuses are lost.
- Weak status transition handling. Without idempotency, repeated requests on poor connections can cause duplication. Add idempotency on the backend.
- Ignoring App Tracking Transparency (ATT). If you plan analytics or ads, ATT request is mandatory for iOS 14+. Violations lead to app update rejection.
Our experience and guarantees
8+ years in mobile development, 30+ projects for service industries (dry cleaning, cleaning, delivery). The team holds certifications in Flutter (Google Associate Developer) and React Native. Every app comes with a warranty—bug fixes for 3 months after launch. Get a preliminary assessment of your project—write to us or request a callback on the website. Contact us for a consultation and we will prepare a proposal within 2 days.
Used App Store Review Guidelines and Firebase Cloud Messaging.







