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

> ## Agent Instructions
> Read /start/capabilities before choosing an integration. Use the deployed server’s tools/list for current tool inputs.

# Goals & results

> Compare personalization with the original site.

Choose one primary goal and keep a holdout group. **Results** compares sessions assigned to personalization with sessions that kept the original.

## Choose a goal

| Type | Use it for |
| - | - |
| `click` | A click on a matching element |
| `submit` | A form submission |
| `page` | Reaching a completion page |
| `event` | An action confirmed by your application |

For an event goal:

```js theme={null}
window.dynamite = window.dynamite || [];
window.dynamite.push(['track', 'demo_requested']);
```

Create a matching goal named `demo_requested`. Prefer a successful action over the click that starts it.

## Read the comparison

Review session counts, conversion rates, lift, and the confidence interval together. Small samples and wide intervals need more evidence.

Variant-level rates are observational: different visitors receive different variants. Use the website-level personalized-versus-holdout comparison for the main outcome.

> [accordion] Assignment and holdout
>
> The browser and server deterministically bucket the logical site ID, experiment salt and anonymous visitor ID. The configured personalized percentage determines the holdout fraction. Membership is stable for the same inputs and allocation; changing the threshold can move visitors, and restarting can change the experiment context.
>
> Holdout visitors keep originals and skip model calls. Paused experiments produce the `off` group. Previews always personalize and are measured separately. A personalized visitor can still receive originals because of weak context, fallbacks or rendering guards.
>
> Retain a nonzero holdout to estimate lift. Setting 100% personalization removes the contemporaneous original comparison. Decide the primary goal and analysis window before drawing conclusions.

> [accordion] Event and goal definitions
>
> | Kind | Trigger | Integration detail |
> | - | - | - |
> | `click` | Click matching a selector through `closest()` | Counts the action, not successful downstream fulfillment |
> | `submit` | Submit event on a matching form | Native submit is not proof your backend accepted it |
> | `page` | Exact path or trailing `*` prefix | Goal matching ignores trailing slashes; target registration is different |
> | `event` | `dynamite.track(name, { value? })` | Emit after confirmed application success; configure the same name |
>
> Up to 20 goals are supported, with exactly one primary when the list is nonempty. Repeated firing of the same goal within 1.5 seconds is deduplicated. Conversion rates count sessions with at least one conversion, not the total number of repeat events.
>
> | Signal | Meaning |
> | - | - |
> | Page | Page view, including pages without personalization targets |
> | Engage | Visible active time, using recent activity and focus rules |
> | Applied / served | A target was rendered with an alternative or original |
> | Exposure | At least half of the target visible for one second, once per page view |
> | Click | Click inside a rendered target |
> | Decision | Server/model or browser decision timing and outcome |
> | Conversion | Configured goal fired |
> | Reading | Article-body time/progress/milestones for configured editorial pages |
> | Enrichment | Connector outcome and timing |
>
> Serving a variant is not a visible exposure. Exposing a variant is not evidence it caused conversion. The server validates referenced pages, targets, variants and goals and recomputes experiment membership rather than trusting the browser's claimed group.

> [accordion] Sessions, timing, and editorial metrics
>
> Sessions expire after 30 minutes without activity and are shared across tabs for the site. Browser identity reset starts a new journey. Time to personalize measures navigation/route start through application of a non-default variant; decision round trip, server time and model inference are distinct metrics. Percentiles use fixed latency buckets.
>
> Internal extension traffic can be marked with `localStorage['dynamite:internal'] = '1'` and excluded. Check that state when validating real measurement. Preview sessions never establish live uplift.
>
> For registered articles, `dynamite:first_article` and `dynamite:second_article` track the first two distinct reads in a session. Continuation is second-article sessions divided by first-article sessions within the same group and interval.

> [accordion] Retention and delivery
>
> Raw events are retained 35 days; sessions 180 days; daily counters and latency rollups remain. Production writes dedicated Postgres analytics tables. Queues flush roughly every 1.5 seconds and on graceful shutdown; abrupt process loss can drop recent buffered events. Local file-mode development keeps analytics in memory. Results are measurement, not a financial ledger.
>
> Source: [tracker](https://github.com/ion-design/dynamite/blob/main/packages/adaptive/src/browser/tracker.ts), [experiment assignment](https://github.com/ion-design/dynamite/blob/main/packages/adaptive/src/experiment.ts), [analytics](https://github.com/ion-design/dynamite/tree/main/packages/personalization-server/src/analytics).


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