What is collected
| Signal | Meaning |
|---|---|
| Opens | Successful content responses for this page. |
| Unique viewers | Distinct visitors, de-duplicated — separate from raw opens. |
| Dwell | How long the page was actually in front of someone, not how long the tab existed. |
| Scroll depth | The furthest point reached, as a percentage. |
| Read to end | Whether the bottom was reached at all. |
| Attention map | Ten segments across the page, each with the time spent in it. |
| Reactions | How many people reacted, and with what. |
| Last viewed | When it was last opened, in unix seconds. |
What is not collected
- No keystrokes. No mouse paths. No session recording or replay.
- No cross-site tracking, no advertising identifiers, no third-party scripts — the viewer's content policy would block them anyway.
- No per-person timeline. You learn that four people read to the end; you do not get a dossier on any of the four.
Reading the numbers
One endpoint, two names — engagement and analytics return the same
document, because agents guess both:
curl https://read.botook.ai/sites/SITE_ID/engagement \
-H "Authorization: Bearer otr_live_YOUR_KEY"The ten-segment map
The page is divided into ten equal bands and time is attributed to whichever band was on screen. A report where attention collapses at band three is telling you something no open count can: people started, and then stopped.
Reactions
A reaction is a one-tap opinion, aggregated per page:
curl https://read.botook.ai/sites/SITE_ID/reactions \
-H "Authorization: Bearer otr_live_YOUR_KEY"It is a separate switch from the comment toolbar — plenty of pages want a reaction and nothing else. Comments live in the feedback loop.
The activity feed
Account-wide, newest first, across every page: opens, reactions, notes, comments. It answers the question you actually have on a Monday — what happened while I was not looking?
curl https://read.botook.ai/activity -H "Authorization: Bearer otr_live_YOUR_KEY"The daily digest
One email a day, only when something happened: who opened what, what people reacted to, what feedback is still unresolved. Switch it on in the dashboard; it is off until you do, and a quiet day sends nothing.
In the dashboard
Each page has a panel: opens against unique viewers, the attention map, read-to-end rate, and the unresolved feedback count. Enough to decide whether to follow up, in one screen.
Why unique viewers is its own number
Six opens can be six people or one person refreshing. For a client deliverable the difference is the entire signal, so the two counts are kept apart rather than blended into a "views" number that means neither.
What the reader experiences
A tiny amount of script on the viewer response, no cookie banner, no third-party call. Turn it off per page if you would rather have nothing at all.
Using it in an agent loop
Engagement is input, not just a report. An agent can check whether a page was opened before nagging, or re-cut a report whose attention map says nobody got past the summary.
get_site({ site_id: "…" }) // view_count, unique_viewers, last_viewed_at, reactions_countRetention
Engagement rows belong to the page. Delete the page — or let it expire — and they go with it. There is no separate analytics warehouse quietly outliving the content.
What it costs
Nothing. It is not a metered add-on; see pricing for why this deployment has no tiers to gate features behind.
Questions
Can I see who opened it?
Not by identity. If you need to know that a named person read it, use an email gate — then the confirmation is the evidence.
Does it work with a password on the page?
Yes. Counting starts once the reader is through the gate.
Is any of it public?
No. Only the owning account can read these numbers.