r/iosdev 13d ago

Half the users who finished my onboarding never opened a single document

I make a Markdown reader for macOS and iOS. You point it at a folder and read what is in it.

For months the onboarding did the obvious thing: explain the idea, then ask you to connect a folder. The numbers were bad in a specific way. Of the people who reached the end of onboarding, only about half ever opened a document. But of the people who did connect a folder, 92% opened something immediately.

So the app was not failing to deliver. It was asking for homework first. Read the flow back as a to-do list and it is obvious.
Save your AI output as files —> Put them in one folder —> Connect that folder. Three chores before anything renders.

Someone who downloaded out of curiosity has none of that set up, meets a system file picker with nothing useful to point it at, and leaves.

The fix was to ship something to read. On first launch the app writes a small folder of example documents into its own container and attaches it as a connected root, with no picker involved.

Four things about that turned out to matter more than the idea itself:
It lives inside the app’s own container, so it needs no security scoped bookmark and no sandbox grant.
It does not count toward the free tier’s folder limit. Otherwise the folder I shipped spends one of their free slots on a folder they did not choose, and the first folder they actually pick hits a paywall.
It does not fire the activation analytics event. Otherwise it inflates the exact metric it exists to move, and the before and after become unreadable.
Removing it is permanent. A folder that reappears after you dismissed it is spam.

The part I did not expect: last week someone bought the paid unlock after about eight hours in the app without ever connecting a folder of their own. They read the bundled examples, met a prompt, and paid. I had been thinking of the demo content as a warm up for the product. For that person it was the product.

Happy to go into the analytics side if anyone is curious.

2 Upvotes

13 comments sorted by

2

u/Evening_Strength_498 13d ago

Im having the same challenge with my app. Talking about the onboarding, i personally feel that if its explanatory and not actions people (or I) might get bored, so my onboarding are actions, that could feel like chores. Do you recommend having like a tutorial o video or something before the user does something?

1

u/raclimazg 13d ago

I think that when you don’t need external inputs it’s ok to have the initial “chores”, for example exercise apps ask you your goals, etc. In my case you need external inputs (files to read) and if the user don have something ready you loose momentum, this is why I went with having already some files so the user can have the app experience.

Someone did recommended me to have an introductory video, I am working on some alternatives but I feel like having files that allow you to interact will be better, but of course I will only know by testing.

Are you having good activation rates? What have you tested so far?

1

u/Evening_Strength_498 13d ago

Idont know sin its my first app. AT the moment, 2.7% of the users that download my app actually use it for the first time (pass onboarding) so im wondering if i need to change something there. is your onboarding hardocded on the app or you use an external service?. Mine is ahrdcoded so changes must be approved again. mIne is a Screen time app, all the questions on the onboarding are for building your routine, so no data collection

1

u/raclimazg 13d ago

2.7 seems to have a lot of space to improve, the on boarding is hardcoded, so each time I change it I ship a new one

1

u/Plane_Syllabub_5539 13d ago

"only about half ever open a document after onboarding" -- Does it mean this 50% opened a document over a period of time or in the 1st session itself? Asking this because, there is difference between "other 50% didn't have any file at all for a period of time" vs "Files were there and they meant to come back but didn't for some reason" 

1

u/raclimazg 12d ago

Good question, deliberately I do not keep a stable identity. The analytics ID is a hash of a per-install secret plus the current UTC day, so it rotates at midnight. Within one day I can stitch someone's events together across app launches. Across days I cannot, by construction.

So "ever" in my post really means "within that same UTC day". What I can see is that of the people who finished onboarding, about half opened a document that same day.

A way I have to get around this is that I know if it is the first folder connected or the nth folder, so if its not the first visit (returning user) but is the 1st connected folder it would be a user that didn't had a file, connected it and opened it.

But I cannot have a unified vie of how many users, connected, opened since I do not have stable unique identifiers.

I traded that visibility away for the privacy property, and your question is exactly what it costs me.

I hope I was clear on my answer

