#!/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{
© 2023-2025 BlackRoad OS, Inc. All Rights Reserved.
}{\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'