Writing/RevenueCat
What I check on a paywall before a release
It is the one screen where a defect has a price, and the one screen you are least likely to open twice. So it gets its own checklist.
The paywall is the only screen in the app where a defect converts directly into lost money, and it is the screen I opened least, because I built it early and after that I was always testing something else. So before the release I went through it line by line. Eight things came out, none of them hard, all of them the kind that quietly cost money.
The close button that did nothing
It was drawn, it was in the right corner, and its tap target had been sized to the glyph rather than to a finger. On top of that the glyph was rendering black on a dark panel, so on some devices it was a button you could neither see nor press.
A paywall you cannot leave is not a firm sales technique, it is a bug report waiting to be written as a one-star review. It is also the exact thing a store reviewer will find, because leaving a screen is the first thing anybody does when they are looking for problems.
The layout that settled after it arrived
Opening the paywall showed the whole screen shift about a second in. Two blocks were conditional on the store having answered: a loading row while packages were in flight, and the renewal note under the button, which only rendered once a real product existed.
The screen is a space-between column, so a height change anywhere redistributes everything above it. The loading row vanished at the same moment the footer grew, and between them they moved the headline, the feature list and both plan cards. The user sees a screen that cannot decide what it is while being asked for money.
“Reserve the space before the network answers. A price that arrives is fine. A price that arrives and pushes the button is not.”
The customer who already owned it
The worst one. If the store already considered you a subscriber but the app had not reconciled that yet, the purchase attempt failed and the screen simply stopped. No restore, no explanation, no way forward. Somebody who was already paying was shown a dead end when they tried to pay again.
That path now offers a restore instead of failing, and the tier is reconciled from RevenueCat on the server rather than trusted from the client. Reconciled in both directions too, which was its own small fix: the sync only ever upgraded people, so a lapsed subscription stayed Pro in our database until somebody noticed.
The pattern underneath
The pattern is worth more than the eight fixes. A screen you build early and then stop using will drift, and the purchase screen is the worst candidate for that because it is the one you are least likely to open and the only one where drift has a price. It is now on the list I walk before every release, which is where it should have been from the start.
