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

# Pacing

> How often ads appear in a conversation — paced by us, or overridden per message with trackOnly.

**Pacing** is how often ads appear in a conversation. Showing one under every assistant message is usually too much — it saturates the chat and the reader tunes out. Kontext supports two ways to control pacing, and they compose.

## Option 1: Let us pace it

Pacing lives in your account configuration on our side. Tell us the cadence you want — for example, "an ad every five assistant messages", or "no ad in the first three turns of a fresh conversation" — and we set it up. The SDK then automatically decides which assistant messages get an ad. No code changes in your app.

If you're unsure where to start, we'll suggest a cadence based on what works for similar publishers.

## Option 2: Override per message with `trackOnly`

If you want to suppress the ad in a specific slot, simply set `trackOnly: true` on the **user** message that precedes the assistant turn you want to skip:

```ts theme={null}
session.addMessage(
  { id: 'u-99', role: 'user', content: '…', createdAt: new Date() },
  { trackOnly: true }
)
```

The assistant message that follows will not show an ad. The current turn is muted, but **the SDK keeps working in the background**:

* **You still call `addMessage` for every message.** Skipping it breaks the conversation context the server uses for targeting in later turns. Always pass every message — just flag the ones you want to suppress.
* **The SDK still hits `/preload`.** Server-side analytics stay accurate.
* **The server prepares an ad ahead of time for the next non-`trackOnly` turn.** This is a server-side benefit, not a client-side cache: when the next ad-eligible turn arrives, fill rate is higher (the server had more time to find a good contextual match) and the ad is delivered faster (it was already prepared on our side).

In short, `trackOnly` hides the ad for one turn while keeping the conversation context warm on our side, so the next ad-eligible turn fills faster and more often.

## Where to next

<CardGroup cols={2}>
  <Card title="Messages" icon="message" href="/concepts/messages">
    The `addMessage` call you set `trackOnly` on.
  </Card>

  <Card title="Ad lifecycle events" icon="bell" href="/concepts/events">
    Which events still fire when an ad is suppressed.
  </Card>
</CardGroup>
