Files
obsidian-vault/work/projects/ios-subscription-day7-promo-pixels.md
T

5.2 KiB

Pixel Definition: iOS Day-7 Subscription Promo Half-Sheet


Background

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__subscriptionnudge flows downstream automatically to m_privacy-pro_offer_screen_impression and m_subscribe without 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_impression fires on display
    • Tap CTA → verify m_privacy-pro_existing_user_promotion_tap fires and subscription flow opens with origin funnel_modal_ios__subscriptionnudge
    • Re-install and dismiss instead → verify m_privacy-pro_existing_user_promotion_dismiss fires

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)
    • rutrue / false — whether the user is a returning user (reinstall)
    • free_trialtrue / 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() and UIAdaptivePresentationControllerDelegate (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.
  • ru and free_trial are 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__subscriptionnudge needs 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.