Microsoft Dynamics 365 is one of the most powerful enterprise platforms in the world — and also one of the most complex to learn. Our client built a consulting and education practice around teaching it. When he came to us, he had a clear vision: take that expertise and make it available to anyone, anywhere, on their phone, for free.
The result is Saindy365 — a short-form, audio-first learning app now live on both the App Store and Google Play. Here's how we built it.
The brief: tap, listen, learn
The client's vision was specific. He'd watched how habit-forming apps like Duolingo created daily learning streaks through short, satisfying sessions. He wanted that same experience — but for professional development in Dynamics 365. Key requirements from day one:
- Audio-first. Learners tap a lesson, listen, absorb. No reading walls, no video fatigue.
- Multilingual. The same content in multiple languages to reach a global enterprise audience.
- Progress tracking and achievements. Daily streaks, completion badges — the habit-forming mechanics that keep learners coming back.
- Free to start, subscription for premium. Maximum top-of-funnel access with a clear, non-pushy upgrade path.
- Professional branding. This is enterprise learning, not a game. The design had to match the seriousness of the subject.
Our approach: build on a proven foundation
We built Saindy365 starting from our internal production template — a FlutterFlow base we maintain across projects that handles authentication, navigation patterns, onboarding flows, settings, and profile management out of the box. Starting here meant roughly 90% of our development effort went into what's unique to Saindy365 instead of rebuilding infrastructure from scratch on every project.
Then came the full rebrand. Every screen, color palette, icon set, and content string was aligned to the Saindy365 identity. From the outside, it looks (and is) a fully bespoke product. Under the hood, it benefits from the stability of a base we've shipped and tested across multiple live apps.
"Starting from a proven template doesn't mean starting with a compromise — it means starting with confidence."
The stack: FlutterFlow + Firebase + RevenueCat
Three tools handled the heavy lifting, and the choice of each was deliberate:
- FlutterFlow for the entire UI and application logic. It ships a production-quality Flutter app to both iOS and Android from a single codebase without sacrificing the ability to write custom Dart code where needed. For a project with this scope and timeline, it was the right tool.
- Firebase for authentication, Firestore (content database and user progress data), and Storage (audio files). Firebase's real-time sync means progress updates feel instant, even across devices.
- RevenueCat for subscription management. This is consistently one of the most underestimated parts of building a consumer app. Two platforms, multiple subscription tiers, restore-purchase logic, webhook handling for entitlement updates — RevenueCat abstracts the complexity so we implement it once and it works reliably on both stores.
The three things that required real engineering
1. Multilingual audio at scale
Supporting multiple languages sounds straightforward and is genuinely complex in practice. Audio files for each lesson need to exist in every supported language and map cleanly to the same content structure in Firestore. We designed a content model that lets the client manage audio content per language without touching the app code — new lessons go into Firebase Storage following a defined naming structure, and the app resolves them automatically based on the user's language preference. This keeps the editorial workflow simple and the app logic clean.
2. RevenueCat subscription flows
Integrating RevenueCat into a FlutterFlow project requires custom actions. We wrote the purchase flow, subscription status checks, paywall timing, and restore-purchase logic ourselves — because this is exactly the kind of integration that breaks under real conditions (simultaneous purchases, network interruptions, App Store review edge cases) if done generically. Getting it right meant testing on real devices with real sandbox accounts across both platforms, not just a preview build.
3. Progress tracking and gamification
Streaks, completion tracking, and achievement badges are simple to describe and require careful data modeling to execute reliably. We built the progress system with atomic Firestore transactions so a lesson completion can never be double-counted and achievements are computed from source data rather than event triggers. This means the data is always accurate, even if a user's connection was interrupted mid-session.
We built it with the client, not just for them
This project was also a learning journey for the client. As a first-time app founder — even one with deep domain expertise — he wanted to understand what he was building, not just receive a finished product. We ran a significant portion of the engagement as an active consultation: walking him through architecture decisions, explaining the trade-offs, and building his ability to manage and extend the app post-handoff. He came away with both a live app and a solid foundation of product knowledge.
The result
Saindy365 is live on the App Store and Google Play, growing its user base, and the client is happy. The codebase is structured cleanly enough that v2 features are already being scoped. That last part matters: a well-architected first version doesn't slow you down — it's what makes the next version fast to ship.
FlutterFlow
Firebase
RevenueCat
EdTech
Case Study
Subscriptions