subscription-push-lifecycle

Pushlane Streak Protection Push Notifications

Build streak reminder push flows from verified progress, user timezones and real cutoff rules, with idempotency, quiet hours and strict completion exits.

A streak protection push notification is useful only when the streak is real, the cutoff is correct and the action in the message can still preserve it. If any of those facts is stale, a motivating reminder becomes a trust defect.

Streaks can support fitness, learning, journaling, mindfulness and other subscription products. They can also create pressure that has little to do with customer value. Pushlane should automate the verified reminder path, while the product remains responsible for a fair streak definition and an easy way to pause notifications.

This guide treats timing and progress as data contracts. It does not assume that daily streaks improve retention or prescribe a vendor-wide send hour.

Define what counts before writing copy

Write the streak policy in plain language:

  • which completed action advances the streak;
  • which timezone determines the day;
  • when the daily or weekly window closes;
  • whether grace periods, freezes or rest days exist;
  • how backfilled and offline activity is handled;
  • what happens when the user changes timezone;
  • whether the user can disable streak reminders separately.

The product database should calculate streak state. Do not reconstruct it inside a marketing flow from a loose count of historical events. Offline sync, retries and cross-device activity make that calculation unreliable.

Publish an event when current state changes, for example:

streak_risk_window_opened
  properties:
    streak_id
    current_count
    cutoff_at
    qualifying_action
    reminder_version

Use an idempotency key such as streak_id + cutoff_at + reminder_version. The same risk window must not produce two flow entries after a server retry.

Respect permission and preference

Apple's notification design guidance frames notifications as timely, high-value information. Ask for push permission after the person chooses a goal or enables a reminder, not at the first launch with no context.

Offer controls for:

  • streak reminders on or off;
  • preferred reminder window;
  • quiet hours;
  • rest days or paused goals;
  • neutral versus celebratory progress messages, when tone is a meaningful product choice.

A system-level authorization does not mean every streak message is welcome. Keep the product preference as an additional eligibility check.

Build the risk-window flow

The safest trigger is a server-calculated risk window, not a nightly batch that guesses from the last app open.

streak_risk_window_opened
  -> verify reminder preference and supported device
  -> verify current timezone and local quiet hours
  -> exit if qualifying action already completed
  -> exit if goal paused, freeze applied or cutoff passed
  -> send one reminder with a current deep link
  -> stop on qualifying completion

Schedule the risk event far enough before cutoff that the action remains practical. A ten-minute lesson, a one-hour workout and a daily journal entry need different lead time. Use your product's completion distribution and customer feedback, not a generic "best time."

The Pushlane send-time guide provides a framework for event-relative timing and local delivery windows.

Recheck the contract at send time

Before rendering the notification, confirm:

  1. The streak is still active.
  2. The current count matches the message context.
  3. The qualifying action is incomplete for this window.
  4. The cutoff has not passed in the current timezone.
  5. A freeze or rest day has not removed the risk.
  6. The destination can still open the promised action.
  7. No other owner already sent the same reminder.

If the app syncs activity late, prefer suppression over a false warning. An unavailable state read is not the same as an incomplete action. Retry the read when safe, then suppress honestly if current truth cannot be established before the cutoff.

Do not use a persistent current_streak push variable unless the value is refreshed reliably. Pushlane resolves user attributes at send time, but an attribute is only as current as the last write from your product.

Write copy that preserves agency

State what remains possible without threatening loss or shame.

Simple practice window

Today's practice window is still open

Complete your saved session before the daily cutoff.

Specific next action

One review keeps today's progress active

Your due vocabulary set is ready.

Freeze available

Choose how to handle today's goal

Practice now or use the streak option available on your account.

These are original templates, not observed winners. Do not insert a count, deadline or freeze claim unless the send-time record supplies it. Avoid copy such as "Do not lose everything" when the product only resets a counter.

The destination should explain the streak rule and offer reminder controls. Never trap the user in a task screen without a way to pause future messages.

Keep achievement messages separate

A risk reminder says an action remains incomplete. An achievement notification says a durable milestone already happened. Those are different flows with opposite predicates.

Use separate event names, idempotency keys and frequency rules. Completion must cancel the risk flow before it can enter the achievement flow. The milestone guide covers durable achievement records and duplicate prevention.

This separation also improves debugging. If a customer receives "Your streak is at risk" after "Seven days complete," the team can trace ownership and order instead of blaming generic timing.

Do not confuse streak risk with churn

A missed daily action does not prove subscription churn. The customer may be traveling, resting, using a different feature or intentionally changing routine. Keep streak state separate from:

  • entitlement and renewal status;
  • cancellation or expiration;
  • billing issues;
  • broader product inactivity;
  • inferred propensity scores.

RevenueCat lifecycle events can stop or reshape a subscription-specific flow, but they should not fabricate product progress. Likewise, a long streak does not prove that a renewal was caused by reminders.

Measure completion and customer cost

Use the qualifying product action as the primary response outcome:

protected-window completion rate = eligible risk windows completed before cutoff / eligible risk windows

Report operational layers beside it:

  • risk windows created and deduplicated;
  • suppressions for completion, pause, freeze, quiet hours and stale state;
  • supported reachable devices;
  • provider-accepted sends and attributable opens;
  • qualifying actions completed before cutoff;
  • reminder pauses and marketing opt-outs;
  • false-warning support reports;
  • duplicate or post-completion sends.

An eligible holdout can estimate incrementality when the cohort is large enough, but a holdout should still retain the product's normal streak display and controls. Report absolute differences and uncertainty. The Pushlane metrics guide explains why an open rate cannot substitute for verified completion.

A good streak notification is a precise courtesy: the chosen goal is still achievable, the right action is available and the customer remains in control. Make those facts provable before the flow is allowed to send.

Pushlane Streak Protection Push Notifications