Skip to main content

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.