Developer Page Specifications
Analytics Events
GA4 / GTM event taxonomy. 10 listing + 6 details events with property contracts + KPI derivations.
Complete
GA4 / GTM event taxonomy for Opportunity Radar. All events fire client-side via the analytics service. Every event includes a baseline set of properties (opportunity_id, opportunity_slug, opportunity_status, country, stage, sector, source_page) — additional event-specific properties documented per event.
Listing page events
- opportunity_listing_view
- Fires on first paint of the listing page. Extra props: { result_count, active_filters_count, active_status_tab }.
- opportunity_filter_click
- Fires on filter change. Extra props: { filter_type (country|type|stage|sector|status), filter_value, was_added (bool, false = removed) }.
- opportunity_search
- Fires after debounced search (300ms). Extra props: { query, result_count }. Only fires when query length ≥ 2.
- opportunity_sort_change
- Fires on sort dropdown change. Extra props: { sort_from, sort_to }.
- opportunity_card_view
- IntersectionObserver: fires when a card enters the viewport. Extra props: { position_in_list, viewed_at_ms_since_listing_load }.
- opportunity_card_click
- Fires on card click (View Opportunity CTA, NOT Apply). Extra props: { position_in_list, dwell_time_ms }.
- opportunity_apply_click
- Fires when "Apply via Official Source" is clicked. Extra props: { source_section ('card'|'details_header'|'details_apply_box'), days_to_deadline }.
- opportunity_digest_subscribe
- Fires on successful subscription. Extra props: { country_preference, stage_preference, consent_partners (bool), source: 'listing' }.
- opportunity_cross_module_click
- Fires on cross-module card click (section G). Extra props: { target_module, target_route }.
- opportunity_listing_load_more
- Fires on infinite-scroll batch load (beyond the first). Extra props: { batch_number, cumulative_card_count }.
Details page events
- opportunity_detail_view
- Fires on details page first paint. Extra props: { has_cover_image, sponsor_relationship (bool), verified_age_days, connected_signals_count, benefits_count, eligibility_count }.
- opportunity_share_click
- Fires on Share button. Extra props: { channel ('native'|'copy_link'|'twitter'|'linkedin') }.
- opportunity_save_click
- Fires on Save button (when login is enabled). Extra props: { action: 'save'|'unsave' }.
- opportunity_related_click
- Fires on Related Opportunities card click (section M). Extra props: { related_opportunity_id, position_in_rail, source_type ('manual'|'auto') }.
- opportunity_connected_signal_click
- Fires on Connected Signal card click (section N). Extra props: { source_entity_type, source_entity_id, relation_type, position_in_rail }.
- opportunity_subscription_submit
- Fires on details-page subscription submit (section O). Extra props: { source: 'details', opportunity_id_context, consent_partners (bool) }.
KPIs derived from this taxonomy
- Apply CTR = opportunity_apply_click / (opportunity_card_view + opportunity_detail_view). Target ≥4% for non-sponsored, ≥6% for sponsored.
- Card-to-detail conversion = opportunity_card_click / opportunity_card_view. Target ≥18%.
- Cross-module traversal density = opportunity_connected_signal_click / opportunity_detail_view. Target ≥0.5 (the Connected Signals rail is the platform’s defining surface for ecosystem traversal).
- Subscription conversion = opportunity_digest_subscribe / opportunity_listing_view + opportunity_subscription_submit / opportunity_detail_view. Target ≥2.5% combined.