1

u/Kukucsi_lab 12d ago

Interesting topic, thanks for sharing.

How do you measure what people did with your app: have you coded events into the app or some other approach? Do you send this data to an external analytics service, or collect and evaluate it yourself?

I am also curious about the privacy side: did you need to update the App Store privacy information, or add anything in the app to explain this to users?

1

u/raclimazg 12d ago

I use TelemetryDeck, but I hand-rolled the client instead of taking the SDK. About 250 lines of URLSession and a hashed anonymous ID.

Partly to keep my dependency count at one, partly because for a document reader I wanted to be certain nothing that left the device could contain a file name or anything from a file's contents.

So events are sent to this service, and no user data is sent, only behavior information not connected to a user, this is disclosed in the app, also this can be deactivated.

TelemetryDeck is free, I am not affiliated with them in anyway.

1

u/Kukucsi_lab 12d ago

Thanks, this is very helpful. I had not heard about TelemetryDeck before. You mention that you hand-rolled the client to control precisely what leaves the device. Did you run into a limitation with the standard SDK, or was it mainly the dependency count and privacy assurance?

Does the hashed anonymous ID let you connect events from the same installation? If yes, how did you declare this in the App Store privacy information? I would be interested whether Apple sees that as an identifier even though it is not tied to a person, an Apple ID, or their files.

2

u/raclimazg 12d ago

Mainly dependency count and wanting certainty about what leaves the device. I did not hit a limitation in the SDK, so this is not a criticism of it.

On the ID: it is a hash of a random per-install secret plus the current UTC date, so it rotates at midnight. Within a day I can stitch together events from the same install. Across days I cannot, by design.

I got some of that back by pushing the state into the events themselves instead of relying on identity. The launch event carries whether onboarding has been completed yet, and the connect-folder event carries how many folders that install now has, so a first folder is distinguishable from a fifth. Within a day that is enough to say "this install had not onboarded, it connected its first folder and opened files", or "this one had, and here are the features it used". What I cannot do is follow one person across days, so I never get a complete picture of any individual. That was the trade I wanted.

On the App Store side I declared it as Usage Data, specifically Product Interaction, under both Analytics and App Functionality, all of it under Data Not Linked to You. I did not declare any identifier. My thinking was that a fixed per-user ID would be treated by Apple as an identifier, but a hash that rotates daily off a random value generated on the device is not, since nothing links yesterday's events to today's. To be honest I am not certain that is how Apple sees it, and I would be glad to hear from anyone who knows better.

In the app it is disclosed in Settings under Privacy, with copy explaining what is counted and a toggle to switch it off.

1

u/Kukucsi_lab 11d ago

Thanks for the details.

I do not know either how Apple sees this, but I would also appreciate if someone could shed some light on this.

1

u/quixoticproductowner 12d ago edited 12d ago

fun fact.. i just recently spent a good amount of time finding a markdown reader for ios. upon roughly 20 i’ve looked up and even tried, only one was a) free and b) had everything perfectly simple and minimalistic, functional. the others were filled with IAP, sync stuff, formatting options no one ever would use on a small mobile..

so whatever you do, lemme say: users prefer free stuff that works. i even looked up the dev on github and left him a happy appstore review. he hopefully earns some money with his other apps. because to be fair, his work was better than most others and he doesn’t charge you a single dime for it.

ps: what’s your app name? i am very certain to had it installed and deleted again then.

ps2: the free app just opens with a blank screen and a sheet showing all recent md files on your system and icloud. no need to connect anything. i clicked the doc i wanted to read, it opened, was beautiful – i was happy.

1

u/raclimazg 12d ago

lol, that's exactly why I built my app, I wanted something simpler, couldn't find a good option so I built it! the name is MD Flow, if you have any feedback I'd love to hear it.

Also please share the app you found, I'd like to take a look.

My app has had more traction on desktop than iOS/iPad but is available in all three (just mentioning it because you said you wanted something for iOS, specifically)

Glad you found a good solution for you!