How I Built Salesy, an AI Sales Training App, Entirely in FlutterFlow
Hey everyone, I'm Arthur, solo founder of Salesy. It's an iOS app that helps SDRs and people new to sales actually get good at selling. You roleplay with AI prospects, get scored on real skills, and drill short courses between calls. It's live on the App Store, and the whole thing is built in FlutterFlow.
I wanted to share what's under the hood in case any of it is useful for someone shipping their own thing.
The stack
Nothing exotic, but every piece is earning its keep.
FlutterFlow powers the entire frontend, navigation, state, custom widgets and custom actions. Firebase handles everything on the backend: Firestore for users, courses, sessions and transcripts, Cloud Functions for anything touching a secret, Auth for sign-in, App Check for abuse protection, and Crashlytics for when things go sideways.
The AI layer runs on the OpenAI Responses API. Prompt IDs are versioned and stored server-side so I can iterate on the roleplay brain without redeploying the app. Whisper does speech-to-text, and OpenAI TTS handles the prospect voices (nova for female personas, ash for male, because consistent casting matters more than you'd think).
RevenueCat runs subscriptions across three tiers (Free, Plus, Max). AdMob monetizes the free tier with a weighted picker so I can slot in partner ads. Resend sends transactional email off a verified domain.
What FlutterFlow nails
The things FlutterFlow gets right are the things that would have cost me months otherwise. Auth flows, Firestore queries with live ListViews, push notifications, in-app purchase wiring through RevenueCat, AdMob integration. All of that is basically a configuration job. That meant I could spend my time on the actual product instead of plumbing.
Custom code is where it gets fun
Custom widgets and custom actions are the escape hatch that made Salesy feel like mine instead of a template. A few examples of where I dropped into Dart:
AnimatedCounter for streak and XP displays on the home screen. WordCycler for the rotating headline that sets the tone when you open the app. MarkdownText for rendering AI feedback with proper formatting so the scoring actually feels alive. sanitizeRating, a clamping and fallback function that makes sure a weird LLM response never writes garbage into Firestore. pickWeightedAd, a partner ad rotator with weights I tune from Firestore without touching the app.
If you're not writing custom code yet, start. The moment you stop fighting FlutterFlow to do something and just write 20 lines of Dart, a lot of friction disappears. FlutterFlow is strongest when you treat it as a Flutter accelerator, not a no-code jail.
The content pipeline nobody sees
One thing I didn't expect to spend so much time on was the content pipeline. Salesy runs on structured course data: modules, questions, reference answers, time constraints, categories. I needed a way to author courses fast without clicking through the Firebase console like an animal.
So I built a Python seeder. Describe a course in plain language, get back schema-valid JSON, dry-run validate it, then seed to Firestore from Cloud Shell. A new five module course with 25 questions now takes an afternoon instead of a weekend. The app doesn't care where the data came from, it just reads Firestore, and FlutterFlow's Firestore bindings render it instantly.
The lesson: if your app is content heavy, invest in the authoring pipeline early. FlutterFlow gives you the reader for free, but you still need to build the writer.
Cloud Functions are the unlock
Anything that touches a secret (OpenAI keys, Resend API, evaluation logic) lives in Cloud Functions, called from FlutterFlow as API calls.
Keeping the AI logic server-side means I can swap models, tweak prompts, and ship fixes without pushing a new build to the App Store. For an AI-heavy app, this is non-negotiable.
Why FlutterFlow was the right call
I could have built this in native Swift or raw Flutter. I didn't, because I'm one person and I needed to ship. FlutterFlow let me move at the speed of a small team while keeping full control over the parts that matter: the AI, the data model, and the feel of the app.
If you're building something AI-powered and solo, this stack (FlutterFlow, Firebase, Cloud Functions, OpenAI) is genuinely hard to beat right now.
Happy to answer questions from anyone building in a similar direction. You can check out the app at salesyapp.co or find it on the App Store.
Arthur Founder, Salesy