Vendix SFA
Product · Offline-first mobile

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
Vendix · Today Offline

Outlet 4 of 12

Sunil's Grocery

Negombo Road · 2.4 km

GPS verified

Pending sync

7

3 invoices · 2 visits · 2 returns. Will auto-sync when online.

Today Outlet Reports Chat
Offline-first by design

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. 1

    Saved on the device

    Marked as "pending sync" with a unique reference.

  2. 2

    UI confirms instantly

    No network wait. Rep moves on to the next outlet.

  3. 3

    Background sync starts

    Triggers the moment coverage returns. In-order, no skipping.

  4. 4

    Server validates

    Same checks and approvals as if it had been entered on the web.

  5. 5

    Marked as synced

    Final invoice number lands. Audit trail recorded.

Sync status · always visible

Online All synced · 0 pending
Offline 7 pending · auto-sync when online
Syncing... 3 of 7 done
Conflict 1 needs review
Sync the rep can see

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.
GPS-verified visits

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

VERIFIEDGPS inside geofence + min duration met
BRIEFGPS confirmed but stay was very short
MANUALGPS unavailable; rep entered manually
SUSPICIOUSNo geofence event matched the visit
SKIPPEDOutlet on the route plan, never visited

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.