{
  "schemaVersion": "1.0.0",
  "eventSchema": "speak-scripture.event.v1",
  "endpoint": "/api/track",
  "datasetBinding": "SPEAK_ANALYTICS",
  "privacy": {
    "cookies": false,
    "persistentUserId": false,
    "advertisingProfiles": false,
    "rawIpStoredByApplication": false,
    "rawUserAgentStoredByApplication": false,
    "rawSearchQueryStored": false,
    "fullReferrerStored": false,
    "respectsGlobalPrivacyControl": true,
    "respectsDoNotTrack": true,
    "browserOptOutKey": "speak_scripture_tracking"
  },
  "campaignFields": [
    "utm_source",
    "utm_medium",
    "utm_campaign"
  ],
  "events": [
    { "name": "page_view", "purpose": "Count page visits by route and page type." },
    { "name": "search_submit", "purpose": "Count searches using length and word count, never the search text." },
    { "name": "filter_change", "purpose": "Measure use of category, need, collection, rotation, day, sort, and filter controls." },
    { "name": "copy", "purpose": "Measure use of copy controls without storing copied text." },
    { "name": "share", "purpose": "Measure use of share controls without storing share payloads." },
    { "name": "download", "purpose": "Measure public resource downloads by normalized route." },
    { "name": "internal_navigation", "purpose": "Measure navigation between Speak Scripture routes." },
    { "name": "outbound_click", "purpose": "Measure outbound destinations by hostname only." },
    { "name": "scroll_depth", "purpose": "Measure 25, 50, 75, and 100 percent reading depth." },
    { "name": "engaged_30s", "purpose": "Count pages kept active for at least thirty seconds." },
    { "name": "install_prompt_shown", "purpose": "Measure PWA install-prompt availability." },
    { "name": "app_installed", "purpose": "Measure completed PWA installation." },
    { "name": "web_vital", "purpose": "Measure LCP, CLS, and INP without user identity." },
    { "name": "client_error", "purpose": "Count resource or runtime failures without error messages or stack traces." },
    { "name": "monitor_ping", "purpose": "Prove the production collector is accepting synthetic health checks." }
  ],
  "analyticsEngineLayout": {
    "index1": "ephemeral_session_id",
    "blobs": {
      "blob1": "event_name",
      "blob2": "path",
      "blob3": "page_type",
      "blob4": "target",
      "blob5": "campaign_source",
      "blob6": "campaign_medium",
      "blob7": "campaign_name",
      "blob8": "referrer_host",
      "blob9": "viewport_bucket",
      "blob10": "release_id"
    },
    "doubles": {
      "double1": "value",
      "double2": "duration_ms",
      "double3": "scroll_percent",
      "double4": "result_count",
      "double5": "query_length",
      "double6": "query_word_count"
    }
  }
}
