feat(docs): PostHog loads only with a granting consent answer

DEV-2465 open question 5, option d. Mintlify's built-in integration
loaded PostHog unconditionally on all 249 docs pages — a visitor who
declined on the homepage was tracked one click later in the docs. The
integration key comes out of docs.json; docs/posthog-consent.js loads
PostHog directly instead, only when the CookieConsent cookie grants
Statistics (or holds Cookiebot's -1 marker), and listens for the
consent events so a grant on the docs banner itself loads it too.

Trade recorded on the ticket: this bypasses the ph.mintlify.com proxy,
so ad blockers reduce docs PostHog volume. Verify after deploy that
Mintlify's page CSP allows us-assets.i.posthog.com; if it blocks,
fall back to option c.
This commit is contained in:
Erosika 2026-08-25 16:45:18 -04:00
parent b7bcb32738
commit 0b9ae00170
2 changed files with 43 additions and 3 deletions

View File

@ -630,9 +630,6 @@
}
},
"integrations": {
"posthog": {
"apiKey": "phc_1yrzzcgywqXGcerkkI4g7C0YfyPMcAKNOOvGcjTCiUk"
},
"gtm": {
"tagId": "GTM-NSPT9PJF"
}

43
docs/posthog-consent.js Normal file
View File

@ -0,0 +1,43 @@
// Loads PostHog only when the CookieConsent cookie grants Statistics; the
// cookie is host-scoped, so a landing-page answer covers the docs.
;(function () {
var KEY = 'phc_1yrzzcgywqXGcerkkI4g7C0YfyPMcAKNOOvGcjTCiUk'
var loaded = false
function granted() {
var m = document.cookie.match(/CookieConsent=([^;]*)/)
if (!m) return false
var v = decodeURIComponent(m[1])
// "-1" is Cookiebot's consent-not-required marker.
return v === '-1' || /statistics\s*:\s*true/.test(v)
}
function loadPosthog() {
if (loaded) return
loaded = true
var s = document.createElement('script')
s.src = 'https://us-assets.i.posthog.com/static/array.js'
s.async = true
s.onload = function () {
window.posthog.init(KEY, {
api_host: 'https://us.i.posthog.com',
ui_host: 'https://us.posthog.com',
cross_subdomain_cookie: true,
person_profiles: 'identified_only',
})
}
document.head.appendChild(s)
}
if (granted()) {
loadPosthog()
return
}
// A grant made on the docs banner itself (step 2) loads it live.
var events = ['CookiebotOnConsentReady', 'CookiebotOnAccept']
for (var i = 0; i < events.length; i++) {
window.addEventListener(events[i], function () {
if (granted()) loadPosthog()
})
}
})()