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-countryheaders.
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
| Issue | Fix |
|---|---|
| Empty Analytics tab | No beacon has fired yet; verify the snippet is installed and the project_id is correct. |
| Missing countries | Cloudflare / Vercel geolocation headers are not present. Works automatically on Cloudflare-proxied domains. |
| SPA navigation not tracked | Ensure your router emits popstate/hashchange, or call the beacon manually after each route change. |