Analytics

Push Notification Opt In Timing That Earns a Yes

A worked experiment plan for push permission timing: pick the demonstrated-value trigger, keep a re-askable pre-prompt in front of the one-shot OS prompt, and judge arms on retained-and-reachable users — not raw opt-in rate.

Alex KhvoinitskiiAugust 17, 202514 min read

TL;DR: The OS push prompt is a one-shot asset: iOS shows it once, Android 13+ twice. Ask only after the user hits a demonstrated-value moment, keep a re-askable in-app pre-prompt in front of it, and judge the change on retained-and-reachable users at day 30 — not raw opt-in rate.

Your lifecycle team owns push reach, and reach starts with a permission you cannot re-ask for. Get push notification opt in timing wrong and the decline is basically permanent: on iOS the system prompt appears once per install, and on Android 13+ the system stops showing it after two declines. After that, the user's only path back is a manual trip to system settings (Klaviyo).

Most apps still fire that prompt on first open, before the user has seen anything worth subscribing to. OneSignal's prompting guide calls first-launch prompting the single biggest cause of low opt-in rates (OneSignal docs). The fix is not better copy — Apple and Google do not let you customize the prompt text anyway (Batch docs). The fix is when you ask, and what you put in front of the ask.

This is the same discipline as measuring automation ROI: separate the number that is easy to see from the number that decides. Below is a worked test plan for moving the prompt to a value-based trigger, with the in-app and OS layers split apart and retention — not opt-in percentage — as the verdict.

Why the moment you ask decides the answer

Treat the OS prompt as inventory with a hard limit. iOS gives you one shot; Android 13+ gives two. A "Don't Allow" on iOS is final until the user re-enables notifications in Settings, and Google Play Protect can even revoke permission from long-dormant Android users who once said yes (Batch docs).

The baseline numbers say the inventory is already shrinking:

  • Batch's Great Push Notifications Benchmark 2025 reports Android opt-in rates falling from 85% to 67% in one year after Android 13 adopted iOS-style consent; iOS moved from 58% to 56%, for a 61% overall average (Batch, 2025).
  • OneSignal cites a 43.9% average initial opt-in rate on iOS, while web push opt in sits near 10% (OneSignal).
  • Airship's 2025 benchmarks put a 60% opt-in rate in the top decile and under 29.8% in the bottom decile across studied apps (Airship, 2025).

Two consequences follow. First, a decline you could have deferred is a subscriber you probably lost. Second, an opt-in squeezed out of a cold user is worth less than it looks: opted-in-but-annoyed users mute the channel or churn, and every push opt out is a subtraction from reach you already counted. The question of when to ask for push notification permission is therefore a retention question before it is a conversion question.

Define a value-based trigger before you ask

Ask at the first moment the user has experienced something a notification would have improved. That is the value-based trigger: an event that proves the user reached the part of the product your pushes are about.

Both Apple and Google recommend explaining notification value before requesting authorization, and every major push vendor's guidance lands in the same place: the ask converts when it follows a value moment — completing onboarding, saving an item, following a topic, placing a first order, finishing a first workout (OneSignal, Klaviyo).

Build your trigger table like this:

Candidate trigger event Why it earns the ask Disqualifiers
Completed first order or booking User just felt the "where is my stuff" moment tracking solves Guest checkout, order cancelled
Saved, favorited, or followed an item/topic User named what they want to hear about First session under 60 seconds
Finished onboarding and hit the activation event User reached the product's promise once Activation took multiple sessions
Third session in first week Repeated intent without a single anchor moment Any prior prompt decline
Enabled a feature that pushes (alerts, reminders) User opted into the job the notification does —

Two rules keep the trigger honest:

  1. The event must predict the notification's value, not just engagement. A meditation app asking after session one sells "tomorrow's reminder." Asking after a purchase sells shipping updates. If you cannot finish the sentence "a push here would have helped because...", the event is wrong.
  2. Negative moments are off-limits. Never ask right after a failed payment, a crashed flow, a support ticket, or a paywall "no." The prompt inherits the mood of the screen behind it.

Most iOS push notification best practices stop at "explain the value first." The trigger table turns that advice into an event your analytics can actually fire on.

On iOS there is also a gentler option that skips the ask entirely: provisional authorization (.provisional in UNAuthorizationOptions, iOS 12+) delivers notifications quietly to Notification Center with no prompt at all. Each notification carries "Keep..." and "Turn Off" buttons, so users vote on real content instead of a hypothetical (OneSignal). For most subscription apps this is the right opening move: build a provisional audience, then ask for full authorization at the first strong value moment.

Separate the in-app pre-prompt from the OS authorization

