[{"data":1,"prerenderedAt":218},["ShallowReactive",2],{"\u002Fen\u002Fblog\u002Fwebvite-umami-analytics":3,"\u002Fen\u002Fblog\u002Fwebvite-umami-analytics-surround":212},{"id":4,"title":5,"author":6,"body":10,"date":201,"dateModified":202,"description":203,"extension":204,"image":205,"meta":206,"minRead":95,"navigation":207,"path":208,"seo":209,"stem":210,"__hash__":211},"blog\u002Fen\u002Fblog\u002Fwebvite-umami-analytics.md","Umami in WebVite: Simple Analytics for Each Customer Website",{"name":7,"avatar":8},"YL",{"src":9,"alt":7},"\u002Fprofile.png",{"type":11,"value":12,"toc":196},"minimark",[13,17,20,23,28,31,34,37,41,44,57,60,63,139,142,145,152,159,163,166,169,172,189,192],[14,15,16],"p",{},"WebVite generates and hosts websites for small businesses. In that context, analytics are not a side feature: they answer a question customers ask soon after launch.",[14,18,19],{},"Is my website being seen? Which pages work? Where do visitors come from?",[14,21,22],{},"Umami was chosen to answer that need without turning a simple product feature into a marketing stack.",[24,25,27],"h2",{"id":26},"why-umami","Why Umami",[14,29,30],{},"WebVite's need is specific: give each company a clear view of its website traffic without forcing Google Analytics, advertising cookies or tools that are hard to explain.",[14,32,33],{},"Umami fits this use case because it is lightweight, self-hostable and focused on useful metrics: visits, page views, traffic sources, devices and countries. For a small business website, that is usually enough to make good decisions without overwhelming the customer with reports.",[14,35,36],{},"The operational point matters too. WebVite controls the Umami instance, declared websites, linked domains and analytics sharing settings. The data stays in a known part of the platform instead of being spread across third-party accounts managed customer by customer.",[24,38,40],{"id":39},"technical-overview","Technical Overview",[14,42,43],{},"In WebVite, the Laravel database remains the source of truth. Each company stores three Umami-related fields:",[45,46,47,51,54],"ul",{},[48,49,50],"li",{},"the Umami website id",[48,52,53],{},"the public share id",[48,55,56],{},"whether analytics are public or private",[14,58,59],{},"When a company is created, a queued job creates the corresponding website in Umami and stores its id. When the custom domain changes, another job updates the domain in Umami. When the company is deleted, the linked Umami website can be deleted as well.",[14,61,62],{},"The tracking script is injected into the Blade layout only when the company has an Umami website id:",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript\n  defer\n  src=\"https:\u002F\u002Fumami.example.com\u002Fscript.js\"\n  data-website-id=\"...\"\n>\u003C\u002Fscript>\n","html","",[71,72,73,86,93,112,127],"code",{"__ignoreMap":69},[74,75,78,82],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sMK4o","\u003C",[74,83,85],{"class":84},"swJcz","script\n",[74,87,89],{"class":76,"line":88},2,[74,90,92],{"class":91},"spNyl","  defer\n",[74,94,96,99,102,105,109],{"class":76,"line":95},3,[74,97,98],{"class":91},"  src",[74,100,101],{"class":80},"=",[74,103,104],{"class":80},"\"",[74,106,108],{"class":107},"sfazB","https:\u002F\u002Fumami.example.com\u002Fscript.js",[74,110,111],{"class":80},"\"\n",[74,113,115,118,120,122,125],{"class":76,"line":114},4,[74,116,117],{"class":91},"  data-website-id",[74,119,101],{"class":80},[74,121,104],{"class":80},[74,123,124],{"class":107},"...",[74,126,111],{"class":80},[74,128,130,133,136],{"class":76,"line":129},5,[74,131,132],{"class":80},">\u003C\u002F",[74,134,135],{"class":84},"script",[74,137,138],{"class":80},">\n",[14,140,141],{},"This keeps customer websites simple. There is no per-site manual setup, no script for the customer to copy and no complex frontend condition.",[14,143,144],{},"On the server side, a Laravel service talks to Umami's internal API. It authenticates with admin credentials, caches the token, then creates, updates or deletes websites as product events happen.",[14,146,147,148,151],{},"A ",[71,149,150],{},"umami:sync"," command acts as a safety net. It regularly reconciles the WebVite database with the real Umami state: missing website, different domain, inconsistent share setting or orphaned website. Observers provide fast synchronization; the scheduled command repairs drift.",[14,153,154,155,158],{},"In the customer dashboard, a company can make its analytics available through an Umami share link. WebVite generates a ",[71,156,157],{},"shareId",", pushes it to Umami, then displays a button to the shared dashboard.",[24,160,162],{"id":161},"tradeoffs-and-gains","Tradeoffs and Gains",[14,164,165],{},"The main tradeoff is accepting one more dependency. Umami becomes a service to deploy, back up and monitor. WebVite also has to deal with eventual consistency: jobs and reconciliation are needed to absorb network failures or domain changes.",[14,167,168],{},"Umami is also less complete than a heavy analytics suite. That is intentional. WebVite is not trying to solve advanced advertising attribution; it is giving small businesses understandable indicators.",[14,170,171],{},"In return, the gains are clear:",[45,173,174,177,180,183,186],{},[48,175,176],{},"traffic measurement without advertising cookies",[48,178,179],{},"automatic setup for every new customer website",[48,181,182],{},"one shared instance to maintain",[48,184,185],{},"shareable analytics when customers want them",[48,187,188],{},"a simple architecture where Laravel remains the source of truth",[14,190,191],{},"For WebVite, Umami is a strong product compromise: powerful enough to be useful, restrained enough to stay maintainable.",[193,194,195],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":69,"searchDepth":77,"depth":88,"links":197},[198,199,200],{"id":26,"depth":88,"text":27},{"id":39,"depth":88,"text":40},{"id":161,"depth":88,"text":162},"2026-05-20",null,"Why WebVite uses Umami to provide clean, self-hosted and maintainable analytics on customer websites.","md","https:\u002F\u002Fimages.pexels.com\u002Fphotos\u002F669615\u002Fpexels-photo-669615.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",{},true,"\u002Fen\u002Fblog\u002Fwebvite-umami-analytics",{"title":5,"description":203},"en\u002Fblog\u002Fwebvite-umami-analytics","ga-ctVknTsX8joDzqWMPhGPdP0XyXPl2nlZBHXk5eCI",[213,202],{"title":214,"path":215,"stem":216,"description":217,"children":-1},"A Minimal GitOps Architecture for Laravel on k3s","\u002Fen\u002Fblog\u002Fdeploying-laravel-with-k3s-and-argocd","en\u002Fblog\u002Fdeploying-laravel-with-k3s-and-argocd","A compact architecture for running several Laravel applications on one small VPS with k3s, Argo CD, Redis, Postgres, backups, uptime checks, and fast disaster recovery.",1779288410794]