Mobile App Development for Loyalty Programs
A loyalty program without a mobile app loses half its value. The client can't see their balance at the right moment; a promotion ends before they open the email. The core technical challenge is real-time point synchronization between the POS software, server, and client app. Without a clear architecture, desynchronization causes complaints: the cashier accrues points, but the client sees the old balance for another 10 minutes. Our experience shows that the right architecture solves 90% of the problems. The average payback period for the app is 6–8 months. Increasing customer LTV by 20–40% is a real result of implementation. Leave a request for an estimate — it's free. With over 10 years in mobile development and 50+ loyalty apps delivered, we guarantee proven results.
How to Avoid Desynchronization in Loyalty Apps
Desynchronization of the balance is the most common problem. The cause is cache without invalidation. The balance is requested when the app opens, cached in NSUserDefaults or SharedPreferences without TTL, and not updated after a push event from the backend. The solution is through APNS/FCM Data Message (silent push) with payload loyalty_balance_updated. The app silently does a background refresh via URLSession background task or WorkManager. Silent push outperforms polling by 10x in efficiency, ensuring near-instant balance updates. In 95% of cases, this eliminates delays. Peak load of 10,000 requests per second is sustained. For a bonus app, this scheme is mandatory; otherwise, clients lose trust. We guarantee 99.9% push delivery uptime.
What Are Typical Mistakes in Loyalty App Development?
- Ignoring offline experience: Relying solely on API calls for the card barcode means the card won't work in areas with poor connectivity. Always generate the barcode client-side.
- Cache without TTL: Storing balance indefinitely without invalidation leads to stale data. Use a short TTL (e.g., 30 seconds) and invalidate on push.
- Bulk offer loading: Loading all offers at once causes stale data and slow initial load. Use pagination and local caching with expiry.
- No silent push: Only relying on pull-to-refresh means the user has to manually refresh to see updates. Implement silent push for critical updates like balance change.
- Ignoring push permission prompts: Prompt for push permissions at the right moment, not on first launch. Use a contextual prompt after the user sees value.
Why Is Offline Functionality Essential for Digital Cards?
The barcode or QR of the customer card must work without internet. The cashier's scanner does not depend on the user's connectivity. Generation on the client from member_id + hmac_secret via HMAC-SHA256 with rotation every N seconds (like TOTP) solves the problem without a constant API request. The barcode is rendered using ZXingObjC / ZXing-Android-Embedded or native means (CIFilter on iOS). For 80% of clients, card synchronization takes less than 1 second. This is a key feature of any digital customer card. Offline barcode generation is 40% more cost-effective than server-side generation, reducing server costs substantially.
Technical Implementation of Offline Card
Algorithm: the client stores a seed key obtained during first activation. Every 30 seconds, a new code is generated. The server verifies it using the same seed. This prevents reuse of a stolen QR.
Levels and progress bar. The transition between levels (Silver → Gold) should be shown animated at the moment of accrual, not on the next app open. If the backend sends a tier_upgraded event in a push, the app should open a screen with Lottie animation. This requires correct handling of UNUserNotificationCenter foreground presentation + deep link.
A separate pain point is personalized offers. If offers are loaded in one bulk request once an hour, the user sees an outdated offer. The best scheme: OffersFeedRepository with paging via Jetpack Paging 3 or custom cursor, invalidation by push, local cache in Room/Core Data with expires_at. Average update time is 2 seconds. Personalization increases redemption rate by 35%. Push notification open rates for loyalty apps average 25%, driving engagement and repeat visits.
Architecture and Stack — Mobile App Development
For most loyalty projects, we choose Flutter (single codebase for iOS + Android) or React Native — depending on whether the client already has an RN team. Flutter loyalty and React Native loyalty — both frameworks have been successfully used in our projects. Native Swift/Kotlin is justified if the app integrates with Wallet (Apple Wallet integration + Google Wallet) — there, the native SDK is more convenient.
| Component | Tool | Purpose |
|---|---|---|
| Push notifications | FCM / APNs | Silent data message for balance update |
| Wallet | PKPassLibrary, Google Wallet API | Add digital card to wallet |
| Analytics | Firebase Crashlytics + Analytics | Track card activation and redemption rate |
| Deep Links | Branch.io, Firebase Dynamic Links | Referral program |
| Subscriptions | RevenueCat | Premium loyalty tiers |
Key integrations:
- Apple Wallet / Google Wallet — PKPassLibrary on iOS to add/update the card directly from the app. The pass is updated via push notification with webServiceURL — the server sends a new .pkpass with the current balance automatically (see Apple Wallet documentation).
- Firebase Crashlytics + Analytics — track conversion to card activation, redemption rate by offers. Redemption rate increases by 35% after personalization.
- Branch.io or Firebase Dynamic Links — deep link for referral program ("Invite a friend").
- RevenueCat — if the loyalty app has a premium subscription (extended tier privileges).
Data structure on the client: MemberProfile (id, tier, balance, card_number), OfferList (paged, cacheable), TransactionHistory (infinite scroll, Room/Core Data). A separate SyncManager listens to FCM Data Messages and invalidates the needed cache in a targeted manner, without pulling the entire profile. Cache size — 500 KB.
What's Included in Developing a Mobile App for a Loyalty System?
- Audit of the current loyalty program and API
- Design of data synchronization scheme
- UI/UX design of screens (balance, history, offer catalog, card)
- Development of client and server parts (if needed)
- Integration with POS system (REST/GraphQL)
- QA: offline scenarios, push events, high loads
- Publication on App Store and Google Play
- Staff training and documentation
Process
- Analysis — audit of existing loyalty program and API, data mapping.
- Design — client architecture, synchronization scheme, OpenAPI 3.0 contracts.
- Design — screen prototypes, UX testing.
- Development — parallel development: mobile app + backend (if needed). We use mocks via WireMock/MSW until the real API is ready.
- Testing — automated tests (UI, unit, integration), crash tests, offline scenario tests.
- Publication — build, passing App Store and Google Play review.
- Support — monitoring, Crashlytics, hot fixes.
Timeline Estimates
| Stage | Duration |
|---|---|
| MVP (balance, history, QR card, basic offers) | 4–8 weeks |
| Full app (Wallet, personalized offers, push, referral) | 2–3 months |
| Integration with non-standard POS | +2–3 weeks |
Cost is calculated individually after scoping. We'll estimate your project in 2 days — just contact us. Typical MVP development cost ranges from $15,000 to $30,000, with clients seeing an average ROI of 300% within the first year. Operational cost savings from automation reach $15,000 per month for chains with 50+ locations. Average ticket increase — $7 (equivalent to 500 rubles). For a typical retail chain with 10,000 loyalty members, the app generates an additional $200,000 in annual revenue. Our team's 10+ years of experience and 50+ delivered apps ensure a smooth process. Clients report a 60% reduction in support tickets related to balance queries after implementing our solution.
Get a consultation for your project — contact us, we'll estimate timeline and budget. We guarantee a 99.9% push delivery SLA and proven results.







