RORK LABJP
RORKMAX — Rork Max builds native Swift apps instead of React Native, targeting iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageNATIVE — Rork Max unlocks capabilities React Native can't reach: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, HomeKit, NFC, and Core MLPUBLISH — Two-click App Store publishing cuts the steps between generating an app and shipping itSIM — A browser-based streaming iOS simulator lets you test in a real Apple environment without Xcode or a MacSTANDARD — Standard Rork turns a plain-English description into working React Native (Expo) codePRICING — It's free to start, paid plans begin at $25/month, and Rork Max is $200/monthRORKMAX — Rork Max builds native Swift apps instead of React Native, targeting iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageNATIVE — Rork Max unlocks capabilities React Native can't reach: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, HomeKit, NFC, and Core MLPUBLISH — Two-click App Store publishing cuts the steps between generating an app and shipping itSIM — A browser-based streaming iOS simulator lets you test in a real Apple environment without Xcode or a MacSTANDARD — Standard Rork turns a plain-English description into working React Native (Expo) codePRICING — It's free to start, paid plans begin at $25/month, and Rork Max is $200/month
Articles/Business
Business/2026-07-19Advanced

When Bumping Push to Three a Day Cut Next-Week Returns — Field Notes on Measuring Notification Frequency by D7 Retention and Opt-Out Rate

The assumption that heavier push means more returns was quietly eroding my D7 retention. These are field notes on re-measuring notification frequency by install-cohort D7 and opt-out rate, and walking from three a day back to one.

retention10push-notification2cohort-analysisD7engagement

Premium Article

Returns on a study-log app I built with Rork had stalled, so I turned up the push notifications. What had been one a day became three — morning, noon, night. The logic was plain: more reminders, more comebacks.

For the first few days, push-driven opens did climb. Looking at that one number on the dashboard, I was satisfied for a while. Then two weeks later, when I lined up D7 retention (the share still returning seven days after install) week by week, the line was pointing down. The cohort from the week I raised frequency had slipped from 14.2% to 9.8% on D7.

I added notifications because I wanted people back — and those notifications were speeding their exit. These are my notes on unwinding that assumption with numbers. It's a small app I run as an indie developer, but deciding frequency by cohort instead of by feel should hold at any scale.

Push-driven opens only looked like they were rising

My first stumble was watching the wrong metric. "Times someone tapped a notification to open" naturally rises somewhat when you send three times as many. More sent means more taps in absolute terms — that isn't success.

What I actually wanted was whether a user was still coming back a week later, notification or not. I should have recorded push-driven opens and organic, self-initiated opens separately from the start.

// lib/analytics.js — record opens by their trigger
// Without this split, you overrate the notifications.
 
export function trackAppOpen({ source, userId }) {
  // source: 'push' | 'organic' | 'deeplink'
  analytics.capture('app_open', {
    userId,
    source,                          // ← the lifeline for later analysis
    ts: Date.now(),
  });
}
 
Notifications.addNotificationResponseReceivedListener(() => {
  trackAppOpen({ source: 'push', userId: currentUser.id });
});
 
if (!launchedFromNotification) {
  trackAppOpen({ source: 'organic', userId: currentUser.id });
}

Once I split by source, the picture sharpened. Push-driven opens rose about 1.9x per week, while organic opens actually dropped 12%. Users I dragged back with notifications were losing the habit of opening on their own. Summed together it wasn't a gain — it was eroding D7.

Cut cohorts by install week and line up the metrics

To claim "more push made it worse," you have to compare before and after on the same ruler. I grouped users by their install week and, per cohort, lined up D1, D7, D30, and opt-out rate.

Install weekPush frequencyD1D7D30Opt-out rate
Week 1 (baseline)1/day31.4%14.2%6.1%4.3%
Week 23/day30.9%11.6%9.7%
Week 33/day31.1%9.8%13.1%

D1 barely moved. Frequency doesn't touch the first-day experience, which makes sense. What moved was D7 and opt-out rate. The two heavy weeks kept sliding on D7, and the share of users who revoked notification permission jumped from 4.3% to 13.1%. Once a user opts out, they never get a notification again. I was trading immediate returns for the future return channel itself.

The cohort SQL isn't hard. As long as the event log carries source, the rest is aggregation.

-- D7 retention by install week
-- installs: user_id, install_date
-- opens:    user_id, ts, source
SELECT
  date_trunc('week', i.install_date)               AS cohort_week,
  count(distinct i.user_id)                         AS installs,
  count(distinct case
    when o.ts::date = i.install_date + interval '7 day'
    then o.user_id end)                             AS d7_returned,
  round(100.0 * count(distinct case
    when o.ts::date = i.install_date + interval '7 day'
    then o.user_id end) / count(distinct i.user_id), 1) AS d7_rate
FROM installs i
LEFT JOIN opens o ON o.user_id = i.user_id
GROUP BY 1
ORDER BY 1;

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
How to slice install cohorts by the week you changed frequency and line up D1/D7/D30 against opt-out rate
How to break the illusion that push-driven opens are rising while total D7 falls, by separating push opens from organic ones
The measured recovery from cutting three-a-day to one, and where to draw the line on which users can take more
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

Business2026-07-02
Putting Your Own Control in Control Center — ControlWidget Design That Adds Launch Paths to a Rork Max App
Implementing iOS 18 ControlWidget to place custom controls in Control Center, the Lock Screen, and the Action button: working ControlWidgetButton and ControlWidgetToggle code, its value as a launch path, and how it feeds retention.
Business2026-06-22
A Wallpaper App's Real Work Starts After Launch — Content, Retention, and Revenue Notes from Running One on Rork
A wallpaper app is decided less by its launch and more by how you tend it afterward. Building on a Rork implementation, here are field notes on scheduled publishing that keeps content fresh, onboarding that survives the first week, and a revenue setup whose per-download return doesn't thin out over time.
Business2026-05-11
Building Fortune & Manifestation Apps with Rork — Daily Content Delivery and Retention Design from 50M+ Downloads
Fortune apps lose most users in three days. A Rork design for daily delivery, push timing, and widgets that turns the niche into a habit.
📚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 →