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

# Connect your site data

> Connect Google Analytics for AI Visits, and send the site's logs for Crawler Visits: by upload, by push or from Cloudflare.

Three pages read this brand's own site, not only the answers. Each needs a connection, made once per project.

| Source | Pages it feeds | Who connects it |
| - | - | - |
| Google Analytics 4 | [AI Visits](/reference/ai-visits), [Own Pages](/reference/own-pages) | An admin |
| A log file upload | [Crawler Visits](/reference/crawler-visits), [Own Pages](/reference/own-pages) | Any member |
| A push from a CDN or server | Crawler Visits, Own Pages | An admin |
| Cloudflare | Crawler Visits, Own Pages | An admin |

[Crawlability](/reference/crawlability) needs no connection. It reads the site's robots.txt and homepage every day.

## Google Analytics

FullReach AI reads the property as its own service account. You grant that account read access, and you can remove it at any time.

<Steps>
  <Step title="Add the account as a Viewer">
    In Google Analytics, open Admin, then Property access management. Add the address that the AI Visits page shows, with the Viewer role.
  </Step>

  <Step title="Copy the property ID">
    Open Admin, then Property details. The property ID is a number. An ID that starts with `G-` belongs to a data stream, not to the property.
  </Step>

  <Step title="Enter the ID">
    Paste the ID on the AI Visits page. The first read starts at once.
  </Step>
</Steps>

Only an admin connects or disconnects a property, and only an admin sees its ID. Once FullReach AI reads a property for one organization, another organization that enters the ID gets a refusal. A later failed read keeps that hold. Projects of one organization may share a property. A property that Google Analytics does not let FullReach AI read blocks nobody.

After that, FullReach AI reads the property each day. Google Analytics revises a day for about two days, so each read also takes the days before it again.

### When the first read runs

The first read takes the last 90 days of the property. It usually arrives within a minute, and the AI Visits page says so while it waits. Connecting another property deletes the visits of the old one.

### Disconnect

Disconnect on the AI Visits page removes every visit read from the property. Another organization can then connect the property. Removing the address in Google Analytics stops every read, and the page then shows why.

## Server logs

There are three ways to send logs. Each one adds to the same counts.

### Upload a log file

On the Crawler Visits page, choose a file in one of these formats:

* **Combined Log Format**, as Apache and nginx write it. A line must carry the user agent. A line names no host, so the page reads it as a request to the website that the project names, subdomain included.
* **CSV with a header row**, or **NDJSON**. Both use the field names of the push record below: `timestamp`, `request_method`, `request_url` (the full URL), `response_status`, `user_agent` and `client_ip`.

The file can be UTF-8 text, or UTF-16 text with a byte order mark, as Windows PowerShell writes it. The browser reads the file and sends only the rows that name an AI crawler. The other rows stay on your computer. Any member can upload a file.

When the upload ends, the page says how many crawler requests counted and why each other row did not. A file uploaded again counts each row once, and so does an upload that stopped and started again. Two different files for the same day add up, for example the logs of two servers.

The browser remembers how many crawler rows of a file it sent, so a log that grew since then sends only its new rows. Upload a grown log from the same browser. From another browser, a grown log can count up to 500 of its earlier crawler rows again. After a delete of every crawler visit, each browser sends a file in full again.

### Push from your CDN or server

An admin creates an ingest key on the Crawler Visits page. Your log shipper posts records to the endpoint that the Crawler Visits page shows, with the key as a Bearer token:

```bash theme={null}
curl -X POST "$ENDPOINT" \
  -H "Authorization: Bearer $INGEST_KEY" \
  -H "Content-Type: application/json" \
  -d '[{"timestamp": "2026-09-20T10:00:00Z", "request_method": "GET",
        "request_url": "https://example.com/pricing", "response_status": 200,
        "user_agent": "Mozilla/5.0 ... GPTBot/1.3", "client_ip": "20.0.0.5"}]'
```

The body can be a JSON array, an object that holds `records`, or NDJSON. Each record can have the shape above, the shape of a Vercel drain record, or the shape of an Akamai DataStream 2 record. The answer counts the records kept, the spoofed requests and probes among them, the requests dated today in UTC or later, and the records dropped, by reason. A pushed batch always adds, so a batch sent twice counts twice.

To stop the push, an admin revokes the key on the same page. The page asks first, because nothing undoes it. The visits the key sent stay. Replacing the key asks first too, because the old key stops working at once.

The key takes no batch while the trial is over and no subscription is active. Closing the organization deletes the key.

### Connect Cloudflare

An admin gives a Cloudflare API token with Analytics Read on the zone, and nothing else, together with the zone ID. The first read takes the last 30 days. After that, FullReach AI reads the zone each day. Cloudflare's analytics sends sampled counts without addresses, so these requests are unverifiable. The Cloudflare card says so: the counts are claimed by user agent.

To stop the pull, an admin disconnects Cloudflare on the Crawler Visits page. The page asks first, because nothing undoes it. FullReach AI deletes the token, and the visits it counted stay.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.