

Pre · 1 of 3app/landing.tsx
AI-powered rep counting
Point your camera and Fitnit counts your reps and tracks your form in real time.
The only screen with the brand green on the button. Every screen after it switches to black.
Fitnit · iOS · shot 24 Aug 2026
Every screen of the flow, pulled off the simulator rather than drawn. Each has a slot beside it, so a redesign lands in the same board and the change is visible instead of described. All three carousel slides are filled in — photoreal plates generated on fal.ai with Fitnit's own UI composited on. Drag the scrubber to watch the flow change: it opened at fifteen frames and is down to thirteen.
Reading order, top-left to bottom-right. Three are the pre-onboarding carousel, one is a modal sheet, one is the exit — the rest are the numbered questions. Two screens present at v1.117.1 no longer exist.
As shipped · 22 Aug 2026 The flow as it stood before any of this work. Three carousel slides are Ionicons glyphs in tinted circles, doing the job of a hero.
Carousel replaced · 23 Aug 2026 All three carousel slides become photoreal plates generated on fal.ai, with Fitnit's own UI composited onto the phone in the shot. The nine question screens are untouched — and now visibly lag the slides that precede them.
Referral question cut · 24 Aug 2026 “How did you hear about us?” and its “Which platform?” branch are gone, because the funnel said so: 45 of the 61 people lost across the whole flow went in those first two screens. Setup now opens on the goal question and runs 1–8. The photo step also stopped bouncing signed-out users back to the landing screen.
Height and weight split out · 24 Aug 2026 The BMI screen asked five things at once in three-line pickers. Height is now a full-page wheel — two columns for ft / in, one for cm — and weight is a full-page ruler you slide sideways with the figure set large above it. What remains of the calculator is age, sex and activity. Setup runs 1–10. The three welcome slides also shipped for real in v1.121.0 — the frames here are captures, not the v1.118.0 composites.
Pre · 1 of 3AI-powered rep counting
Pre · 2 of 3Effortless nutrition tracking
Pre · 3 of 3Stay accountable with friends
Step 1 of 9How did you hear about us?
Step 1 of 9 — againWhich platform?
Step 2 of 9What's your goal?
Step 3 of 9What should we call you?
Step 4 of 9Add a photo, {name}
Step 5 of 9Where are you from?
Step 6 of 9BMI Calculator
Step 6 · sheetActivity Level
Step 7 of 9Your Results
Step 8 of 9What would you like to focus on?
Step 9 of 9What's your main reason for being here?
Post · exitYou're Premium!
Pre · 1 of 3AI-powered rep counting
Pre · 2 of 3Effortless nutrition tracking
Pre · 3 of 3Stay accountable with friends
Step 1 of 9How did you hear about us?
Step 1 of 9 — againWhich platform?
Step 2 of 9What's your goal?
Step 3 of 9What should we call you?
Step 4 of 9Add a photo, {name}
Step 5 of 9Where are you from?
Step 6 of 9BMI Calculator
Step 6 · sheetActivity Level
Step 7 of 9Your Results
Step 8 of 9What would you like to focus on?
Step 9 of 9What's your main reason for being here?
Post · exitYou're Premium!
Pre · 1 of 3AI-powered rep counting
Pre · 2 of 3Effortless nutrition tracking
Pre · 3 of 3Stay accountable with friends
Step 2 of 9What's your goal?
Step 3 of 9What should we call you?
Step 4 of 9Add a photo, {name}
Step 5 of 9Where are you from?
Step 6 of 9BMI Calculator
Step 6 · sheetActivity Level
Step 7 of 9Your Results
Step 8 of 9What would you like to focus on?
Step 9 of 9What's your main reason for being here?
Post · exitYou're Premium!
Pre · 1 of 3AI-powered rep counting
Pre · 2 of 3Effortless nutrition tracking
Pre · 3 of 3Stay accountable with friends
Step 1 of 10What's your goal?
Step 2 of 10What should we call you?
Step 3 of 10Add a photo, {name}
Step 4 of 10Where are you from?
Step 5 of 10How tall are you?
Step 6 of 10How much do you weigh?
Step 7 of 10A little about you
Step 7 · sheetActivity Level
Step 8 of 10Your Results
Step 9 of 10What would you like to focus on?
Step 10 of 10What's your main reason for being here?
Post · exitYou're Premium!279 people opened onboarding and 218 finished it — 78% completion. That headline is healthy, and it hides where the losses actually are.
Drop-off, step by step unique users
Step 1 answers share of responses
Counts sum above the 258 who answered, because some people went back and changed their answer — read them as proportions.
Three quarters of all drop-off happens at or before the question that asks how you heard about us. Of the 61 people lost across the whole flow, 45 go in the first two screens — 21 between opening onboarding and answering step 1, and another 24 between step 1 and step 2. Every screen after that leaks single digits, and three of them leak nobody at all. The nine questions are not the problem. The first two are.
“Other” is the most popular answer, and it records nothing. At 31% it beats Google Search, Social Media and Friends / Family. There is no free-text follow-up, so those 98 people answered a question, cost themselves a screen, and told you nothing. That is the clearest single signal that the option list is wrong — if a third of people cannot find themselves in your five choices, the choices are not the ones people would offer unprompted.
Friends / Family is 15%, and that is the part attribution can never recover. AppsFlyer is deterministic for paid clicks and tracked links; a friend recommending the app at the gym is invisible to it. Worth noting that today it could not replace any of this: src/lib/appsflyer/index.ts:94-96 has both onInstallConversionDataListener and onDeepLinkListener switched off pending OneLink, so nothing in the app currently reads attribution at all.
The Social Media branch costs a screen and 30% of the people who take it. 67 chose Social Media at step 1; 47 completed “Which platform?”. This is also the one part of the question attribution genuinely does replace once OneLink is wired — which platform someone came from is exactly what a tracked link knows.
The photo step is not being measured. Since it shipped on 1 Aug, 50 people completed the step before it and 50 the step after — and it fired 1 event. The capture in photo.tsx:72 looks correct and sits on the only exit. The likely cause is next door: /photo is the only onboarding route missing from the PUBLIC_PATHS allow-list in app/_layout.tsx:155-172, and onboarding users are signed out, so reaching it should trip the redirect to /landing. Two independent signals agree; it still needs a signed-out reproduction to confirm.
Each of these was in the shipped code and reproducible. Two are now fixed — kept here because the fix is the interesting part.
app/(onboarding)/social-media.tsx:48 and welcome.tsx:55Resolved by deletion — both screens are gone. Both pass currentStep={1}. Answering “Social Media” — the first option on the very first question — advances a screen while the indicator stays exactly where it was. The one user who is told the flow is 9 steps long is also the one who sees 10 screens.
app/(onboarding)/bmi-results.tsx:39–41When bmiData is null the component calls router.replace() in its body rather than in an effect. React logs “Cannot update a component while rendering a different component”; it is in .expo/dev/logs/start.log right now, and deep-linking fitnitios://bmi-results with no saved data reproduces it every time.
app/_layout.tsx:155–172 — fixed in v1.119.0Every onboarding route is listed as public except one. Onboarding users are signed out, so reaching step 4 tripped the redirect to /landing and restarted their setup. It hid as an analytics gap: since the step shipped on 1 Aug, 50 people completed the step before it and 50 the step after, and it fired a single event. The capture in photo.tsx was correct the whole time — the bug was one line away, in a list.
app/settings/data-privacy.tsx:94It sets hasCompletedOnboarding: false and leaves onboarding.completedAt set, though userStore.ts:560–561 writes them together. app/index.tsx:48 reads the first flag, app/_layout.tsx:179 reads the second, so after a reset the two gates disagree about whether this user has onboarded.
Left frame is what ships. The dashed frame beside it is where the replacement goes — re-run the capture after a change and this page updates in place, same URL.