A pre-permission prompt (also called a soft prompt or push primer) is your own in-app screen that explains what you will send and why it is worth it, shown right before the native dialog. The crucial mechanical fact: dismissing it does not consume a system prompt attempt (OneSignal). That means your app keeps a re-askable layer even though the OS layer is one-shot.

Design the two layers as separate decisions:

Layer Attempts Content control On "no"
In-app pre-prompt Unlimited, on your cadence Full: copy, creative, timing Defer; re-ask after a set interval
OS system prompt 1 on iOS, 2 on Android 13+ None: fixed OS text Permission gone; settings path only

The pre-prompt has two buttons that matter: "Turn on notifications" fires the real OS prompt immediately; "Not now" suppresses everything and starts a re-ask timer. OneSignal's playbook suggests re-asking on a cadence such as every two weeks, and Pushwoosh's primer exposes a minInterval throttle (for example, once per week) for the same purpose (OneSignal, Pushwoosh).

A well-built primer is also state-aware — it reads the current authorization status and does something different in each state:

Authorization state Correct action
notDetermined Show the pre-prompt at the value trigger; accept fires the OS prompt
authorized Show nothing; spend zero UI on the question
provisional Show nothing now; promote to full authorization at the next value moment
denied Never re-ask in-app; show a settings deep-link card where notification value is obvious

That denied row is recoverable, just not through a prompt. Batch's 2025 benchmark reports re-opt-in scenarios earning about 11% click rates on Android and 9% on iOS — small, but these are users the system layer already lost (Batch, 2025). Route them to a persistent in-app surface (order tracking screen, settings page) with a deep link into system notification settings, which is exactly the win-back path in the onX case below.

The split is not theory. onX Hunt ran it publicly with Phiture: facing a 49.7% new-user iOS opt-in rate, they replaced the direct system prompt with a two-button in-app pre-permission window — accept triggered the real authorization, dismiss preserved it — and sent already-opted-out users a win-back campaign deep-linking into iPhone settings. Overall opt-in rose 10.6% (Phiture case study). Leanplum's documentation, a vendor source, claims pre-permission prompts have lifted opt-ins by as much as 182% and recommends A/B testing both message content and timing — treat that ceiling as directional, not a promise (Leanplum docs).

The permission prompt experiment plan

Choosing to keep push permission prompts out of the wrong moment is a testable change, so run it like one. Here is the plan to fill in; the numbers below are a synthetic worked example, not a benchmark.

Hypothesis. Moving the ask from first open to a demonstrated-value trigger raises the accept rate among prompted users enough to grow retained-and-reachable users at day 30 — even if fewer users see the prompt in week one.

Variants.

Arm What happens
A — Control OS prompt on first open, as today
B — Value trigger In-app pre-prompt on the value event; OS prompt only on "Turn on"; "Not now" re-asks every 14 days
C — Provisional first (iOS) .provisional authorization at install; promote to full prompt at the value event

Audience and randomization. New installs only, randomized per user. Exclude reinstalls, existing authorized or denied users, and anyone already in a messaging experiment. Freeze the audience definition before launch — a fuzzy denominator contaminates both arms, the same rule applied in our monthly-to-annual conversion experiment.

Metrics. Pick one primary metric before launch:

  • Primary: reachable-and-retained at day 30 — users both still authorized and retained — because it prices the tradeoff between reach and regret.
  • Secondary: OS-prompt accept rate among shown, pre-prompt accept rate, deferred-to-authorized conversion, day-7 retention.
  • Guardrail: push disable / mute rate and uninstall rate in each arm.

Worked example (synthetic inputs). Say each arm gets 5,000 new installs:

Step Arm A — first open Arm B — value trigger
See OS prompt 5,000 2,232 (62% hit trigger = 3,100; 72% accept pre-prompt)
OS accepts 2,200 (44%) 1,942 (87%)
Deferred re-asks convert 0 +260
Denied users re-enable via settings +56 (2% of 2,800) +6 (2% of 290)
Total authorized ≈2,256 ≈2,208
Retained at day 30 35% → ≈790 41% → ≈905
Reachable and retained ≈790 ≈905 (+15%)

Read it carefully: arm B authorizes slightly fewer users than the control, yet wins on the metric that matters because the opt-ins it earns come from users who already felt the value. It also banks roughly 1,900 unspent prompts — installs that never hit the trigger were never asked and can still be prompted later. In arm A those same users are a permanently denied pool.

Decision rule. Promote the variant if reachable-and-retained at day 30 beats control by your pre-set margin (the synthetic gap here is +15%; set yours before launch) and the push disable rate does not rise. Roll back if total authorized drops more than ~15% with no retention gain — a reach-only win is not the goal.

