5.2 KiB
5.2 KiB
Pixel Definition: iOS Day-7 Subscription Promo Half-Sheet
Background
- Project: iOS: Show subscription half-sheet promo to new installers who don't see it during onboarding
- Android counterpart: Grow active subscriptions by increasing paywall impressions with a day 7 promo half-sheet — the iOS implementation follows the same approach and target audience as Android
- Origin request: Request origin for iOS subscription promo half-sheet entry point — origin value
funnel_modal_ios__subscriptionnudge(Android equivalent:funnel_modal_android__subscriptionnudge) - We are adding a new half-sheet modal for existing users (7+ days since install) who have never seen any subscription offer. The modal reuses the pre-existing
SubscriptionPromoLaunchViewUI. - Existing subscription promo pixels already cover related audiences:
m_privacy-pro_onboarding_promotion_impression/tap/dismiss— users who see the promo during onboardingm_privacy-pro_skipped_onboarding_promotion_impression/tap/dismiss— reinstallers who skipped onboarding (7+ days)
Objective
- Define three new pixels (impression, tap, dismiss) for the day-7 existing-user promo half-sheet.
- Mirror the parameter shape of the existing
m_privacy-pro_skipped_onboarding_promotion_*pixels to allow cross-audience comparison. - These are permanent pixels (no expiry) — the feature is not an experiment.
- The origin value
funnel_modal_ios__subscriptionnudgeflows downstream automatically tom_privacy-pro_offer_screen_impressionandm_subscribewithout additional work.
Testing the feature
- Feature is implemented in:
iOS/DuckDuckGo/SubscriptionPromo/SubscriptionPromoExistingUserCoordinator.swift - Test paths:
- Install app, complete or skip onboarding
- Wait 1 minute (1-min override active — revert to 7 days before shipping)
- Background and re-foreground app → promo half-sheet should appear
- Verify
m_privacy-pro_existing_user_promotion_impressionfires on display - Tap CTA → verify
m_privacy-pro_existing_user_promotion_tapfires and subscription flow opens with originfunnel_modal_ios__subscriptionnudge - Re-install and dismiss instead → verify
m_privacy-pro_existing_user_promotion_dismissfires
Final pixels (for triage)
m_privacy-pro_existing_user_promotion_impression
- Trigger: The day-7 promo half-sheet is shown to an existing user (7+ days since install) who has never seen any subscription offer.
- Frequency: Once per install (guarded by
daxDialogsSettings.subscriptionPromotionDialogShown). - Fired from:
SubscriptionPromoExistingUserCoordinator.markLaunchPromptPresented() - Parameters:
appVersion— app version (added by default)ru—true/false— whether the user is a returning user (reinstall)free_trial—true/false— whether the user is eligible for a free trial at time of display
- Suffixes:
_ios,_phone/_tablet
m_privacy-pro_existing_user_promotion_tap
- Trigger: User taps the CTA button ("Try It Free" or "Learn More") on the promo modal.
- Frequency: Standard (can fire once per impression, since the modal is shown at most once).
- Fired from:
SubscriptionPromoExistingUserCoordinator.handleCTAAction() - Parameters: same as impression —
appVersion,ru,free_trial - Suffixes:
_ios,_phone/_tablet
m_privacy-pro_existing_user_promotion_dismiss
- Trigger: User dismisses the promo modal (taps X or swipes down) without tapping the CTA.
- Frequency: Standard.
- Fired from:
SubscriptionPromoExistingUserCoordinator.handleDismissAction()andUIAdaptivePresentationControllerDelegate(swipe-to-dismiss) - Parameters: same as impression —
appVersion,ru,free_trial - Suffixes:
_ios,_phone/_tablet
Behavior rules
- Impression and tap/dismiss are mutually exclusive per install — the modal is shown at most once.
ruandfree_trialare evaluated at time of display, same as in the skipped-onboarding promo.- The dismiss pixel fires on both explicit close (X button) and swipe-to-dismiss; neither path fires the tap pixel.
- If the user taps CTA, tap fires but dismiss does not.
Notes and status
- Pixel definitions are committed to
iOS/PixelDefinitions/pixels/definitions/subscription.json5. - These pixels are structurally identical to
m_privacy-pro_skipped_onboarding_promotion_*(same parameters, same suffixes) — no new parameter types are introduced. - Android equivalent pixels: the Android implementation fires analogous
m_privacy-pro_skipped_onboarding_promotion_*pixels (Android reused the existing reinstaller promo pixel names for the day-7 promo since it shipped first). - Origin
funnel_modal_ios__subscriptionnudgeneeds formal approval via the Origin Proposal form — tracked in the origin request subtask above. - Privacy triage is required for the new pixels — see
ios-subscription-day7-promo-privacy-triage.md.