Mobile Warehouse Management (WMS) App Development
We create apps that allow warehouse workers to perform operations faster and without errors using specialized data collection terminals (TSDs). Our experience includes integration with SAP, 1C, and other ERP systems, as well as implementing offline mode for reliable operation in unstable network conditions. Mobile WMS is not just barcode scanning. It is the interface between the warehouse worker and the inventory management system: receiving goods, putaway to locations, order picking, inter-zone transfers, inventory, shipping. Each operation requires confirmation via scanning, and the app works in conditions of weak Wi-Fi, rubber gloves, and 10-hour shifts.
Hardware: TSDs and Mobile Computers
A consumer smartphone in a warehouse is a temporary solution. Professional TSDs (Zebra MC9300, Honeywell CT40, Point Mobile PM90) offer IP65/IP67 protection, swappable batteries, built-in laser scanners with 10-meter range, and support for all 1D and 2D codes.
Development for Zebra: DataWedge is configured via Intent API — the app declares a profile in datawedge.db or programmatically via broadcast. Scanning arrives as an Intent with extra com.symbol.datawedge.data_string:
class WarehouseActivity : AppCompatActivity() { private val scanReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val barcode = intent.getStringExtra("com.symbol.datawedge.data_string") ?: return val source = intent.getStringExtra("com.symbol.datawedge.label_type") // EAN13, CODE128, QR_CODE viewModel.processBarcode(barcode, source) } } override fun onResume() { super.onResume() registerReceiver(scanReceiver, IntentFilter("com.symbol.datawedge.api.RESULT_ACTION")) // Enable DataWedge profile for our app sendDataWedgeIntent("com.symbol.datawedge.api.SWITCH_TO_PROFILE", "WarehousePro") } } For Honeywell — Honeywell Scanning SDK (similar Intent mechanism). For universality: ScannerProvider abstraction with implementations ZebraScanner, HoneywellScanner, CameraScanner. Determine device type via Build.MANUFACTURER.
Tasks and Queues: Server-Side Model
A warehouse worker sees a list of tasks sorted by priority and route (to minimize warehouse movements). A task contains: operation type, list of SKUs with descriptions and quantities, and storage location addresses (rack-level-position).
@Entity(tableName = "tasks") data class WarehouseTask( @PrimaryKey val taskId: String, val type: TaskType, // RECEIVING, PUTAWAY, PICKING, REPLENISHMENT, INVENTORY val status: TaskStatus, // ASSIGNED, IN_PROGRESS, COMPLETED, BLOCKED val priority: Int, val assignedUserId: String, val lines: List<TaskLine>, val syncedAt: Long, ) @Entity(tableName = "task_lines") data class TaskLine( @PrimaryKey val lineId: String, val taskId: String, val sku: String, val description: String, val expectedQty: Double, val actualQty: Double?, val fromLocation: String?, val toLocation: String, val lotNumber: String?, val expiryDate: String?, ) Offline mode: on Wi-Fi loss, tasks are available from Room. All operations are logged locally with a timestamp and synced in a batch when connection is restored. Version conflicts (another user processed the same item) — server resolves by timestamp, app notifies of changes.
Route Picking
Picking is the most time-critical operation. Task sorting by traversal route: S-shaped (serpentine) or nearest neighbor based on location addresses. Implemented on the backend; the mobile app receives an already sorted list.
Visual indicator for the current location: highlight on a warehouse diagram or just a large address (A-12-03) full screen. Confirmation via scanning the location barcode — error protection. After scanning the location, scan the item barcode, enter quantity (or auto-1 if single-piece picking).
sealed class PickingStep { object ScanLocation : PickingStep() data class ScanItem(val expectedSku: String) : PickingStep() data class EnterQuantity(val sku: String, val required: Double) : PickingStep() data class Completed(val lineId: String) : PickingStep() } class PickingViewModel : ViewModel() { private val _step = MutableStateFlow<PickingStep>(PickingStep.ScanLocation) fun processBarcode(barcode: String) { when (val step = _step.value) { is PickingStep.ScanLocation -> { if (barcode == currentLine.toLocation) { _step.value = PickingStep.ScanItem(currentLine.sku) } else { _events.tryEmit(Event.WrongLocation(barcode, currentLine.toLocation)) } } is PickingStep.ScanItem -> { if (barcode == step.expectedSku || isAlias(barcode, step.expectedSku)) { _step.value = PickingStep.EnterQuantity(step.expectedSku, currentLine.expectedQty) } else { _events.tryEmit(Event.WrongItem(barcode)) } } else -> { /* handle other steps */ } } } } Integration with WMS/ERP
Typical integrations: SAP WM/EWM via RFC/BAPI or REST (SAP API Hub), 1C:UPP/ERP via HTTP service, Microsoft Dynamics 365 via Dataverse API, custom WMS via REST/gRPC.
Integration strategy: do not call ERP directly from the mobile app — we use a middleware service that buffers operations, handles ERP errors, and does not crash the mobile client during 30-second SAP responses.
How to Ensure the App Works Without Connection?
We use Room for local storage of tasks and operations. On network loss, all actions are recorded locally, and on restoration, they sync in batches. Conflicts are resolved by timestamp. This approach guarantees uninterrupted operation even with unstable Wi-Fi.
Why Choose Industrial TSDs?
Smartphones are not designed for dust, moisture, and drops. Industrial TSDs have IP65/IP67, swappable batteries, and built-in laser scanners. This reduces downtime and scanning errors. In practice, TSD lifespan is 3-5 times longer than a regular smartphone in a warehouse.
What's Included in the Work
- Audit of current warehouse processes and selection of the optimal technology stack.
- Mobile app development for iOS, Android, or cross-platform.
- DataWedge/Honeywell SDK setup and TSD integration.
- Offline mode implementation with synchronization.
- ERP integration (SAP, 1C, Dynamics) via middleware.
- Warehouse testing, employee training, and documentation.
- Post-launch support (12-month warranty).
Our Metrics
Over 50 implemented projects in warehouse automation. 5+ years of expertise in mobile WMS development. Certified engineers for Zebra and SAP. Contact us for a project cost estimate.
| Operation Mode | Advantages | Disadvantages |
|---|---|---|
| Online | Real-time data, instant ERP sync | Depends on stable connection, delays on slow channels |
| Offline | Works without connection, instant UI response | Possible conflicts during parallel work, need for collision resolution |
Mobile WMS app development with Zebra/Honeywell TSD support, offline mode, route picking, and REST integration: 3-5 months. Full cycle (receiving, putaway, picking, inventory, shipping) with SAP/1C integration: 5-8 months. Cost is calculated individually. Get a consultation — we'll assess your project.







