Add origin to Duck.ai and Pro subscription-funnel pixels - #9381
Add origin to Duck.ai and Pro subscription-funnel pixels#9381YoussefKeyrouz wants to merge 1 commit into
Conversation
|
Privacy Review task: https://app.asana.com/0/69071770703008/1217134106515700 |
f16eabf to
ba188e2
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit ba188e2. Configure here.
| val upgradeUri = subscriptionsUrlProvider.upgradeToProUrl.toUri() | ||
| subscriptions.isSubscriptionUrl(uri) || | ||
| (origin != null && uri.host == upgradeUri.host && uri.path == upgradeUri.path) | ||
| }.getOrDefault(false) |
There was a problem hiding this comment.
Upgrade funnel missing subscribe click
Medium Severity
isOfferPageUrl now counts Plus→Pro /plans launches as offer impressions when an origin is present, so Duck.ai upgrade funnels (gated Pro model/reasoning → LaunchUpgrade) send offer_screen_impression with that origin. The upgrade page CTA is handled by subscriptionChangeSelected, which never calls reportOfferSubscribeClick, so those impressions have no matching terms-conditions_subscribe_click and the impression→click join breaks for upgrade origins.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit ba188e2. Configure here.



Task/Issue URL: https://app.asana.com/1/137249556945/task/1217126669949056?focus=true
Tech Design URL (if applicable):
API Proposals URL(s) (if applicable):
Description
Adds an
originparameter to the native subscription-funnel entry points so the dashboard can join impression -> click -> offer/purchase per entry point. Impression = a_shownpixel; click =originon the existing upsell/CTA pixel (iOS-aligned).New impression pixels (
_shown):m_aichat_unified_input_model_picker_shown: model picker openedm_aichat_unified_input_reasoning_effort_picker_shown: reasoning picker openedm_aichat_unified_input_free_label_shown: Free upgrade pill shownoriginadded to existing pixels:m_aichat_unified_input_subscription_upsell_triggered: gated model / reasoning tapm_aichat_unified_input_chat_header_upgrade_tapped: Free pill tapm_privacy-pro_offer_screen_impression: offer page shownm_privacy-pro_app-settings_get_click: Settings "Get Subscription" tapm_privacy-pro_terms-conditions_subscribe_click: Subscribe CTA on the offer pageOrigins:
funnel_{duckai,addressbar}_android__modelpicker,...__reasoningdropdown,funnel_duckai_android__switchmodel,funnel_duckai_android__freelabel,funnel_appsettings_android.Registry: widened the purchase wide-event
context.namepattern to accept the__entrypointorigin shape; added acount_shortsuffix to the dictionary.Steps to test this PR
Setup
Internal build. Filter logcat by “pixel sent".
Account: Free tier, subscription-eligible .
Model & reasoning pickers
model_picker_shown; tap a gated model ->subscription_upsell_triggered+offer_screen_impression. Originfunnel_duckai_android__modelpickerfunnel_addressbar_android__modelpickerreasoning_effort_picker_shown; tap a gated mode ->subscription_upsell_triggered. Origin...__reasoningdropdown…__switchmodelinstead ofmodelpickerFree label
free_label_shown;chat_header_upgrade_tapped. Origin...__freelabelApp-settings / offer page
app-settings_get_click-> offer page ->offer_screen_impression. Originfunnel_appsettings_androidterms-conditions_subscribe_clickwith the launch originRegression
UI changes
None, telemetry only.
Note
Low Risk
Telemetry-only changes with no user-facing behavior; origin validation on paywall pixels reduces risk of malformed URL parameters.
Overview
Adds
originon native subscription-funnel entry points so analytics can join impression → click → offer/purchase per entry point (aligned with iOS).New impression pixels fire when UI surfaces appear: model picker, reasoning effort picker, and the upgradeable Free pill in the Duck.ai omnibar (
free_label_shown). Existing click pixels now includeoriginfor gated model/reasoning upsells, chat-header upgrade taps, offer-screen impressions, Settings Get Subscription, and offer-page Subscribe CTA.Origin strings use
funnel_{addressbar|duckai}_android__{modelpicker|reasoningdropdown|switchmodel|freelabel}plusfunnel_appsettings_android. Picker surfaces were renamed fromnativeinput/reasoningpickertoaddressbar/reasoningdropdown; model-recovery usesswitchmodel.Registry: widened
wide_subscription-purchasecontext.nameto allow__entrypointsuffixes; addedcount_shortsuffix; new subscription pixels use regex-validated origins on paywall events (invalid/blank origins dropped).Runtime: omnibar fires free-label impression once per show cycle; webview seeds launch origin for subscribe-click attribution; upgrade offer URLs count as offer pages when opened with a funnel origin.
Reviewed by Cursor Bugbot for commit ba188e2. Bugbot is set up for automated code reviews on this repo. Configure here.