Welcome to LaunchVerseQuickstartDashboard OverviewImporting Projects
Deployment GuideEnvironment VariablesLaunchverse ForgePreview EnvironmentsEnvironment Variable VersioningRollback & PromoteHow Builds Work (Forge)
Helix CopilotEphemeral SandboxesAI Log Explainer
The LaunchVerse EdgeCustom Domains & TLSDomain PurchasingTwo-Factor Authentication (TOTP)IP Allowlists
Managed DatabasesScale to ZeroLog DrainsDatabase Backups & Point-in-Time RecoveryObservabilityWeb Analytics & Traffic Tracking
Project GroupsRole-Based Access Control (RBAC)
Student ProgramDeveloper Streaks
API Reference
Changelog
SDKsHelix Gateway SDK
Web Shell
API Reference (Redoc)

Web Analytics & Traffic Tracking

Launchverse includes free, self-hosted web analytics for every project. There is no third-party script, no cookie banner, and no per-seat cost. The tracking beacon sends pageviews to your own /api/track endpoint and resolves the owning project from the request origin.

What is captured

  • Pageviews — every tracked page load or SPA navigation.
  • Sessions — unique visitor sessions stored in localStorage.
  • Unique IPs — distinct client IP addresses in the selected window.
  • Top paths — the most visited pages.
  • Top referrers — where traffic came from.
  • Top countries — geographic breakdown from cf-ipcountry / x-vercel-ip-country headers.

Data is stored in the analytics_events table in your project's Supabase backend. IP addresses are used for geolocation and rate limiting only.

How to enable it

Static SPAs — automatic

If your project is a static SPA (Vite, Astro, Create React App, Vue, Svelte static, etc.) and you provide a build command, Launchverse appends a post-build step to your Coolify build command. The step walks the publish directory and injects the tracking snippet into every generated *.html file. The snippet is idempotent and fires on popstate/hashchange for client-side routing.

Next.js, Nuxt, Node, and custom domains — manual snippet

Copy the snippet from your project's Analytics tab and paste it into the <head> of every page you want to track. Replace YOUR_PROJECT_ID with the project UUID shown in the dashboard:

<script data-launchverse-visitor-beacon>
(function(){
  try {
    var k="lv:sid", s=localStorage.getItem(k)||"";
    if(!s){ s=Math.random().toString(36).slice(2)+Math.random().toString(36).slice(2); localStorage.setItem(k,s); }
    function f(){
      var d=document, l=location, r=d.referrer||"", p=l.pathname||"/";
      var u="/api/track?project_id=YOUR_PROJECT_ID&path="+encodeURIComponent(p)+"&referrer="+encodeURIComponent(r)+"&sid="+encodeURIComponent(s);
      var i=new Image(); i.src=u; i.style.cssText="position:absolute;opacity:0;pointer-events:none;width:0;height:0;";
    }
    if(document.readyState==="complete"){ f(); } else { window.addEventListener("load", f); }
    window.addEventListener("popstate", f);
    window.addEventListener("hashchange", f);
  } catch(e) {}
})();
</script>

If the beacon is served from the project's own domain, you can omit project_id and the server resolves the project from Origin / Referer.

API endpoints

  • GET /api/track — returns a 1×1 transparent GIF. Ideal for <img> tags and no-CORS injection.
  • POST /api/track — JSON ingestion for programmatic use.
  • GET /api/projects/{id}/web-analytics?days=N — dashboard aggregation, authenticated.

The Analytics tab

Open /project/{id}/analytics to see:

  • 7 / 14 / 30-day totals and averages.
  • A time-series chart of pageviews and sessions.
  • Tables for top paths, top referrers, and top countries.
  • A copyable tracking snippet for manual installation.

Privacy

  • No cookies are used.
  • The session id is stored in localStorage.
  • IPs are collected for geolocation and rate limiting, not displayed in the dashboard.
  • The beacon is rate-limited to 30 events per minute per IP to prevent abuse.

Troubleshooting

IssueFix
Empty Analytics tabNo beacon has fired yet; verify the snippet is installed and the project_id is correct.
Missing countriesCloudflare / Vercel geolocation headers are not present. Works automatically on Cloudflare-proxied domains.
SPA navigation not trackedEnsure your router emits popstate/hashchange, or call the beacon manually after each route change.
Edit this page on GitHub↗