# Kibble installation contract: section 26 of 29 (guide version 3)

> This is **one section only**, not the whole contract. Complete document: https://www.usekibble.dev/AI/guide.md

## 26. Troubleshooting {#troubleshooting}

- **No requests at all:** consent is not granted (`kibble.debug.consent` must read `granted`; that dotted property exists only once the SDK has loaded), or the stored choice is not re-applied on page load.
- **HTTP 403 on /v1/collect:** the key is unknown or the host is not approved. Register the exact host including any non-default port, for example `localhost:4101`, under Manage → Settings. A newly added host can take about fifteen seconds to be accepted.
- **Events rejected as `automated_agent`:** the user agent looked like a bot and was dropped. Test in a normal browser, not curl or an unmodified headless default.
- **Booking engine blocks the collector** (console: `Refused to connect … Content Security Policy`): stop and ask the human. The fix is a first-party gateway on a host the policy allows. See [Cross-domain and first-party gateways](https://www.usekibble.dev/AI#gateways): load the SDK from the gateway path, set `data-endpoint` to the gateway base, and forward only the Kibble paths and only `Content-Type`, `Origin` and `User-Agent` — never cookies, authorization or client IP headers.
- **Consent platform reports the wrong state:** read whether the analytics category is granted, not the highest category; only a choice the visitor made counts. Whether "implied" consent covers analytics is the site owner's legal decision — stop and ask; default to not collecting.
- **Cross-domain through a redirect page** (for example `/book` forwarding to an engine on another domain): links are not decorated with the handoff token. For website hosts on one registrable domain prefer `data-cookie-domain`; for a provider's host link straight to it or use `kibble('decorate', url)` from the script that navigates; otherwise stop and ask.
- **Other rejection reasons** are counted by the Kibble operator; ask the human to check them.
- **Console warning "already installed":** a second snippet is on the page. Remove one.
- **No purchase or booking, only a candidate:** the confirmation signal carries no reference. Add it ([Outcomes](https://www.usekibble.dev/AI#outcomes)). Never submit a real payment or booking to test; use a test property or the engine's test mode, and report "not tested" rather than "should work".
- **Double page views:** a custom page-view call exists next to the automatic SPA tracking, or the Shopify pixel's `page_viewed` mapping runs in the same document as the SDK. Remove the extra call.
- **No page views after a route change in a hash-routed app:** hash routes (`/#/route`) are not tracked as page views.
- **Content id shows as `page:{path}`:** the id is invalid (see the id rules in [Semantic markup](https://www.usekibble.dev/AI#markup)), or the framework set the meta tag later than about 50 ms after navigation.
- **A category or id is missing from reports:** ids with spaces, or six or more digits without a prefix, are dropped. See [Semantic markup](https://www.usekibble.dev/AI#markup).

END OF SECTION troubleshooting
