RORK LABJP
FREETRY — Rork announced on X that Rork Max is free to try for a limited time, a chance to touch the $200/month tier without paying up frontONESHOT — Rork Max claims to one-shot almost any app for iPhone, Watch, iPad, TV, and Vision Pro, including builds that lean on AR and 3DXCODE — Positioned as a website that replaces Xcode: one click to install on device, two clicks to publish to the App Store, powered by Swift, Claude Code, and OpusPAPERLINE — Rork acquired the app builder Paperline and says it will stay acquisitive to bring in engineering talentSKILLS — Rork's app-store-connect-cli-skills repo was updated on July 9, a sign the submission tooling keeps getting attentionMARKET — Gartner expects 75% of new applications to be built with low-code or no-code tools by the end of 2026, up from under 25% in 2020FREETRY — Rork announced on X that Rork Max is free to try for a limited time, a chance to touch the $200/month tier without paying up frontONESHOT — Rork Max claims to one-shot almost any app for iPhone, Watch, iPad, TV, and Vision Pro, including builds that lean on AR and 3DXCODE — Positioned as a website that replaces Xcode: one click to install on device, two clicks to publish to the App Store, powered by Swift, Claude Code, and OpusPAPERLINE — Rork acquired the app builder Paperline and says it will stay acquisitive to bring in engineering talentSKILLS — Rork's app-store-connect-cli-skills repo was updated on July 9, a sign the submission tooling keeps getting attentionMARKET — Gartner expects 75% of new applications to be built with low-code or no-code tools by the end of 2026, up from under 25% in 2020
Articles/Dev Tools
Dev Tools/2026-07-17Advanced

Shipping Notifications Without Asking First — Provisional Authorization in Rork Apps, and the Expo Snippet That Quietly Undoes It

iOS lets you start delivering notifications with no permission dialog at all, via provisional authorization. The catch: expo-notifications reports granted as false for provisional devices, so the registration snippet in Expo's own docs re-requests permission and fires the very dialog you were avoiding. Here's why granted lies, a hook that models authorization as five states, how to write notifications for quiet delivery, when to ask for the upgrade, and how to keep provisional out of your CTR.

Rork515Expo149expo-notifications7Push Notifications9Retention13

Premium Article

The opt-in rate on my wallpaper app's new drop notifications came in lower than I expected. The soft-ask screen was there. I was waiting for a moment when the value was obvious before asking. Structurally it was fine. And yet I was still asking people to commit to notifications they had never seen.

Which is when I remembered provisional authorization. It has been in iOS since 12, and it lets you start delivering notifications with no permission dialog whatsoever. Users see an actual notification first, then decide whether to keep it. Instead of getting cleverer about how you ask, you flip the order of the conversation. That felt more honest to me.

Then I started implementing, and the first thing I hit was that the registration code in Expo's own documentation is a trap.

The third option nobody reaches for

Push opt-in has had two plays. Fire the OS dialog on launch, or slide a soft-ask screen in front of it first. The second is clearly better, but both ask users to imagine the value of a notification that hasn't arrived yet.

Provisional authorization starts somewhere else. Add .provisional to UNAuthorizationOptions and the system shows no dialog. Notifications go out quietly and appear only in Notification Center, where they carry Keep and Turn Off buttons. The user decides with the real thing in front of them.

Apple's reasoning is clean: it is not actually possible for someone to make an informed choice about your notifications until they have seen what you send.

From Expo you request it with allowProvisional.

import * as Notifications from 'expo-notifications';
 
const settings = await Notifications.requestPermissionsAsync({
  ios: {
    allowAlert: true,
    allowSound: true,
    allowBadge: true,
    allowProvisional: true,
  },
});

No dialog. It resolves without user interaction and you can start sending. So far, so documented.

What provisional grants, and what it quietly withholds

Leave this fuzzy and you will eventually be staring at notifications that deliver successfully and that nobody sees, with no idea why. Requesting an option is not the same as receiving it.

Surface Provisional Full (AUTHORIZED)
Notification Center Yes Yes
Banner No Yes
Lock screen No Yes
Sound No Yes
App icon badge No — not granted even if requested Yes
Permission dialog Never shown Shown
timeSensitive breakthrough No Yes

The badge row deserves your attention. The snippet above requests allowBadge: true, and on a provisional device the badge is still not granted. Open the notification settings on a real device and you'll see Notification Center delivery allowed while the badge toggle sits off. The request went through; the permission did not.

So if your unread count lives on the badge, that path is dead on arrival for your entire provisional cohort. setBadgeCountAsync throws nothing. It simply does nothing. I lost half a day to that. Bugs that don't raise are worse than bugs that do.

timeSensitive doesn't apply either. If you need to break through, that capability lives outside provisional.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Why expo-notifications returns granted: false under provisional authorization, how Expo's own registration snippet turns that into a surprise permission dialog that drops deliverable devices, and the drop-in fix
A concrete map of what provisional actually grants versus what it silently withholds — badges are never granted even when you request them, and timeSensitive interruption does not apply
Working implementation: a five-state authorization hook, notification copy rewritten for Notification Center-only delivery, upgrade timing rules, and cohort separation so provisional doesn't wreck your CTR
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-06-13
You Only Get to Ask Once — Implementing a Notification Soft-Ask in Your Rork App to Lift Opt-In
On iOS, once a user denies the notification prompt you can never show it again. In a Rork (Expo) app, instead of firing the system prompt on launch, we add our own soft-ask screen and only request permission once the value has landed. Built with expo-notifications, covering Android 13 POST_NOTIFICATIONS, a recovery path after denial, and opt-in measurement.
Dev Tools2026-06-16
Keeping Expo Push Tokens from Slipping Through the Cracks in Production
After adding re-engagement push to a Rork-generated Expo app, the delivered count came in well below the active install count. The cause was missed token updates and stale tokens left to pile up. Here is the lifecycle I settled on, with code: registration, refresh, server storage, and pruning.
Dev Tools2026-06-14
Stop Burning Your One Push-Permission Shot on App Launch — Pre-Prompt Priming for Rork Apps
If your Rork (Expo) app fires the OS push-permission dialog at launch, every 'Don't Allow' tap closes that channel forever — iOS won't let you ask again. Here's how a self-built pre-permission screen lifts your opt-in rate, with the Expo code to do it.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →