Shipping, then listening
The first round of real tester feedback and the small, high-leverage fixes it produced: grid spacing, free typing, jump buttons, easing early ads, and a well-timed review prompt.
You can test your own app for weeks and still miss the things that annoy real people in the first five minutes. The fastest quality gains in this whole project came from shipping to testers and then just fixing what they flagged.
The grid felt cramped
The board filled the screen edge to edge, and the outer cells were slightly clipped. The first fix gave it a one-cell margin at default zoom. A tester immediately replied: looks good zoomed out, but zoom in and the margin is gone. The margin had been empty viewport space, not part of the board, so panning while zoomed let the cells reach the edge again. The real fix was to bake the gutter into the board content and the pan bounds, so it scales with the zoom and is always there. Two rounds of feedback to get one detail right, and worth it.
The typing fight
Players reported that typing an answer longer than the slot caused characters to
get substituted mid-word. The cause was a maxLength on the input, capping it to
the answer length. On some Android keyboards that cap triggers substitution
during composition. The fix was to remove the cap entirely. Let people type
whatever they want; a too-long guess simply does not match. Never fight the
keyboard.
Two buttons people did not know they needed
The level list is a long winding path of 100 nodes. Testers wanted to jump. So I added two floating buttons: one scrolls to the top, one scrolls to the last unlocked level (the place you actually play, not the locked bottom). Each hides when you reach its destination. Small, but it removed a real friction nobody had articulated until they had the app in hand.
Ads that did not ambush new players
A tester installed fresh and got hit with a 30-second interstitial after the first couple of levels. Brutal first impression. The fix was twofold: no interstitial until more than two levels are done (a fresh-install grace), and a minimum gap between interstitials so finishing levels quickly does not trigger an ad every time. The banner stayed; it is the full-screen ad early that stings.
Asking for a rating at the right moment
I added an in-app review prompt, but the timing is the whole game. It fires right after the positive moment of completing a level, at a few milestones (3, 10, 25, 50, 100 levels), at most once per milestone. And if the review prompt fires, that level's interstitial is skipped, so the review sheet is never buried under an ad. Ask when people are happy, not when they are stuck.
A bug only real money finds
One tester bought a product, and the buy button still showed the price, then errored "already purchased" on a second tap. The purchase had succeeded at Google but the entitlement was never attached in RevenueCat, so the app never saw it as owned. Beyond fixing the dashboard, the durable fix was code: catch the "already purchased" error and restore instead of erroring, so any future stuck user self-heals.
The lesson
Your own testing finds the bugs. Real testers find the friction. They are different categories, and the friction is usually cheaper to fix and more valuable than you expect. Ship early to a small group, read every report, and fix the boring stuff. It compounds.
Next, and last: the refactor I put off until the copy-paste finally bit me.