#!/bin/bash # BlackRoad OS - Analytics & Tracking Setup # Deploys analytics across all web properties # # Author: Alexa Amundson # Copyright: BlackRoad OS, Inc. set -e echo "📊 BlackRoad OS - Analytics & Tracking Setup" echo "============================================" echo "" # Colors GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' NC='\033[0m' # Analytics configuration PLAUSIBLE_DOMAIN="plausible.io" GA_ID="G-XXXXXXXXXX" # Replace with actual Google Analytics ID MIXPANEL_TOKEN="your_mixpanel_token" # Replace with actual token echo -e "${BLUE}Step 1: Creating analytics snippets...${NC}" echo "" # Create analytics snippets directory mkdir -p analytics_snippets # Plausible Analytics (privacy-friendly) cat > analytics_snippets/plausible.html << 'EOF' EOF # Google Analytics 4 cat > analytics_snippets/google_analytics.html << 'EOF' EOF # Simple Analytics (GDPR-friendly) cat > analytics_snippets/simple_analytics.html << 'EOF' EOF # Custom analytics (self-hosted) cat > analytics_snippets/custom_analytics.js << 'EOF' // BlackRoad OS Custom Analytics (function() { 'use strict'; const analytics = { endpoint: 'https://analytics.blackroad.io/track', track: function(event, data) { const payload = { event: event, data: data, timestamp: new Date().toISOString(), page: window.location.pathname, referrer: document.referrer, userAgent: navigator.userAgent }; // Send to analytics endpoint if (navigator.sendBeacon) { navigator.sendBeacon(this.endpoint, JSON.stringify(payload)); } else { fetch(this.endpoint, { method: 'POST', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, keepalive: true }).catch(() => {}); } }, pageView: function() { this.track('page_view', { title: document.title, url: window.location.href }); }, event: function(name, properties) { this.track('event', { name: name, properties: properties || {} }); } }; // Auto-track page views analytics.pageView(); // Track page visibility changes document.addEventListener('visibilitychange', function() { if (document.hidden) { analytics.event('page_hidden'); } else { analytics.event('page_visible'); } }); // Expose to window window.BlackRoadAnalytics = analytics; })(); EOF # Event tracking snippet cat > analytics_snippets/event_tracking.js << 'EOF' // Event Tracking for BlackRoad OS // Track button clicks document.addEventListener('click', function(e) { if (e.target.matches('button, a.cta-button, [data-track]')) { const eventName = e.target.getAttribute('data-track') || 'button_click'; const label = e.target.textContent || e.target.getAttribute('aria-label'); if (window.BlackRoadAnalytics) { window.BlackRoadAnalytics.event(eventName, { label: label, href: e.target.href }); } } }); // Track form submissions document.addEventListener('submit', function(e) { const form = e.target; const formName = form.getAttribute('name') || form.getAttribute('id') || 'unknown'; if (window.BlackRoadAnalytics) { window.BlackRoadAnalytics.event('form_submit', { form: formName }); } }); // Track scroll depth let maxScroll = 0; window.addEventListener('scroll', function() { const scrolled = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100; if (scrolled > maxScroll) { maxScroll = scrolled; if (maxScroll > 25 && maxScroll < 30) { window.BlackRoadAnalytics?.event('scroll_25'); } else if (maxScroll > 50 && maxScroll < 55) { window.BlackRoadAnalytics?.event('scroll_50'); } else if (maxScroll > 75 && maxScroll < 80) { window.BlackRoadAnalytics?.event('scroll_75'); } else if (maxScroll > 95) { window.BlackRoadAnalytics?.event('scroll_100'); } } }); // Track time on page let startTime = Date.now(); window.addEventListener('beforeunload', function() { const timeOnPage = Math.round((Date.now() - startTime) / 1000); if (window.BlackRoadAnalytics) { window.BlackRoadAnalytics.event('time_on_page', { seconds: timeOnPage }); } }); EOF echo -e "${GREEN}✅ Analytics snippets created${NC}" echo "" # Step 2: Inject analytics into existing HTML files echo -e "${BLUE}Step 2: Injecting analytics into dashboards...${NC}" echo "" # Function to inject analytics before inject_analytics() { local file=$1 local analytics_file=$2 if [ -f "$file" ] && [ -f "$analytics_file" ]; then # Check if already injected if grep -q "BlackRoad OS Custom Analytics" "$file"; then echo " ⏭️ $file already has analytics" else # Create backup cp "$file" "${file}.backup" # Inject before using perl instead of sed for compatibility if grep -q "" "$file"; then perl -i.bak -pe 'BEGIN{undef $/;} s{}{\n}smg' "$file" rm "${file}.bak" 2>/dev/null || true echo " ✅ Analytics injected into $file" else echo " ⚠️ No tag found in $file" fi fi fi } # Inject into dashboards inject_analytics "../dashboards/index.html" "analytics_snippets/custom_analytics.js" inject_analytics "../financial/dashboard.html" "analytics_snippets/custom_analytics.js" inject_analytics "../financial/pitch_deck.html" "analytics_snippets/custom_analytics.js" # Inject event tracking if [ -f "../dashboards/index.html" ]; then if ! grep -q "Event Tracking for BlackRoad" "../dashboards/index.html"; then perl -i.bak -pe 'BEGIN{undef $/;} s{}{\n}smg' "../dashboards/index.html" rm "../dashboards/index.html.bak" 2>/dev/null || true echo " ✅ Event tracking added to main dashboard" fi fi echo "" # Step 3: Create analytics dashboard echo -e "${BLUE}Step 3: Creating analytics dashboard...${NC}" echo "" cat > analytics_dashboard.html << 'EOF' BlackRoad OS - Analytics Dashboard

