Logo
Apdf tutorials August 2026 4 min read

How to Track Investor Updates and Know Who Actually Reads Them

The monthly investor update is a letter into the void: you ship your metrics, wins and asks to twenty inboxes, get two “great progress!” replies, and learn nothing about the other eighteen. Then a raise starts, and you cold-rank your own cap table by gut feeling.

Reading behavior is the RSVP investors never send. Put each update behind per-investor links and three months of “who read what, how deeply” accumulates into the warmest-first call list for your next round.

What you'll build
Three monthly updates tracked across six investors, and a verdict per name instead of a hunch: Sandra: 3 for 3, deepest read yet in July → call first · Ben: silent since May → different play
Everything in this tutorial works on the free plan · 90 days of data retention on Pro
1

Send each update through per-investor links

Every month: upload the update as a private document, then mint one link per investor — same list, fresh document:

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

curl -X POST https://apdf.io/api/docs/d9e57-0e204-121c3/links \
  -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" \
  -d name="Miriam Wolfe" -d email="miriam@boardseat.example"

Each investor gets their own URL in your update email — that's the whole sending change. With more than a handful of recipients, the bulk links script turns your investor CSV into the full link set in one run.

2

Build the opens matrix

The link roster doubles as an attendance sheet: last_viewed_at per investor, per update. One loop over your monthly documents:

for DOC in $MAY_ID $JUNE_ID $JULY_ID; do
  curl -s "https://apdf.io/api/docs/$DOC/links" \
    -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" |
  jq -r '.data[] | "\(.name): \(.last_viewed_at // "never")"'
done
# May                              # June                             # July
Miriam Wolfe:  2026-05-25T10:13Z   Miriam Wolfe:  2026-06-24T10:13Z   Miriam Wolfe:  2026-07-21T10:13Z
Viktor Chen:   2026-05-26T12:26Z   Viktor Chen:   2026-06-26T12:26Z   Viktor Chen:   2026-07-21T12:26Z
Sandra Okafor: 2026-05-25T14:39Z   Sandra Okafor: 2026-06-25T14:39Z   Sandra Okafor: 2026-07-22T14:39Z
Ben Odell:     2026-05-27T16:52Z   Ben Odell:     never               Ben Odell:     never
Rachel Kim:    2026-05-28T08:05Z   Rachel Kim:    2026-06-28T08:05Z   Rachel Kim:    2026-07-22T08:05Z
Tobias Brandt: never               Tobias Brandt: never               Tobias Brandt: never

Two verdicts fall out immediately: Ben stopped opening after May, and Tobias has never opened at all — the second one is a deliverability-or-fit question, not an engagement question. Resend differently before you conclude anything.

3

Let depth separate readers from skimmers

Opens flatter everyone who clicks. The sessions data tells you who actually read July:

Analytics overview for Investor Update — July 2026: 4 sessions, 4 unique viewers, 2.1 minutes average duration, 88% completion rate
curl -s "https://apdf.io/api/docs/$JULY_ID/analytics/sessions" \
  -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" |
jq -r '.data[] | "\(.recipient.name): \(.completion_pct)% · \(.total_duration_ms)ms · \(.device_type)"'

Sandra Okafor: 100% · 231000ms · desktop
Rachel Kim:    50% · 20350ms · mobile
Viktor Chen:   100% · 52500ms · mobile
Miriam Wolfe:  100% · 203000ms · desktop

Same 100% completion, very different investors: Sandra spent 3.9 minutes in a 4-page update — she studied it — while Viktor's 52 seconds is a dutiful phone flip-through. Rachel opened politely and left halfway. Completion tells you they arrived; duration tells you they cared.

4

Turn three months into a call list

Stack the months and each investor becomes a pattern:

  • Miriam — every update, same-day, 3+ minutes. Your champion; she should hear about the raise before the email.
  • Sandra — three for three with dwell time rising. Warming — the first call when the round opens.
  • Viktor — reliable skims. Aware, not leaning in; a concrete ask might convert attention into help.
  • Ben — read May, silent since. Cold; a personal note beats another group update.
  • Tobias — zero opens across three sends. Fix delivery (or accept the signal) before spending effort here.

Want the cold ones flagged without checking? An automation on document:loaded pings you the moment any investor opens — the open-notification tutorial is the same build pointed at your update.

Where to go from here

The raise itself gets the same treatment — deeper tools, same links.

Ready to see who reads?