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.
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.
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.
Let depth separate readers from skimmers
Opens flatter everyone who clicks. The sessions data tells you who actually read July:
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.
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.