> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siteline.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Website Builders

> Track AI bot & agent traffic on Webflow, Framer, HubSpot and other hosted website builders

Run Siteline on closed website builders — including [Webflow](#webflow), [Framer](#framer), [HubSpot](#hubspot) and similar hosted platforms — by routing traffic through [Cloudflare](https://cloudflare.com) and deploying the Siteline Cloudflare Worker on the edge.

## Why this approach?

Hosted website builders don't expose server logs or let you deploy custom middleware. A frontend JavaScript snippet won't capture AI traffic because most AI bots and agents don't execute JavaScript, measurement has to happen **server-side**.

Putting Cloudflare in front of your builder inserts a server-side measurement layer that these platforms don't natively provide. The Worker runs at the edge, forwards every request to your builder's origin with zero added latency, and asynchronously logs request metadata to Siteline.

You also get bot management, WAF rules, and easy subdomain hosting as bonus benefits.

## How it works

```mermaid actions={false} theme={null}
flowchart LR
    A[Visitor / AI bot] <--> CF[Cloudflare] <--> O[Your site<br/>Webflow, Framer, etc.]
    CF -. Worker .-> S[Siteline Agent Analytics]

    classDef cf fill:#F6821F,stroke:#C45A12,color:#fff;
    classDef sl fill:#0D9373,stroke:#0A6F58,color:#fff;
    class CF cf;
    class S sl;
```

Visitors and AI bots & agents now pass through Cloudflare before reaching your site, exactly as before. On the side, the Siteline Worker logs each request to Siteline asynchronously, your site's response is never delayed or modified.

## Prerequisites

* A [Siteline website key](/authorization)
* A Cloudflare account (free tier is sufficient)
* Admin access to your website builder and to your domain's DNS

## Setup

### 1. Add your domain to Cloudflare

<Steps>
  <Step title="Add the site in Cloudflare">
    In the [Cloudflare Dashboard](https://dash.cloudflare.com/), click **Add a domain** and enter your domain (e.g. `example.com`). Choose the **Free** plan.
  </Step>

  <Step title="Update nameservers at your registrar">
    Cloudflare will display two nameservers (e.g. `ari.ns.cloudflare.com`). Replace your domain's existing nameservers with these at your registrar (GoDaddy, Namecheap, Google Domains, etc.). Propagation typically takes a few minutes to a few hours.
  </Step>

  <Step title="Set SSL/TLS mode to Full">
    In Cloudflare go to **SSL/TLS** > **Overview** and set the encryption mode to **Full** (or **Full (strict)**). This ensures the connection from Cloudflare to your builder's origin uses HTTPS, which is required by Webflow, Framer, and HubSpot.
  </Step>
</Steps>

### 2. Configure your website builder

Add your custom domain inside your website builder's dashboard, then create matching DNS records in Cloudflare with the **proxy enabled** (orange cloud).

<Tabs>
  <Tab title="Webflow">
    <Steps>
      <Step title="Add the domain in Webflow">
        In Webflow, open your project and go to **Site settings** > **Publishing** > **Production**. Click **Add a custom domain** and enter your domain. Webflow will display the exact A record IP(s) and CNAME target you need.
      </Step>

      <Step title="Add the records in Cloudflare">
        In Cloudflare go to **DNS** > **Records** and add the records Webflow gave you:

        * **A** record on `@` pointing to Webflow's published IP
        * **CNAME** record on `www` pointing to `cdn.webflow.com`
        * Set **Proxy status** to **Proxied** (orange cloud) on both
      </Step>

      <Step title="Publish in Webflow">
        Back in Webflow, click **Check status** next to your domain, then publish your site. SSL is provisioned automatically.
      </Step>
    </Steps>

    <Warning>
      Always copy the IP and CNAME values directly from Webflow's dashboard — Webflow updates these periodically (most recently in 2026 as part of their Cloudflare migration). Hard-coded values from older guides may be stale.
    </Warning>

    Reference: [Webflow — Manually connect a custom domain](https://help.webflow.com/hc/en-us/articles/33961239562387-Manually-connect-a-custom-domain).
  </Tab>

  <Tab title="Framer">
    <Steps>
      <Step title="Connect the domain in Framer">
        In Framer, open your project and go to **Site Settings** > **Domains** > **Connect Custom Domain**. Enter your domain. Framer will display the A record IPs and CNAME target you need.
      </Step>

      <Step title="Add the records in Cloudflare">
        In Cloudflare go to **DNS** > **Records** and add the records Framer gave you:

        * **A** records on `@` pointing to each Framer IP
        * **CNAME** record on `www` pointing to `sites.framer.app`
        * Set **Proxy status** to **Proxied** (orange cloud) on all
      </Step>

      <Step title="Verify in Framer">
        Back in Framer, click **Check** next to your domain. Once verified, Framer provisions SSL automatically and your site is live.
      </Step>
    </Steps>

    <Warning>
      Framer occasionally rotates their published IP addresses. Always copy values directly from Framer's dashboard rather than relying on cached values from guides.
    </Warning>

    Reference: [Framer — Connect to hosting](https://www.framer.com/help/articles/connect-to-our-new-and-improved-hosting/).
  </Tab>

  <Tab title="HubSpot">
    <Steps>
      <Step title="Connect the domain in HubSpot">
        In HubSpot, navigate to **Settings** > **Content** > **Domains & URLs** > **Connect a domain**. Choose the content type (Website Pages, Landing Pages, Blog) and follow the prompts. HubSpot will display a **Required Data** value — typically a CNAME target like `[id].sites.hubspot.com`.
      </Step>

      <Step title="Add the CNAME record in Cloudflare">
        In Cloudflare go to **DNS** > **Records** > **Add record**:

        * **Type**: `CNAME`
        * **Name**: the subdomain you're connecting (e.g. `www` or `@` for the root)
        * **Target**: the value HubSpot provided
        * **Proxy status**: **Proxied** (orange cloud)
      </Step>

      <Step title="Verify in HubSpot">
        Click **Verify** in HubSpot. DNS propagation typically completes in 15–80 minutes. HubSpot will provision SSL automatically once verified.
      </Step>
    </Steps>

    <Note>
      Cloudflare's [CNAME flattening](https://developers.cloudflare.com/dns/cname-flattening/) automatically handles CNAMEs at the apex (root) domain — no special configuration required.
    </Note>

    Reference: [HubSpot — Connect your domain](https://knowledge.hubspot.com/domains-and-urls/connect-a-domain-to-hubspot).
  </Tab>

  <Tab title="Other (Squarespace, Wix, Shopify, ...)">
    The same pattern works for any builder that supports a custom domain via DNS:

    1. In your builder, add the custom domain and copy the DNS records it requires (A records, CNAME, or both).
    2. In Cloudflare, create matching records under **DNS** > **Records**.
    3. Set **Proxy status** to **Proxied** (orange cloud) on each.
    4. Verify the domain in your builder.

    If you're not sure whether your builder is compatible, [book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll confirm.
  </Tab>
</Tabs>

### 3. Deploy the Siteline Worker in Cloudflare

<Info>
  Both Cloudflare's DNS proxy and Workers run on Cloudflare's **free tier** (100K Worker requests/day), which covers most sites.

  If you have higher traffic and wish to stay on the free tier you can [scope your Worker routes](https://developers.cloudflare.com/workers/configuration/routing/routes/) to only the subdomains or paths that matter (e.g. your marketing site and blog, not your app dashboard). See [Cloudflare Workers pricing](https://developers.cloudflare.com/workers/platform/pricing/) for details.
</Info>

<Steps>
  <Step title="Clone and install">
    ```bash theme={null}
    git clone https://github.com/siteline-ai/siteline-cloudflare-worker.git
    cd siteline-cloudflare-worker
    npm install
    ```
  </Step>

  <Step title="Log in to Cloudflare via Wrangler (official CLI tool)">
    * Trigger the login page

    ```bash theme={null}
    npx wrangler login
    ```

    * Allow Wrangler (Cloudflare's official command-line tool) to access your account
  </Step>

  <Step title="Set your website key">
    * Create an encrypted secret for your Siteline website key

    ```bash theme={null}
    npx wrangler secret put SITELINE_WEBSITE_KEY
    ```

    * Paste your key when prompted and press Enter
    * Enter `Y` when prompted if you want to create a new Worker with name `siteline-cloudflare-worker`
  </Step>

  <Step title="Deploy">
    ```bash theme={null}
    npm run deploy
    ```
  </Step>

  <Step title="Configure routes">
    * In the [Cloudflare Dashboard](https://dash.cloudflare.com/), navigate to **Compute & AI** > **Workers & Pages**

    * Select **siteline-cloudflare-worker** > **Settings** > **Domain & Routes** > **Add** > **Route**

    * Select your project as the Zone and enter a route for the domains you'd like to track:

      * `example.com/*` — tracks all *pages* for your domain
      * `*example.com/*` — tracks all *pages & subdomains*

          <Info>
            We recommend tracking all *content* pages. If your blog is configured as a subdomain, use `*example.com/*` to capture both subdomains and root pages.
          </Info>

    * Set **Failure Mode** to **Fail Open**

    * Save
  </Step>
</Steps>

### 4. Verify

After the Worker is deployed and routes are configured, visit your site (or `curl` it) and check **Agent Analytics** in your [Siteline workspace](https://siteline.ai/app). You should see traffic appear within a few seconds. AI bot visits will be classified automatically.

## Bonus benefits

Putting Cloudflare in front of your builder unlocks several useful capabilities:

* **Bot management & WAF rules** — block or rate-limit unwanted crawlers without changing your builder configuration
* **Subdomain hosting** — route `blog.example.com`, `docs.example.com`, etc. to different origins via Cloudflare
* **Edge caching** — cache static assets at Cloudflare's edge for faster page loads
* **Analytics** — see request volume, cache hit rate, and threat data in the Cloudflare dashboard

## Troubleshooting

<AccordionGroup>
  <Accordion title="My site shows a 525 or 526 SSL error after switching to Cloudflare">
    Set Cloudflare's SSL/TLS mode to **Full** under **SSL/TLS** > **Overview**. The default ("Flexible") doesn't work with Webflow, Framer, or HubSpot because they require HTTPS on the origin connection.
  </Accordion>

  <Accordion title="Builder dashboard says my domain is not verified">
    Double-check that the DNS record values in Cloudflare exactly match what your builder asked for. Then wait 15–80 minutes for propagation. You can verify propagation at [dnschecker.org](https://dnschecker.org).
  </Accordion>

  <Accordion title="Worker isn't logging visits">
    In Cloudflare, go to **Workers & Pages** > **siteline-cloudflare-worker** > **Settings** > **Domain & Routes** and confirm a route like `example.com/*` or `*example.com/*` is configured. Then run `npx wrangler tail` from the cloned repo to stream real-time logs from the Worker.
  </Accordion>

  <Accordion title="Too many redirects error">
    This usually means Cloudflare's SSL mode is set to **Flexible** while your builder is forcing HTTPS. Switch to **Full** in **SSL/TLS** > **Overview**.
  </Accordion>

  <Accordion title="How do I update my Siteline website key later?">
    Run `npx wrangler secret put SITELINE_WEBSITE_KEY` from the cloned repo and paste the new key when prompted. No redeploy required.
  </Accordion>
</AccordionGroup>

<Tip>
  **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it for your specific builder.
</Tip>
