A native Android app built with Jetpack Compose that wraps a React PWA and uses geofencing to deliver location-based promotions near retail stores.
RoleAndroid Developer
Duration2020 - 2021
Client / PartnerConfidential
IndustryRetail / Location-Based Marketing
The retail experience was already available as a React Progressive Web App, but a PWA running in the browser can't reliably detect when a shopper is near a store. Without that, the business couldn't send timely, location-based offers, which are among the most effective ways to bring people into stores.
The goal was to keep the existing PWA as the main experience while adding the native location features only an Android app can provide.
Build an Android application that could:
- Deliver the existing React PWA inside a native app shell.
- Provide native UI for app-level screens and permissions.
- Detect when users are near participating retail stores.
- Trigger personalized promotions based on proximity.
- Respect user privacy and battery life.
Developed an Android application that acts as a wrapper around the React PWA, with native screens built in Jetpack Compose.
Using Android geofencing, the app registers areas around retail stores and is notified when a user enters one. It then shows a relevant promotion and opens the matching page inside the PWA.
- PWA wrapper that loads the existing React web app inside the native app.
- Native UI with Jetpack Compose for onboarding and permission screens.
- Store geofences registered around retail locations.
- Proximity-based promotions triggered on geofence entry.
- Deep links from notifications into specific PWA pages.
- Runtime permission handling for location access.
- Built the Android app shell and Jetpack Compose screens.
- Integrated the React PWA into the native wrapper.
- Implemented geofence registration for retail store locations.
- Handled geofence transition events and promotion triggers.
- Built notification flows that deep-link into the PWA.
- Implemented location permission requests and fallbacks.
- Worked with the web team to connect native events to the PWA.
- Communicating between native Android code and the web app.
- Android limits on how many geofences an app can register.
- Background location restrictions on newer Android versions.
- Balancing location accuracy with battery usage.
- Used a bridge between the native layer and the PWA to pass events and data.
- Registered geofences only for the stores closest to the user and refreshed them as the user moved.
- Guided users through location permissions with clear in-app explanations.
- Relied on the system geofencing APIs instead of continuous GPS tracking.
- Reused the existing PWA instead of rebuilding the experience natively.
- Added location-aware features that the browser alone couldn't support.
- Delivered timely promotions when shoppers were close to a store.
- Created a new channel for in-store promotions.
- Improved the shopping experience with personalized, relevant offers.
- Kept development efficient by sharing one web codebase.
A native Android shell built with Jetpack Compose hosts the React PWA. A geofencing layer registers store regions and listens for transitions, then triggers notifications that deep-link into the PWA.
- New PWA features ship without app store updates.
- Store locations loaded dynamically for geofence registration.
- Native and web layers kept separate for independent changes.