How to Review the Whole Reading History Before the Sales Call
Every sales playbook says “come prepared” and means the CRM: past emails, deal stage, last activity. But the sharpest prep artifact is newer than all of that — how the prospect read your proposal this week: which pages held them, which they skipped, where they returned.
If the proposal went out behind a tracked link, that history is three API calls away. This is the five-minute pre-call ritual, on real (and realistically messy) data.
Pull the history
One call lists every session the document has had — Alex's morning, newest first:
curl -s "https://apdf.io/api/docs/4352c-99928-25aa1/analytics/sessions" \
-H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" |
jq -r '.data[] | "\(.created_at) · \(.pages_viewed)/3 pages · \(.total_duration_ms)ms"'
2026-07-23 07:36:55 · 2/3 pages · 59000ms
2026-07-23 07:17:09 · 3/3 pages · 82000ms
2026-07-23 07:14:01 · 0/3 pages · 0ms
2026-07-23 06:54:41 · 0/3 pages · 0ms
2026-07-23 06:54:38 · 0/3 pages · 0ms
Read it bottom-up and a story forms: two zero-page opens at 06:54 (your email landed; the double-tap is a preview or a hurried click), another bounce at 07:14, then the real engagement — a full read at 07:17 and a return visit twenty minutes later. Zero-page rows aren't noise to delete; they're the “saw it, wasn't ready” beats of the timeline.
Zoom into the two visits that matter
The session detail endpoint turns each visit into a per-page record. The 07:17 read, balanced across all three pages:
GET /api/docs/4352c-99928-25aa1/analytics/sessions/{sessionId}
"pages": [
{ "page": 1, "views": 1, "duration_ms": 21000, "viewed": true },
{ "page": 2, "views": 1, "duration_ms": 34000, "viewed": true },
{ "page": 3, "views": 1, "duration_ms": 27000, "viewed": true }
]
And the 07:36 return — a very different shape:
"pages": [
{ "page": 1, "views": 1, "duration_ms": 12000, "viewed": true },
{ "page": 2, "views": 0, "duration_ms": 0, "viewed": false },
{ "page": 3, "views": 1, "duration_ms": 47000, "viewed": true }
]
First visit: due diligence. Second visit: straight past the scope to 47 seconds on the pricing page. He isn't re-reading your deliverables — he's sitting with the number.
Write the three-line brief
Condense it into the note that sits next to your phone:
ALEX MOREAU — Q3 Services Proposal — call 14:00
Trajectory: opened on arrival → full read 07:17 (82s, all pages)
→ RETURNED 07:36 straight to pricing (47s)
Hot page: 3 (pricing) — visited twice, never lingered on scope
Open with: payment structure / phasing — not a scope walkthrough
The discipline: the brief informs your agenda, never your script. “Happy to walk through how the investment splits across phases” is prepared; “I saw you re-read the pricing page” is surveillance. Same data, opposite calls.
Where to go from here
Prep is one use of the history — here are the others.
Related tutorials
Build a Morning Briefing Agent for Your Documents
A digest lists what happened; a briefing arrives with the thinking done. One standing prompt over the MCP-connected workspace and Claude sweeps every document's sessions on a headless cron — call-first with evidence and a suggested opener, the next tier in one line each, and the silence flagged.
See If Clients Actually Read Your Monthly Reports
The report nobody reads is the retainer nobody renews. Tracked links per client sort the portfolio in one sweep — both Meridian stakeholders read cover to cover, Brightpath flicked for 15 seconds, Okafor never opened — and per-page data tells you whether your decision request was ever seen.
Build a PDF Engagement Dashboard for Your App
Our dashboard answers our questions; your product has its own. One Node.js script and three endpoints render an activity-first dashboard — documents ranked by reading, KPIs per card, latest readers named — ready to cron onto a wall monitor or fold into your backend. Token stays server-side, always.