Built for the no-coverage area first.
A field rep in a basement aisle in Kandy doesn't care about your beautiful cloud architecture if the app spins forever. Vendix treats offline as the default - every screen reads from Room, every transaction writes to Room first, sync is a background worker that never blocks the rep. The app feels online even when the network isn't.
- Room
- UI data source
- FIFO
- Sync order
- ~50m
- GPS accuracy
Outlet 4 of 12
Sunil's Grocery
Negombo Road · 2.4 km
Pending sync
73 invoices · 2 visits · 2 returns. Will auto-sync when online.
The phone never waits for the network.
Most "offline" apps are online apps that cache. Vendix flips it: every screen reads from a local copy on the device, every transaction writes there first, and sync happens quietly in the background. The rep gets instant feedback whether they have signal or not.
- Everything cached locally - products, prices, discounts, outlets, stock, taxes, routes - the rep can do their job without coverage.
- Instant feedback on every save - the UI never spins waiting for the server.
- Background sync in the order the rep made the entries - so receipts numbered the same way they were written.
- Conflict-safe - if a manager updates a price while a rep is offline, the latest official price wins next time the rep syncs.
Saving an invoice · five steps
- 1
Saved on the device
Marked as "pending sync" with a unique reference.
- 2
UI confirms instantly
No network wait. Rep moves on to the next outlet.
- 3
Background sync starts
Triggers the moment coverage returns. In-order, no skipping.
- 4
Server validates
Same checks and approvals as if it had been entered on the web.
- 5
Marked as synced
Final invoice number lands. Audit trail recorded.
Sync status · always visible
The rep always knows where they stand.
Apps that hide their network state lose the rep's trust the first time something gets “swallowed”. Vendix shows a live indicator at the top of every screen - Online, Offline, Syncing, or Conflict - and the count of pending writes. When the rep reaches a coverage area, sync starts automatically; when it finishes, the badge clears. No hidden state, no “tap here to retry”.
- Live network detection - the indicator updates the moment signal returns or drops, with no polling.
- No duplicate transactions - if a sync retries, the server recognises the entry and ignores the repeat.
- Clear conflict screen - if the server can't accept a write (because a price changed, for example), the rep sees what's different, not a silent failure.
- Master data refresh at login and every 15 minutes - the rep always has the latest prices and outlets.
Route compliance without the trust gap.
The age-old problem: did the rep actually visit, or did they call it in from the car park? Vendix uses Android's GeofencingClient to monitor ENTER/EXIT events at every outlet's pinned location. Visits get a verification status - VERIFIED, BRIEF, MANUAL, SUSPICIOUS, SKIPPED - and managers see route-compliance KPIs in their dashboard the next morning.
- Outlet GPS pinned on first visit - accuracy gate at <50 m so the pin is the real shop, not the parking lot across the road.
- Geofence ENTER/EXIT events with a 100 m default radius, tunable per outlet.
- Activity Recognition API - STILL/WALKING/IN_VEHICLE adapts tracking interval (15-60s) to save battery.
- Privacy by default - tracking only during working hours; 90-day auto-purge.
Visit verification statuses
Native Android. No compromises.
Kotlin + Jetpack Compose
Modern, native UI - not React Native, not WebView. MVVM + Clean Architecture + Hilt DI. Material 3 throughout.
Biometric unlock
JWT stored in Android Keystore (hardware-backed). Optional fingerprint or face unlock to launch the app - your auth without a password.
FCM push notifications
New orders, approval requests, stock alerts, delivery status - pushed silently to the device. Works even when the app is closed.
Embedded chatbot + voice
Same Vendix tool catalog as web. Compose UI with Markdig markdown rendering. Voice = STT → chatbot.
Power BI WebView
Reports embedded directly. Cached last render so reps can re-open analytics offline.
Multi-language
English, Sinhala, Tamil. Every screen uses stringResource() - no hard-coded labels. Per-tenant default language.
Walk the route on a sandbox tenant.
On a demo we'll hand you the Android app pre-loaded with a route, then let you put your phone in airplane mode and create three invoices. Watch them sync the moment you toggle it off.