OpenTree DashboardSign in

$ GET /sites/:id/engagement

Did anyone actually read it?

Opens, unique viewers, dwell time, how far down people got, whether anyone reached the end, and which tenth of the page held attention. Aggregate numbers about a page — not a recording of a person.

What is collected

SignalMeaning
OpensSuccessful content responses for this page.
Unique viewersDistinct visitors, de-duplicated — separate from raw opens.
DwellHow long the page was actually in front of someone, not how long the tab existed.
Scroll depthThe furthest point reached, as a percentage.
Read to endWhether the bottom was reached at all.
Attention mapTen segments across the page, each with the time spent in it.
ReactionsHow many people reacted, and with what.
Last viewedWhen it was last opened, in unix seconds.

What is not collected

This is the line the product sits on deliberately: enough to know whether the deliverable landed, not enough to watch someone read.

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_count

Retention

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.

Keep reading