Track AI bot crawls on Webflow, Wix, or any website with a lightweight snippet
Reaudit's site tracking works on any website by adding a small JavaScript snippet. It monitors AI bot crawls (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and more), page views, and AI referral traffic in real time.
Snippet loads asynchronously
A tiny script tag loads in the background — no impact on page speed.
Detects bots & AI referrals
Identifies AI crawlers by user-agent and AI referral traffic by referrer domain (ChatGPT, Perplexity, Claude, Gemini, etc.).
Sends data to Reaudit
Events are sent to your Reaudit dashboard in real time. IPs are anonymized for privacy.
<script>
(function () {
var ENDPOINT = 'https://reaudit.io/api/site-tracking/track';
var API_KEY = 'YOUR_API_KEY';
function id(k, store) {
try {
var v = store.getItem(k);
if (!v) { v = Date.now() + '-' + Math.random().toString(36).slice(2); store.setItem(k, v); }
return v;
} catch (e) { return Date.now() + '-' + Math.random().toString(36).slice(2); }
}
// Navigation fingerprint — used to tell Google AI Overview clicks apart
// from ordinary organic clicks. Captured only on the first hard load of a
// session that arrived from search; returns null otherwise.
function navSignals() {
try {
var ref = document.referrer;
if (!ref) return null;
var host = new URL(ref).hostname.toLowerCase();
if (host.indexOf('gemini.google.com') !== -1) return null;
if (!/(^|\.)google\.[a-z]{2,3}(\.[a-z]{2})?$/.test(host) &&
!/(^|\.)bing\.com$/.test(host)) return null;
if (sessionStorage.getItem('reaudit_nav_captured')) return null;
sessionStorage.setItem('reaudit_nav_captured', '1');
var n = performance.getEntriesByType('navigation')[0] || null;
var q = new URLSearchParams(window.location.search);
return {
historyLength: window.history.length,
navType: n ? n.type : 'unknown',
redirectCount: n ? n.redirectCount : -1,
visibilityState: document.visibilityState,
hasFocus: document.hasFocus(),
hasOpener: !!window.opener,
textFragment: (window.location.hash || '').indexOf(':~:text=') !== -1,
params: {
gclid: !!q.get('gclid'), gbraid: !!q.get('gbraid'), wbraid: !!q.get('wbraid'),
srsltid: !!q.get('srsltid'), ved: !!q.get('ved'), udm: q.get('udm'), aep: !!q.get('aep')
},
v: 1
};
} catch (e) { return null; }
}
var q = new URLSearchParams(window.location.search);
var nav = navSignals();
var payload = {
eventType: 'page_view',
apiKey: API_KEY,
pageUrl: window.location.href,
pagePath: window.location.pathname,
pageTitle: document.title,
referrer: document.referrer || undefined,
visitorId: id('reaudit_visitor_id', localStorage),
sessionId: id('reaudit_session_id', sessionStorage),
utmSource: q.get('utm_source') || undefined,
utmMedium: q.get('utm_medium') || undefined,
utmCampaign: q.get('utm_campaign') || undefined
};
if (nav) payload.eventData = { customData: { nav: nav } };
fetch(ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
keepalive: true,
body: JSON.stringify(payload)
}).catch(function () {});
})();
</script>YOUR_API_KEY with your actual API key<script>
(function () {
var ENDPOINT = 'https://reaudit.io/api/site-tracking/track';
var API_KEY = 'YOUR_API_KEY';
function id(k, store) {
try {
var v = store.getItem(k);
if (!v) { v = Date.now() + '-' + Math.random().toString(36).slice(2); store.setItem(k, v); }
return v;
} catch (e) { return Date.now() + '-' + Math.random().toString(36).slice(2); }
}
// Navigation fingerprint — used to tell Google AI Overview clicks apart
// from ordinary organic clicks. Captured only on the first hard load of a
// session that arrived from search; returns null otherwise.
function navSignals() {
try {
var ref = document.referrer;
if (!ref) return null;
var host = new URL(ref).hostname.toLowerCase();
if (host.indexOf('gemini.google.com') !== -1) return null;
if (!/(^|\.)google\.[a-z]{2,3}(\.[a-z]{2})?$/.test(host) &&
!/(^|\.)bing\.com$/.test(host)) return null;
if (sessionStorage.getItem('reaudit_nav_captured')) return null;
sessionStorage.setItem('reaudit_nav_captured', '1');
var n = performance.getEntriesByType('navigation')[0] || null;
var q = new URLSearchParams(window.location.search);
return {
historyLength: window.history.length,
navType: n ? n.type : 'unknown',
redirectCount: n ? n.redirectCount : -1,
visibilityState: document.visibilityState,
hasFocus: document.hasFocus(),
hasOpener: !!window.opener,
textFragment: (window.location.hash || '').indexOf(':~:text=') !== -1,
params: {
gclid: !!q.get('gclid'), gbraid: !!q.get('gbraid'), wbraid: !!q.get('wbraid'),
srsltid: !!q.get('srsltid'), ved: !!q.get('ved'), udm: q.get('udm'), aep: !!q.get('aep')
},
v: 1
};
} catch (e) { return null; }
}
var q = new URLSearchParams(window.location.search);
var nav = navSignals();
var payload = {
eventType: 'page_view',
apiKey: API_KEY,
pageUrl: window.location.href,
pagePath: window.location.pathname,
pageTitle: document.title,
referrer: document.referrer || undefined,
visitorId: id('reaudit_visitor_id', localStorage),
sessionId: id('reaudit_session_id', sessionStorage),
utmSource: q.get('utm_source') || undefined,
utmMedium: q.get('utm_medium') || undefined,
utmCampaign: q.get('utm_campaign') || undefined
};
if (nav) payload.eventData = { customData: { nav: nav } };
fetch(ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
keepalive: true,
body: JSON.stringify(payload)
}).catch(function () {});
})();
</script>YOUR_API_KEY with your actual API keyFor any website — Squarespace, Ghost, Hugo, Jekyll, or plain HTML — add the snippet to your <head> tag:
<script>
(function () {
var ENDPOINT = 'https://reaudit.io/api/site-tracking/track';
var API_KEY = 'YOUR_API_KEY';
function id(k, store) {
try {
var v = store.getItem(k);
if (!v) { v = Date.now() + '-' + Math.random().toString(36).slice(2); store.setItem(k, v); }
return v;
} catch (e) { return Date.now() + '-' + Math.random().toString(36).slice(2); }
}
// Navigation fingerprint — used to tell Google AI Overview clicks apart
// from ordinary organic clicks. Captured only on the first hard load of a
// session that arrived from search; returns null otherwise.
function navSignals() {
try {
var ref = document.referrer;
if (!ref) return null;
var host = new URL(ref).hostname.toLowerCase();
if (host.indexOf('gemini.google.com') !== -1) return null;
if (!/(^|\.)google\.[a-z]{2,3}(\.[a-z]{2})?$/.test(host) &&
!/(^|\.)bing\.com$/.test(host)) return null;
if (sessionStorage.getItem('reaudit_nav_captured')) return null;
sessionStorage.setItem('reaudit_nav_captured', '1');
var n = performance.getEntriesByType('navigation')[0] || null;
var q = new URLSearchParams(window.location.search);
return {
historyLength: window.history.length,
navType: n ? n.type : 'unknown',
redirectCount: n ? n.redirectCount : -1,
visibilityState: document.visibilityState,
hasFocus: document.hasFocus(),
hasOpener: !!window.opener,
textFragment: (window.location.hash || '').indexOf(':~:text=') !== -1,
params: {
gclid: !!q.get('gclid'), gbraid: !!q.get('gbraid'), wbraid: !!q.get('wbraid'),
srsltid: !!q.get('srsltid'), ved: !!q.get('ved'), udm: q.get('udm'), aep: !!q.get('aep')
},
v: 1
};
} catch (e) { return null; }
}
var q = new URLSearchParams(window.location.search);
var nav = navSignals();
var payload = {
eventType: 'page_view',
apiKey: API_KEY,
pageUrl: window.location.href,
pagePath: window.location.pathname,
pageTitle: document.title,
referrer: document.referrer || undefined,
visitorId: id('reaudit_visitor_id', localStorage),
sessionId: id('reaudit_session_id', sessionStorage),
utmSource: q.get('utm_source') || undefined,
utmMedium: q.get('utm_medium') || undefined,
utmCampaign: q.get('utm_campaign') || undefined
};
if (nav) payload.eventData = { customData: { nav: nav } };
fetch(ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
keepalive: true,
body: JSON.stringify(payload)
}).catch(function () {});
})();
</script>Replace YOUR_API_KEY with the key from Step 1. The script is async and won't affect your page load speed.
No data showing up
<head> (not footer)Script blocked by CSP
reaudit.io to your Content-Security-Policy script-src directiveAd blockers interfering
On this page