UX teardown · 04
You only get to ask once.
Crate asks for notification permission before the shop has finished loading. On iOS that prompt fires exactly once per install. Tap "Don't Allow" and the app can never show it again. Getting it back means the user going into Settings, finding Crate in a list of ninety apps, and turning it on themselves. Crate spent its one ask on a stranger who had not yet seen a single product.
Before
"Crate" Would Like to Send You Notifications
Notifications may include alerts, sounds and badges.
One shot, spent on a stranger.
After
✓
Order placed
Arrives Tue 9 Sep to Fri 12 Sep
Want a ping when it ships?
We'll message you when your mug is dispatched, and again when it's out for delivery.
Yes, notify me
Not now
The system prompt has not fired yet.
Nobody chose the moment. The tutorial did.
Requesting permission is one call. The obvious place to put it is where the app starts, because that is where you are already writing setup code, and it is where every tutorial puts it. The ticket says "ask for notification permission" and says nothing about when.
It survives design review because there is nothing to review. The control is Apple's, the copy is Apple's, and the product wrote neither. No screen in the app looks wrong. The only decision anyone made was a line number, and a line number does not show up in a design critique.
Why it hurts
The screen is perfect. The moment is not.
Same four steps as every interaction, run against the prompt as it ships:
1
Filter: passes, and that is the trap. It is the system alert, pixel for pixel, in a shape every iPhone owner has seen a thousand times. Nobody questions a native control.
2
Seek: fails. The user came to look at things people made. They are being asked about an ongoing relationship with a shop whose products have not finished loading behind the dialog.
3
Act: fails fast, and rationally. With nothing to weigh, "Don't Allow" is the correct tap. Dismissing costs nothing and deciding costs attention. The user is not being careless. They are being sensible.
4
Store: fails. What sticks from the first two seconds is not the shop. It is that this app wanted something before it gave anything.
Three of four fail on a control the product did not design, using copy it did not write. The entire defect is when it fired.
The fix
Let the order do the asking.
Not new copy. The same prompt, moved to the first moment the user has a reason to want it. Somebody who just spent thirty-four dollars on a mug has an obvious interest in knowing when it ships.
01
Ask in your own UI first. That is the whole mechanic.
Put your own sheet in front of the system one, and only fire Apple's prompt when somebody has already said yes to yours. A no in your sheet costs you nothing, because you can ask again next week. A no in Apple's costs you the channel for the life of the install. It has a name, pre-permission priming, and it is the single highest-leverage thing in this teardown.
02
Treat it as a budget of one.
iOS shows that dialog once per install. After the user answers, further requests return the stored answer and display nothing at all. There is no second attempt to design, no better wording to try later. Everything you would normally learn by iterating, you have to get right the first time.
03
Name the notification, not the permission.
"Want a ping when it ships?" is not a request for access. It is an offer of a service the user already wanted, and permission is the incidental cost of accepting it. Say which messages, and say what you will not send. Vague value earns a vague no.
04
This was never about notifications.
Camera, microphone, location, contacts, calendar, tracking, the app store review prompt. Every one of them is a one-shot ask with the same shape. Fire it on launch and you have spent it on somebody with no reason yet to say yes.
The rule worth stealing
Earn the ask, then make it.
A permission prompt is not a form field you can re-ask. It is one non-renewable request, and it is worth exactly as much as the reason you have given for it. Give the reason first. Then ask.