Pre · 1 of 3app/landing.tsx
Point your camera and Fitnit counts your reps and tracks your form in real time.
The only screen with the brand green on the button. Every screen after it switches to black.


Pre · 2 of 3app/landing.tsx
Snap a photo, scan a barcode, or search thousands of foods to log meals in seconds.
Nothing forces a swipe. A user can tap Get Started on slide 1 and never see slides 2 and 3.


Pre · 3 of 3app/landing.tsx
Daily challenges, leaderboards, and shared streaks keep you showing up.

Step 1 of 9app/(onboarding)/welcome.tsx
We'd love to know how you found Fitnit
GONE · Removed in v1.119.0. Attribution, asked before a single thing had been explained — the first question a brand-new user answered, and the screen with the worst drop-off in the flow.

Step 1 of 9 — againapp/(onboarding)/social-media.tsx
Tell us which social media brought you here
This screen passes currentStep={1}, the same value welcome.tsx passes. The bar does not move when you advance.

Step 2 of 9app/(onboarding)/goal.tsx
This helps us personalize your experience
Feeds the calorie target on step 7. Nothing on this screen says so.

Step 3 of 9app/(onboarding)/name.tsx
Enter your name or nickname
The emptiest screen in the flow — one field on a full page. Also the only one that takes typing.

Step 4 of 9app/(onboarding)/photo.tsx
Friends will recognize you on the leaderboard. You can change it any time.
The only screen whose primary button is an escape hatch, and the only one that uses the previous answer in its title.

Step 5 of 9app/(onboarding)/country.tsx
This helps us set your measurement preferences
The device already knows the locale. A user in the US scrolls or types to find their own country.

Step 5 of 10app/(onboarding)/height.tsx
Scroll to your height
One question, one control, the whole page. The selected row sits in a band at the exact vertical centre so a thumb rests where the answer is.

Step 6 of 10app/(onboarding)/weight.tsx
Slide the ruler to your current weight
Sideways on purpose: after a vertical wheel, the change of axis tells the hand this is a different quantity. Flinging 200pt moves about 24 lbs.


Step 7 of 10app/(onboarding)/bmi-calculator.tsx
Age, sex and how active you are set your daily calorie target
v1.120.0: the two measurements that deserved the whole page got it. Three inputs remain here, which is still the most of any step.

Step 7 · sheetapp/(onboarding)/bmi-calculator.tsx
Modal sheet over the calculator
The one control in onboarding that requires a second surface to answer.

Step 7 of 9app/(onboarding)/bmi-results.tsx
Your BMI and recommended daily calories
With no BMI data this screen calls router.replace() inside the render body (line 41), which logs a React update-during-render warning.

Step 8 of 9app/(onboarding)/focus.tsx
Pick the area most important to you right now
Third goal-shaped question in the flow, after step 2 and the goal picker on step 7.

Step 9 of 9app/(onboarding)/reason.tsx
This helps us understand what motivates you
Fourth motivation question. The user has now answered goal, focus and reason without seeing anything the app does.

Post · exitapp/subscription/
What this account sees on exit
Honest caveat: this frame is not the new-user paywall. Re-shoot from a signed-out install to put the real one here.
Every frame came from a booted simulator over a deep link, so the whole set is reproducible in about two minutes. Nothing here is a mockup.
Two frames need a caveat. Step 5 was captured with no country selected, because a deep link starts that screen clean. And the exit frame shows the already-premium state, not the paywall a new user meets — that one needs a signed-out install.
xcrun simctl openurl <udid> "fitnitios://welcome" xcrun simctl io <udid> screenshot dl-welcome.png # routes: landing welcome social-media goal name photo country # height weight bmi-calculator bmi-results focus reason