| Event | Extra properties | Fired at | Trigger |
|---|---|---|---|
| paywall.touchpoint.exposed | source_screen | TriggerHost:299 / 540 | Locked surface resolves, assignment set |
| paywall.screen.view | trigger, source_screen, paywall_heading, conversation_id, price_variant | PaywallVM:441 | Sheet painted, not subscribed |
| paywall.api.plans_success | plan_count:Int, price_variant | PaywallVM:534 | /plans 2xx non-empty |
| paywall.api.plans_failed | error_code, price_variant | PaywallVM:483 | /plans failure |
| paywall.coupon.apply_click | coupon_code, apply_method, scrolled_before_apply:Bool, max_scroll_depth_pct:Int, price_variant | PaywallVM:166 | applyCoupon(), manual and auto |
| paywall.coupon.apply_success | coupon_code, discount_amount:Int(paise), effective_price:Int(paise), apply_method | PaywallVM:201 | Sync after click (V1) |
| paywall.coupon.apply_failed dead | coupon_code, error_code | none | reserved for V2 validate API |
| paywall.button.click | selected_plan_id, coupon_applied:Bool, price_confirmed:Int, time_on_paywall_ms:Long | PaywallVM:660 | Top of confirmContinue() |
| paywall.api.checkout_initiated | order_id, selected_plan_id | PaywallVM:721 | /subscriptions/initiate 200 |
| checkout.screen.view | plan_id, effective_price:Int | PaywallVM:752 | Before Razorpay launcher |
| paywall.api.purchase_success | order_id, plan_id, effective_price:Int, razorpay_payment_id(masked), razorpay_subscription_id(masked) | PaywallVM:859 | /subscriptions/verify 200 |
| subscription.system.unlocked | plan_id, effective_price:Int, time_to_confirm_ms:Long? | PaywallVM:1120 | inactive to active transition |
| paywall.api.active_subscription_recovered | plan_id | PaywallVM:328 | initiate 409 ACTIVE_EXISTS |
| paywall.api.pending_subscription_detected | plan_id | PaywallVM:344 | initiate 409 PENDING_EXISTS |
| paywall_success.screen.view | plan_id, effective_price:Int | StatusSheet:140 | Welcome sheet mount |
| paywall.overlay.view | status(confirmation|confirmed|pending|failed|welcome), order_id | StatusSheet:123 | Each status overlay render |
| paywall.api.purchase_failed | order_id, failure_reason(enum) | PaywallVM:783..980 | Razorpay Failure, or verify/initiate error |
| paywall.screen.dismiss | trigger, dismissal_reason, order_id, time_on_paywall_ms:Long | PaywallVM:1091 | Dismiss without subscribing |
| paywall.canary.shown_to_subscribed_user P0 tripwire | entitlement_status, source_screen | PaywallVM:388 | Paywall for isActive=true user, must stay 0 |
| paywall.network.offline_blocked_initiate | surface | PaywallVM:632 | CTA tapped offline |
| paywall.network.offline_shown_no_plans | surface | PaywallVM:416 / 504 | Opened offline, /plans failed |
| Event | Extra properties | At | Trigger |
|---|---|---|---|
| manage_subscription.screen.view | plan_id, entry_point (hardcoded "settings"), subscription_status | :127 | Screen mount |
| manage_subscription.button.cancel_click | plan_id, subscription_age_days:Int | :246 | Cancel CTA tapped |
| paywall.network.offline_blocked_cancel | surface="manage_subscription" | :260 | Cancel tapped offline |
| paywall.cancel.feedback_shown | subscription_id(masked) | :288 | Feedback sheet opened |
| manage_subscription.overlay.view | subscription_id(masked), feedback_length:Int | :309 | Draft to Confirm step |
| manage_subscription.button.cancel_confirmed | subscription_id(masked), reason(ellipsized), cancel_at_cycle_end:Bool, days_remaining_in_cycle:Int, subscription_age_days:Int | :196 | POST /cancel 200 |
| manage_subscription.button.cancel_dismissed | subscription_id(masked), abort_step, abort_method | :335 | Backs out of cancel flow |
| manage_subscription.api.cancel_failed | subscription_id(masked), failure_kind(http|network), http_code:Int(-1 network), feedback_length:Int | :385 | POST /cancel non-2xx or throw |
| Input | Audio | Transcript | Summary |
|---|---|---|---|
| Display lock flag | AudioLockState (sealed) | Boolean locked | Boolean summaryLocked |
| Placement surface | AUDIO (shipped) | TRANSCRIPT (shipped) | SUMMARY (never emitted) |
| Tap handler | onLockTap | onUnlockTap | missing |
| Lock-view analytics cb | onLockView | onLockView (dedupe by msgId) | missing |
| View event | chat.recording_player.lock_view | chat.transcript.lock_view | none |
| Click event | chat.recording_player.lock_click | chat.transcript.lock_click | none |
| Preview surface | CallAudioSummaryLock | TranscriptChatLock | n/a |
| Fail-closed default | true (force-lock) | true (force-lock) | false (never) |
| Event | Extra | At | Trigger |
|---|---|---|---|
| conversations.lock_row.view | conversation_id, row_position:Int, call_type | TriggerHost:324 | Locked row into viewport (dedupe by convId) |
| conversations.lock_row.click | same | :113 | Tap locked row |
| Event | Properties | At | Trigger |
|---|---|---|---|
| deeplink.system.received | raw_url, launch_type | Router:179 | Deep link intent received |
| deeplink.system.resolved | destination, resolved:Bool, resolution, failure_reason, raw_url, utm_source, utm_campaign, campaign_id | Router:218 / 228 | Routing complete, all results |
| paywall.deeplink.navigate | destination, campaign_id, coupon_code, raw_url, launch_type | MainActivity:1062 / 1086 | Before nav to monetization surface |
| paywall.deeplink.suppressed | destination, campaign_id, entitlement_status, reason="already_subscribed", raw_url | MainActivity:1013 | AlreadySubscribed guard |
| promo.notification.received | campaign_id, deep_link_path | Handler:125 | Payload valid, pre-permission |
| promo.notification.shown | campaign_id | Handler:140 | notify() succeeded |
| promo.notification.blocked | campaign_id | Handler:130 | POST_NOTIFICATIONS denied |
| promo.notification.dropped | campaign_id("unknown"), reason(missing_*) | Handler:117 | Payload validation fail |
| promo.notification.clicked | campaign_id, deep_link_path | MainActivity:999 | Push tapped (read-once) |
| coupon.autoapply.failed | campaign_id, coupon_code | PaywallVM:577 | Push coupon not in live /plans |
| # | Entry | Preview surface | trigger / source_screen | Nav site |
|---|---|---|---|---|
| 1 | Conversations list, tap locked row | ConversationsLock | history_pagination_boundary / conversations_list | NavGraph:903 |
| 2 | Transcripts, sticky CTA | Transcript or CallAudioSummary (derived) | transcript_open or audio_play_tap / transcripts_screen_v2 | NavGraph:292 |
| 2b | Transcripts, tap blurred transcript bubble | TranscriptChatLock | transcript_open / transcripts_screen_v2 | same route |
| 2c | Transcripts, tap locked audio scrubber | CallAudioSummaryLock | audio_play_tap / transcripts_screen_v2 | same route |
| 3 new | Promo push / deep link to paywall | PromoPush | promo_push / push_notification | MainActivity:1071 |
| MS1 | Settings to Manage Subscription | n/a | entry_point="settings" | SettingsNavGraph:348 |
| MS2 bug | Deep link manage-subscription | n/a | entry_point still "settings" | MainActivity:1097 |
| Group | Wire values |
|---|---|
| PaywallTrigger | history_pagination_boundary, audio_play_tap, transcript_open, promo_push |
| PaywallSourceScreen | conversations_list, transcripts_screen_v2, push_notification |
| PaywallPreviewSurface | conversations_lock, transcript_lock, recording_lock, promo_push (unknown falls back to conversations_lock) |
| CouponApplyMethod | manual, auto |
| SubscriptionStatus | created, authenticated, active, past_due, paused, cancelled, completed, abandoned |
| Enum | Wire | Locks |
|---|---|---|
| CONVERSATION | conversation | none (row-index) |
| CALL_RECORDING | call_recording | AUDIO |
| RECORDING_AND_TRANSCRIPT | recording_and_transcript | AUDIO, TRANSCRIPT |
| RECORDING_TRANSCRIPT_SUMMARY | recording_transcript_summary | AUDIO, TRANSCRIPT, SUMMARY (provisional) |
| TRANSCRIPT_AND_SUMMARY | transcript_summary | TRANSCRIPT, SUMMARY (provisional) |
| RECORDING_AND_SUMMARY | recording_summary | AUDIO, SUMMARY (provisional) |
| TRANSCRIPT_ONLY | transcript | TRANSCRIPT (provisional) |
| SUMMARY_ONLY | summary | SUMMARY (provisional) |
| Enum | value to wire |
|---|---|
| FailureReason | SIGNATURE_MISMATCH, VERIFY_FAILED to invalid_signature. RAZORPAY_FAILURE to bank_declined. NETWORK, UNKNOWN, INITIATE_FAILED, WRITES_DISABLED to network_error. CANCELLED to user_cancelled no writer |
| DismissalReason | back_press, timeout, cta_skip no writer |