Minimum run. One full value-event cycle plus a 30-day retention window — typically four to six weeks total. Do not call the test on week-one opt-in percentages; the deferred arm keeps converting for two re-ask cycles. If your analytics supports it, define each arm as a behavioral cohort at install and read Return On or After retention against it, which is how Amplitude's retention analysis is designed to be sliced (Amplitude docs).

Compare downstream retention, not just opt-in rate

The opt-in percentage is the metric everyone screenshots, and it is the wrong verdict. Three things hide behind it: unspent prompt inventory (a "not now" is not a "never"), provisional reach that never touched a prompt, and opt-ins that mute or churn within a month.

So what push notification opt in rate should you actually expect? The public ranges above — roughly 56% on iOS and a 61% overall average in Batch's 2025 benchmark, with Airship's deciles spanning under 30% to 60%+ — are context, not targets. Your own push opt in rate against the control arm is the only honest baseline: if arm A gives you 44% and the trigger arm lifts reachable-and-retained users, the industry number is trivia.

Remember who the opt-ins are: users who opt in for push notifications at the value moment have already felt what the channel does. They are the cohort least likely to mute you next week, which is exactly why the retention read comes last in the plan rather than never.

The reason to bother at all is downstream. Opted-in customers make 13% more purchases than opted-out ones in Airship's 2025 data, with top performers up to 39% — but that lift exists only while the channel stays welcome. Batch's same benchmark shows contextual, event-triggered pushes averaging a 14.4% open rate versus 4.19% for generic blasts. Earn the opt-in at the value moment, then keep the pressure bounded with user-centric caps the way Braze's frequency capping models it, or you will spend the permission you just bought.

That is also where timing meets the rest of the lifecycle. The consent clock on push works like the consent rules in SMS abandoned-cart timing — the channel differs, but "ask when the value is fresh" is the same law. And once push is earned, it slots next to the other lifecycle windows, such as what to send during a subscription grace period.

FAQ

How do users opt back in after declining push permission?

Only through the OS: on iOS, Settings → Notifications → your app; on Android, the app's notification settings. You cannot re-show a consumed system prompt. The practical move is a persistent in-app surface — order tracking, account settings — with a copy block and a deep link into that settings screen, shown where notification value is obvious. Re-opt-in campaigns earn roughly 9-11% click rates in Batch's 2025 benchmark, so treat it as recovery, not a strategy.

Does delaying the push prompt hurt notification reach?

Delayed is not denied — a user who never sees the prompt keeps their "yes" unspent, which is strictly better than a burned decline. The real reach risk is never asking at all: users who hit the trigger and slip past the pre-prompt need a fallback surface, and Android installs idle long enough can lose the grant to Play Protect's dormancy revocation.

Should the pre-prompt live inside onboarding or after it?

After the moment onboarding earns. An onboarding carousel slide explaining notifications is better than a cold OS prompt, but it still asks before value exists. Put the pre-prompt on the trigger event itself — the screen right after the saved item, placed order, or finished first session — because that is where the notification's job is self-evident.

Answer clarity notes

  • Dates: source links reflect each vendor's documentation or study window as cited; Batch benchmark figures are from its 2025 edition and Airship figures from its 2025 report. Check current OS behavior — prompt attempt limits and provisional delivery have changed across iOS and Android versions before.
  • Scope: written for lifecycle, product, or subscription-operations leads at mobile or consumer subscription businesses. Web push and SMS consent rules differ and are out of scope beyond the linked articles.
  • Evidence: OS mechanics (prompt limits, provisional delivery, state-aware primers) come from vendor documentation (OneSignal, Pushwoosh, Klaviyo, Batch). Opt-in benchmarks are vendor-published aggregates with their own methodologies. The onX/Phiture case is a named public case; Leanplum's 182% figure is a vendor claim labeled as such.
  • Do not infer: the experiment table uses explicitly synthetic inputs to show the arithmetic; its 62%, 72%, 87%, and retention rates are planning placeholders, not guarantees or measured results. Replace them with your own funnel and retention curves, and treat published opt-in ranges as context rather than targets.

Sources


Moving the prompt is a small code change wrapped in a measurement problem: triggers, state handling, holdouts, and a retention read on the stack you already run. That'sGonnaHelp can audit that setup — book an automation audit before you burn another install's one shot.

A

Alex Khvoinitskii

Founder, That'sGonnaHelp

Founder of That'sGonnaHelp. Building growth and automation systems since 2021 — GTM, traction, retention, and revenue — for SaaS, FinTech, and e-commerce clients, from early-stage brands to global exchanges.

Related articles

Discuss your project