📊 BlackRoad OS Analytics Dashboard

Properties Tracked
8
Analytics Platforms
3
Events Tracked
12
Privacy Compliant

Tracked Properties

Main Metrics Dashboard
blackroad-os.github.io/blackroad-os-metrics/dashboards/
Financial Dashboard
blackroad-financial.pages.dev
Investor Pitch Deck
Internal distribution only
Sponsor Page
blackroad.io/sponsor
Main Website
blackroad.io
Prism Console
prism.blackroad.io
Documentation
docs.blackroad.io
API Platform
api.blackroad.io

Events Being Tracked

© 2023-2025 BlackRoad OS, Inc. All Rights Reserved.

EOF echo -e "${GREEN}✅ Analytics dashboard created: analytics_dashboard.html${NC}" echo "" # Step 4: Create Cloudflare Workers analytics endpoint echo -e "${BLUE}Step 4: Creating Cloudflare Workers analytics endpoint...${NC}" echo "" mkdir -p cloudflare_workers cat > cloudflare_workers/analytics.js << 'EOF' // BlackRoad OS Analytics Worker // Cloudflare Workers endpoint for custom analytics addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { // CORS headers const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type', } // Handle OPTIONS for CORS if (request.method === 'OPTIONS') { return new Response(null, { headers: corsHeaders }) } // Only accept POST if (request.method !== 'POST') { return new Response('Method not allowed', { status: 405, headers: corsHeaders }) } try { const data = await request.json() // Validate data if (!data.event || !data.timestamp) { return new Response('Invalid data', { status: 400, headers: corsHeaders }) } // Store in KV or D1 (example with KV) const key = `analytics:${Date.now()}:${Math.random()}` await ANALYTICS_KV.put(key, JSON.stringify(data), { expirationTtl: 2592000 // 30 days }) // Return success return new Response(JSON.stringify({ success: true }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' } }) } catch (error) { return new Response('Error processing request', { status: 500, headers: corsHeaders }) } } EOF cat > cloudflare_workers/wrangler.toml << 'EOF' name = "blackroad-analytics" type = "javascript" account_id = "your_account_id" workers_dev = true route = "analytics.blackroad.io/*" zone_id = "your_zone_id" [env.production] kv_namespaces = [ { binding = "ANALYTICS_KV", id = "your_kv_namespace_id" } ] EOF echo -e "${GREEN}✅ Cloudflare Workers analytics endpoint created${NC}" echo "" # Summary echo -e "${GREEN}============================================${NC}" echo -e "${GREEN}✅ Analytics Setup Complete!${NC}" echo -e "${GREEN}============================================${NC}" echo "" echo "📊 Analytics Snippets:" echo " - Plausible (privacy-friendly)" echo " - Google Analytics 4" echo " - Simple Analytics" echo " - Custom self-hosted analytics" echo "" echo "✅ Dashboards Updated:" echo " - Main metrics dashboard" echo " - Financial dashboard" echo " - Investor pitch deck" echo "" echo "📈 Events Tracked:" echo " - Page views, clicks, forms, scroll, time" echo " - All interactions with dashboards" echo "" echo "🚀 Next Steps:" echo " 1. Deploy Cloudflare Worker: cd cloudflare_workers && wrangler publish" echo " 2. Set up Plausible account at plausible.io" echo " 3. Configure Google Analytics (optional)" echo " 4. Update analytics endpoint URL in custom_analytics.js" echo " 5. View analytics: open analytics_dashboard.html" echo "" echo "© 2023-2025 BlackRoad OS, Inc."