98 lines
6.0 KiB
Markdown
98 lines
6.0 KiB
Markdown
# 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](https://app.asana.com/1/137249556945/project/1202406491309510/task/1214798984829406)
|
|
- **Android counterpart:** [Grow active subscriptions by increasing paywall impressions with a day 7 promo half-sheet](https://app.asana.com/1/137249556945/project/72649045549333/task/1210994036696114) — the iOS implementation follows the same approach and target audience as Android
|
|
- **Origin request:** [Request origin for iOS subscription promo half-sheet entry point](https://app.asana.com/1/137249556945/task/1214800683792174) — origin not yet formally approved; suggested name `funnel_modal_ios__subscriptionnudge` follows 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 `SubscriptionPromoLaunchView` UI.
|
|
- Existing subscription promo pixels already cover related audiences:
|
|
- `m_privacy-pro_onboarding_promotion_[impression|tap|dismiss]` — users who see the promo during onboarding
|
|
- `m_privacy-pro_skipped_onboarding_promotion_[impression|tap|dismiss]` — reinstallers who skipped onboarding (7+ days)
|
|
|
|
## 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:
|
|
- [Define pixels to track users who haven't seen the subscription paywall](https://app.asana.com/1/137249556945/task/1213904100962479)
|
|
- [Privacy Triage: Android - Added new subscription_promo_shown pixel param](https://app.asana.com/1/137249556945/task/1214025242626360)
|
|
|
|
---
|
|
|
|
## 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 (guarded by `daxDialogsSettings.subscriptionPromotionDialogShown`).
|
|
- **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).
|
|
- **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](https://form.asana.com/?k=Wy3aY17vglr2bihpUHoyBA&d=137249556945). Suggested name: `funnel_modal_ios__subscriptionnudge`. Android equivalent: `funnel_modal_android__subscriptionnudge`.
|