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

5.9 KiB

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


Background

Objective

  • Instrument the day-7 existing-user promo half-sheet with impression, tap, and dismiss pixels.
  • 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.

Android reference

Android has separate pixels and origins per audience, managed via a SubscriptionPromoFlow enum in Cta.kt (current main branch):

  • SKIPPED_ONBOARDING (reinstaller / skipped onboarding)
    • Origin: funnel_modal_android__skippedonboardingupsell
    • Shown: m_subscription_promo_modal_skipped_onboarding_shown
    • Subscribe clicked: m_subscription_promo_modal_skipped_onboarding_subscribe_clicked
  • NUDGE (day-7 existing users)
    • Origin: funnel_modal_android__subscriptionnudge
    • Shown: m_subscription_promo_modal_nudge_shown
    • Subscribe clicked: m_subscription_promo_modal_nudge_subscribe_clicked

The iOS origin task's suggested name funnel_modal_ios__subscriptionnudge follows the same format as Android's funnel_modal_android__subscriptionnudge. Source: Cta.kt, CtaViewModel.kt on Android main.

Android pixel definition / privacy triage tasks cover Phase 1 paywall instrumentation only (m_subscription_paywall_not_seen_*) — the promo modal pixels themselves got no separate pixel definition or privacy triage:


Proposed pixels (mirrors Android)

Separate pixels per audience, consistent with Android's NUDGE flow. Provides direct per-audience split in pixel dashboards. Requires a new privacy triage.

Testing

  • 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 the approved origin (placeholder: funnel_modal_ios__subscriptionnudge)
    • Re-install and dismiss instead → verify m_privacy-pro_existing_user_promotion_dismiss fires

Pixel definitions

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.
  • 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).
  • 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.
  • 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.

Structurally identical to m_privacy-pro_skipped_onboarding_promotion_[impression|tap|dismiss] — no new parameter types are introduced.


Notes and status

  • New pixel definitions to be added to subscription.json5. Privacy triage required: [Insert Privacy Triage link]
  • The iOS origin value needs to be formally submitted and approved via the Origin Proposal form. Suggested name: funnel_modal_ios__subscriptionnudge. Android equivalent: funnel_modal_android__subscriptionnudge.