<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
    <title>Funnls | Small Business Websites, One Flat Monthly Fee</title>
    <meta name="description" content="Funnls builds affordable small business websites starting at $150/month—designed to help you look professional, rank locally, and turn more visitors into leads.">
    <meta name="author" content="Funnls" />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=DM+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet" />

    <!-- Google tag (gtag.js) -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=G-VQSL9WZPW4"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'G-VQSL9WZPW4');
    </script>

    
    
    <meta property="og:type" content="website" />
    

    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:site" content="@Lovable" />
    
    
  
  
  
  
  
  
  
  
  
  
  
  <meta property="og:title" content="Funnls | Small Business Websites, One Flat Monthly Fee">
  <meta name="twitter:title" content="Funnls | Small Business Websites, One Flat Monthly Fee">
  <meta property="og:description" content="Funnls builds affordable small business websites starting at $150/month—designed to help you look professional, rank locally, and turn more visitors into leads.">
  <meta name="twitter:description" content="Funnls builds affordable small business websites starting at $150/month—designed to help you look professional, rank locally, and turn more visitors into leads.">
  <script type="module" crossorigin src="/assets/index-CKLqtMXK.js"></script>
  <link rel="stylesheet" crossorigin href="/assets/index-ByKRoCVy.css">
<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script><meta property="og:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/90fe57c5-cca3-4c69-8e7c-6ad733240c4f/id-preview-5b9d250a--d5ae14ab-c07f-4329-a266-f19e8ca65264.lovable.app-1776512203622.png"><meta name="twitter:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/90fe57c5-cca3-4c69-8e7c-6ad733240c4f/id-preview-5b9d250a--d5ae14ab-c07f-4329-a266-f19e8ca65264.lovable.app-1776512203622.png"></head>

  <body>
    <div id="root"></div>
  <!-- CRM Tracker: Funnls — paste before </body> -->
  <script>
  (function() {
    var TRACK_URL = 'https://dwoncjehdqhgcwwecjpe.supabase.co/functions/v1/track';
    var BRAND_ID  = '6ee9f8c9-4c5c-458a-946d-202c9cb7bd7b';
    var SID_KEY   = 'crm_sid_6ee9f8c9';
    var CID_KEY   = 'crm_cid_6ee9f8c9';

    function getCookie(n) {
      var m = document.cookie.match('(?:^|; )' + n + '=([^;]*)');
      return m ? decodeURIComponent(m[1]) : null;
    }
    function setCookie(n, v, days) {
      var d = new Date();
      d.setTime(d.getTime() + days * 864e5);
      document.cookie = n + '=' + encodeURIComponent(v)
        + ';expires=' + d.toUTCString() + ';path=/;SameSite=Lax';
    }
    function uid() {
      return Math.random().toString(36).slice(2) + Date.now().toString(36);
    }

    // Persist session & contact across pages
    var sessionId = getCookie(SID_KEY);
    if (!sessionId) { sessionId = uid(); setCookie(SID_KEY, sessionId, 1); }
    var contactId = getCookie(CID_KEY);

    // Auto-identify from email click-through (?cid= param)
    var urlParams = new URLSearchParams(location.search);
    var cidParam = urlParams.get('cid');
    if (cidParam && !contactId) {
      contactId = cidParam;
      setCookie(CID_KEY, cidParam, 365);
    }

    function pixel(params) {
      new Image().src = TRACK_URL + '?' + params.toString();
    }

    function track(eventType) {
      var p = new URLSearchParams({
        brand_id: BRAND_ID, event_type: eventType,
        session_id: sessionId, url: location.href
      });
      if (contactId) p.set('contact_id', contactId);
      pixel(p);
    }

    window.CRMTracker = {
      /**
       * Call this when a visitor submits a form with their email.
       * Their anonymous page history is merged into their CRM contact.
       *
       * CRMTracker.identify('visitor@email.com');
       */
      identify: function(email) {
        var p = new URLSearchParams({
          brand_id: BRAND_ID, event_type: 'identify',
          session_id: sessionId, url: location.href,
          email: email
        });
        fetch(TRACK_URL + '?' + p.toString())
          .then(function(r) { return r.json(); })
          .then(function(data) {
            if (data.contact_id) {
              contactId = data.contact_id;
              setCookie(CID_KEY, data.contact_id, 365);
            }
          })
          .catch(function() {});
      },
      track: track
    };

    // Auto-track every page view
    track('page_view');
  })();
  </script>
  </body>
</html>
