Logo
Apdf tutorials October 2026 4 min read

How to See If Clients Actually Read Your Monthly Reports

Every agency carries the same quiet fear: the monthly report — hours of pulling numbers, writing narrative, polishing charts — lands in the client's inbox and evaporates. No reply doesn't mean no problem. The client who stopped reading your reports three months ago is the churn call you get next quarter.

Send each report through a tracked link and the fear becomes a dashboard: who reads, who flicks, who's gone dark — per client, every month, while there's still time to act on it.

What you'll build
Three clients, three July reports, three very different renewal forecasts: Meridian: both stakeholders read · Brightpath: a 15-second flick · Okafor: never opened
Everything in this tutorial works on the free plan
1

One report per client, one link per stakeholder

Each client's report is its own private document; each person on the client side gets their own link. That's what turns “the report was viewed” into “Priya read it Monday, Dev caught up Tuesday”:

curl -X POST https://apdf.io/api/docs \
  -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" \
  --data-urlencode "file=https://your-site.example/reports/july-meridian.pdf" \
  --data-urlencode "name=July Report — Meridian Labs" \
  -d "is_public=0"

curl -X POST https://apdf.io/api/docs/0e4b8-25426-cdb90/links \
  -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" \
  -d name="Priya Raman" -d email="priya@meridianlabs.example"
2

Read the account health off the KPIs

One analytics call per client report, and the portfolio sorts itself:

# July Report — Meridian Labs
{ "sessions": 2, "unique_viewers": 2, "avg_duration_ms": 111500, "completion_rate": 88, ... }

# July Report — Brightpath Studio
{ "sessions": 1, "unique_viewers": 1, "avg_duration_ms": 15000, "completion_rate": 50, ... }

# July Report — Okafor Capital
{ "sessions": 0, "unique_viewers": 0, "avg_duration_ms": 0, "completion_rate": 0, ... }
  • Meridian is healthy — two stakeholders, nearly two minutes each, 88% completion. The retainer is read, literally.
  • Brightpath is drifting — one 15-second flick over two pages. Not angry, not engaged — the most dangerous state, because it looks like silence until renewal.
  • Okafor is a flare — zero opens, five days after sending. Check the contact still exists, then pick up the phone. This is next quarter's churn call, available early.
3

Check whether your ask was ever seen

Reports usually end with a decision request — ours is page 4, “one decision we need from you.” The per-page session data answers a question no reply-silence can: did they even see it? Priya spent 45 seconds on page 4 — she saw the ask and hasn't answered, which is a nudge. Marcus never reached it — his silence isn't a decision, so the ask goes into the body of the next email instead.

Same silence, two completely different follow-ups — that's the difference per-page data makes. (The drop-off tutorial turns this into a habit across all readers.)

4

Bring the receipts to renewal

Come renewal, the reading history argues for you in both directions: for the engaged client, “your team read every report cover to cover” is evidence the retainer delivers value someone consumes. For the quiet one, three months of unread reports reframes the conversation — not “please renew” but “let's change what we send you, because this format isn't serving you.” Either way you're negotiating from data, not hope.

Tip: Don't want to check manually? The daily digest posts every report read to Slack, and an open alert (Pro) pings the account manager the moment their client opens.

Where to go from here

The agency stack around this habit.

Ready to see who reads?