<!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?v=2">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png?v=2">
    <link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png?v=2">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=2">
    <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" />

    <!-- Per-route meta injector: sets <title> + <meta description> before React mounts so crawlers see the right tags on first response. -->
    <script>
    (function () {
      var META = {
        "/": ["Funnls — Small Business Websites, One Flat Monthly Fee", "Funnls builds conversion-ready websites for small businesses. Design, hosting, maintenance, and support — all included in one flat monthly price."],
        "/pricing": ["Pricing — Funnls Small Business Websites", "Simple, transparent pricing for small business websites. One flat monthly fee covers design, hosting, maintenance, and support."],
        "/solutions": ["Small Business Website Design — Funnls", "Affordable, professional website design for small businesses. Custom design, hosting, maintenance, and support — all in one flat monthly price."],
        "/product": ["Product — How the Funnls Mapper Works", "Conversion architecture is the missing layer between strategy and design. Learn how Funnls maps your goals into a clear page hierarchy."],
        "/work": ["Our Approach — Systems-Driven Design | Funnls", "We think in systems. We design for outcomes. Learn the principles behind Funnls' conversion architecture practice."],
        "/launched-projects": ["Launched Projects — Recent Client Websites | Funnls", "Real client websites launched by Funnls. See the live sites we've built for small businesses across home services, irrigation, HVAC, and more."],
        "/services": ["Services — Conversion-First Website Design | Funnls", "Architecture-led website design, brand identity, redesigns, landing pages, and ongoing optimization. We design and build websites that convert."],
        "/about": ["About — 15 Years of Conversion Architecture | Funnls", "Since 2010, Funnls has built over 500 websites that have driven millions in revenue. We believe structure precedes design."],
        "/map": ["Map Your Website — Conversion Architecture Wizard | Funnls", "Answer 7 questions and get a custom conversion architecture map for your website — page hierarchy, traffic flow, and CTA strategy."],
        "/blog": ["Blog — Conversion Architecture Insights | Funnls", "Conversion architecture, intent-first design, and the strategy behind every page. Read the Funnls blog."],
        "/consultation": ["Get Started — Funnls Small Business Websites", "Tell us about your business and we'll build you a professional website. Flat monthly fee includes design, hosting, and support."],
        "/contact": ["Contact Funnls — Visit Us in Naples, FL", "Visit the Funnls office in Naples, FL or get in touch about your website project. 1110 Pine Ridge Rd, Suite 201, Naples, FL 34108."],
        "/terms": ["Terms of Service — Funnls", "Read the Terms of Service governing your use of Funnls LLC's managed website design, hosting, and management services."],
        "/privacy": ["Privacy Policy — Funnls LLC", "Privacy Policy for Funnls LLC — how we collect, use, and protect your information across our managed website services."],
        "/industries": ["Web Design for Every Industry | Funnls", "Conversion-first websites tailored to your industry. Custom architecture for HVAC, plumbing, irrigation, law, medical, dental, restaurants and more — no cookie-cutter templates."],
        "/web-design-for-custom-projects": ["Web Design for Custom & Enterprise Projects | Funnls", "Custom web design for unique businesses, multi-location brands, and enterprise operators. Custom integrations, franchise architecture, e-commerce, and bespoke design systems."],
        "/website-templates": ["Website Templates for Small Businesses | Funnls", "Conversion-optimized website templates for small businesses. Pre-built designs for home services, restaurants, law firms, medical practices, and more."],
        "/auth": ["Sign In — Funnls", "Sign in to your Funnls account."],
        "/dashboard": ["Dashboard — Funnls", "Your Funnls projects and saved architectures."]
      };

      function titleize(slug) {
        return (slug || "").replace(/-/g, " ").replace(/\b\w/g, function (c) { return c.toUpperCase(); });
      }

      function resolve(path) {
        if (META[path]) return META[path];
        // Industry pages: /web-design-for-*
        if (/^\/web-design-for-[a-z0-9-]+$/.test(path)) {
          var label = titleize(path.replace("/web-design-for-", ""));
          return ["Web Design for " + label + " | Funnls", "Conversion-first web design for " + label.toLowerCase() + ". Custom architecture, managed hosting, and ongoing support — one flat monthly fee."];
        }
        // Blog category: /blog/category/*
        var bc = path.match(/^\/blog\/category\/([a-z0-9-]+)\/?$/);
        if (bc) {
          var c = titleize(bc[1]);
          return [c + " Articles | Funnls Blog", "Read Funnls articles on " + c.toLowerCase() + " — conversion architecture, intent-first design, and the strategy behind every page."];
        }
        // Blog post: /blog/* (single segment, not /category/)
        var bp = path.match(/^\/blog\/([a-z0-9-]+)\/?$/);
        if (bp) {
          var t = titleize(bp[1]);
          return [t + " | Funnls Blog", "Read \"" + t + "\" on the Funnls blog — conversion architecture insights for small business websites."];
        }
        // Template category: /website-templates/*
        var tc = path.match(/^\/website-templates\/([a-z0-9-]+)\/?$/);
        if (tc) {
          var tcn = titleize(tc[1]);
          return [tcn + " Website Templates | Funnls", "Conversion-optimized " + tcn.toLowerCase() + " website templates from Funnls. Pre-built designs ready to launch under a flat monthly fee."];
        }
        // Template preview: /website-templates/*/*
        var tp = path.match(/^\/website-templates\/([a-z0-9-]+)\/([a-z0-9-]+)\/?$/);
        if (tp) {
          var tpn = titleize(tp[2]);
          return [tpn + " Template Preview | Funnls", "Preview the " + tpn + " website template from Funnls — a conversion-optimized design for small businesses."];
        }
        // Project view (private): /project/*
        if (/^\/project\//.test(path)) return ["Project — Funnls", "View your Funnls project architecture."];
        // Admin (private)
        if (path === "/admin") return ["Admin — Funnls", "Funnls admin dashboard."];
        return null;
      }

      try {
        var path = location.pathname.replace(/\/+$/, "") || "/";
        var meta = resolve(path);
        if (meta) {
          document.title = meta[0];
          function setMeta(selector, attr, name, content) {
            var el = document.head.querySelector(selector);
            if (!el) {
              el = document.createElement("meta");
              el.setAttribute(attr, name);
              document.head.appendChild(el);
            }
            el.setAttribute("content", content);
          }
          setMeta('meta[name="description"]', "name", "description", meta[1]);
          setMeta('meta[property="og:title"]', "property", "og:title", meta[0]);
          setMeta('meta[property="og:description"]', "property", "og:description", meta[1]);
          setMeta('meta[property="og:url"]', "property", "og:url", "https://funnls.com" + (path === "/" ? "/" : path));
          setMeta('meta[name="twitter:title"]', "name", "twitter:title", meta[0]);
          setMeta('meta[name="twitter:description"]', "name", "twitter:description", meta[1]);
        }
      } catch (e) {}
    })();
    </script>

    <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="@Funnls" />
  <script type="module" crossorigin src="/assets/index-DoIEi5YO.js"></script>
  <link rel="stylesheet" crossorigin href="/assets/index-ypArpbTi.css">
<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script><meta property="og:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/10ab7148-71df-4678-9f8c-c453c807ddd0/id-preview-eb969950--d5ae14ab-c07f-4329-a266-f19e8ca65264.lovable.app-1776822025305.png"><meta name="twitter:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/10ab7148-71df-4678-9f8c-c453c807ddd0/id-preview-eb969950--d5ae14ab-c07f-4329-a266-f19e8ca65264.lovable.app-1776822025305.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>
