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

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

## 11. What the SDK does automatically {#automatic}

Once consent is granted, the SDK does the following with no extra code. **Do not add code that duplicates these behaviors.**

### Automatic

- **Page views.** One `page_view` when the page loads (after consent and DOM ready). Single-page navigation is observed through `pushState`, `replaceState`, `popstate` and restores from the back/forward cache. The title and content meta are re-read about 50 ms after a navigation, so a framework that updates them later is missed.
- Fragment-only changes (`#...`) are **not** page views, and hash-routed single-page apps (`/#/route`) are not tracked as page views.
- **Attention time.** Active time on a page: the tab is visible and focused, with recent input. Sent at navigation, when the page is hidden, and periodically.
- **Technical errors.** `tech_error` for uncaught script errors and for images, scripts or stylesheets that fail to load. Only the class is sent: no message, stack or URL. HTTP and fetch failures and unhandled promise rejections are not tracked.
- **Page performance.** For each page load (the first load of a page, and each restore from the back/forward cache) the SDK measures Largest Contentful Paint, Interaction to Next Paint, Cumulative Layout Shift and Time to First Byte with the browser's performance observers, and sends one small `web_vitals` snapshot with the batch that is already sent when the page is hidden. No extra request, no polling, no element names, text or URLs. It needs consent in effect when the SDK starts on the page: a page load where consent is given later is not measured (nothing from before consent is used); the next page load is. Browsers without these APIs (for example older Safari or Firefox for some metrics) send what they support. On single-page sites the values describe the whole page load and stay with the page where it loaded. Turn it off with `data-performance="off"`, or sample with a rate such as `data-performance="0.5"`. **Do not add web-vitals or another performance library for Kibble.**
- **Destination clicks.** A click on a link to a destination configured in `data-connected-hosts` records a `click` event.
- **Native form validation errors** on forms you marked with `data-kibble-form`.
- **Contact Form 7 acceptance.** The SDK reports `form_accepted` when Contact Form 7 reports mail sent.
- **Outcome candidates** for thank-you-like URL paths (for example `/thank-you`, `/confirmation`, `/booking-confirmed`), unless `data-auto-candidates="false"`. A candidate is never a confirmed outcome. See [Outcomes](https://www.usekibble.dev/AI#outcomes).
- **Cross-domain link decoration.** Links, GET forms and form actions to a configured destination carry a one-time `_kbh` token, minted per destination and renewed only after visitor activity (no polling, nothing on hover). Decoration is textual: the query string and fragment are preserved. See [Website hosts, external connections and first-party gateways](https://www.usekibble.dev/AI#gateways).

### Never automatic

- **Site search.** No search is detected. Call the SDK yourself ([Site search](https://www.usekibble.dev/AI#search)).
- **Booking criteria** without `data-kibble-criteria` markup ([Booking engines and booking widgets](https://www.usekibble.dev/AI#booking)).
- **Availability.** It comes only from the booking engine through the dataLayer or an explicit call.
- **Product, cart and checkout events.** They need the dataLayer mapping, a platform adapter or explicit calls.
- **Confirmed outcomes.** They need a reference from a confirmed step ([Outcomes](https://www.usekibble.dev/AI#outcomes)).
- **Form acceptance**, except for Contact Form 7 ([Forms](https://www.usekibble.dev/AI#forms)).
- **Forms, sections, clicks and content ids** without the markup in [Semantic markup](https://www.usekibble.dev/AI#markup).

END OF SECTION automatic
