Abrila salesman mobile app overview with customer management and product browsing
Mobile

Abrila Salesman

Offline-First Mobile App for Field Sales

A high-performance mobile application for Fabrilamp's sales representatives, enabling full offline operation during client visits. Built with Expo and React Native, it features local SQLite storage, filesystem-first image loading, and complex B2B order management.

Expo 54 React Native TypeScript NativeWind SQLite Drizzle ORM tRPC Zustand React Query Sentry

Key Features

  • Full offline operation with local SQLite database
  • Filesystem-first image caching strategy
  • Customer and provisional client management
  • Complex B2B cart and order workflow
  • Data sync with visual progress tracking
  • Role-based access (Salesman, Director, Superuser)

The Challenge

Fabrilamp’s sales representatives visit retail stores across Spain, often in areas with limited or no mobile connectivity. They needed a mobile tool that could showcase the full product catalog with high-quality images, manage customer relationships, and process complex B2B orders — all without depending on an internet connection. The existing workflow relied on paper catalogs and phone calls, leading to errors, delays, and a poor customer experience.

Our Approach

We built a fully offline-capable mobile application using Expo and React Native. The entire product database is stored locally in SQLite via Drizzle ORM, and product images are downloaded to the device filesystem for instant loading. The app uses Expo Router for file-based navigation, NativeWind for styling consistency with the web platform, and Zustand for lightweight client state management. tRPC provides type-safe communication with the backend when connectivity is available, while React Query handles caching and background sync. Sentry monitors production errors and performance metrics to ensure reliability in the field.

Technical Highlights

  • Offline-first with sync mechanism The full product catalog, customer data, and order history are stored in a local SQLite database, with a background sync process that pushes and pulls changes when connectivity is available
  • Filesystem-first image strategy The first product image loads from the local filesystem for instant display, while remaining carousel images load lazily on swipe — CDN URLs serve only as fallbacks
  • Parallel query optimization Category and product queries use batched parallel execution with pre-resolved image URIs, eliminating render-time lookups and reducing screen load times
  • Provisional customer workflow Sales reps can create provisional clients on the spot and immediately place orders, with the client data syncing to the backend for validation when back online
  • Custom number keyboard A purpose-built numeric input component optimized for rapid quantity entry during order taking, designed for one-handed use in the field
  • FlashList performance Product lists use FlashList with tuned draw distances and optimized item renderers to handle catalogs with thousands of products without frame drops
  • Sentry monitoring Full error tracking and performance monitoring in production, with custom breadcrumbs for sync operations and offline state transitions

Gallery

Product categories grid with lighting fixture images on iPad
Category navigation with pre-resolved images for instant rendering
Product listing page showing heater products with filters and sorting
Product catalog with filtering, sorting, and stock indicators
Product detail page showing ceiling fan with technical specifications
Product detail with specs table, stock status, and quantity controls
Shopping cart with B2B pricing and shipping details
B2B cart with custom pricing, shipping addresses, and payment terms
Data sync screen showing database sync progress and device statistics
Full data sync with granular progress tracking per data type

Next project

Abrila Web

View project

Start a project

Have a project in mind?

We'd love to hear about it. Drop us a line and let's talk about how we can bring your idea to life.

hello@wandity.com