Logo
Apdf tutorials July 2026 4 min read

How to Track Your Pitch Deck and See Which Investors Actually Read It

You sent the deck to twelve investors. Two replied, one asked for a call, and the rest are — silence. But silence isn't one thing: some never opened it, some skimmed three slides between meetings, and one read your financials twice last night. Those are completely different follow-ups.

In this tutorial you'll send the deck through per-investor tracking links, so every open, every slide, and every re-read tells you exactly who deserves your energy this week.

What you'll build
A reading report for your fundraise: each investor gets a personal link, and you see per investor how long they stayed, how deep they got, and when they came back — in the dashboard and over the API: Maya Lindqvist: 6m29s · 100% read  —  Jonas Weber: 0m33s · 40% read
Everything in this tutorial works on the free plan
1

Put the deck behind per-investor links

Upload the deck once, then mint one link per investor. Each link is tokenized with the investor's identity — that's what turns anonymous "views" into Maya read it twice.

curl -X POST https://apdf.io/api/docs \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json" \
  -d file="https://your-server.com/nimbushr-seed-deck.pdf" \
  -d name="NimbusHR Seed Deck"

curl -X POST https://apdf.io/api/docs/1ded0-93481-02007/links \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json" \
  -d name="Maya Lindqvist" \
  -d email="maya@nordicventures.example"
{
    "data": {
        "token": "LB9oQJ6v",
        "name": "Maya Lindqvist",
        "email": "maya@nordicventures.example",
        "url": "https://docs.apdf.io/nimbushr/1ded0-93481-02007?v=LB9oQJ6v",
        "is_active": true,
        "last_viewed_at": null,
        "created_at": "2026-07-23T07:01:31.000000Z"
    }
}

Repeat per investor — a loop over your target list if you're scripting it, or two clicks each in the dashboard. Then email each investor their link.

Tip: The links are yours to control: deactivate one at any time and it stops working — even if the deck was forwarded around.
2

Read the room in the dashboard

From the first open, reading sessions appear under your document: open it under Documents and switch to the Sessions tab.

The Sessions tab listing three investor reading sessions with completion badges, page counts and durations: two full reads of ten pages and one 40% skim that ended after four pages

Three investors, three different follow-ups:

  • Maya read all ten slides for 6.5 minutes — expand her session and you'll see the Traction and Financials slides held her longest. Prepare that call.
  • Sofia finished the deck and came back to Team and The Ask — a partner discussion is happening. Offer the meeting now.
  • Jonas dropped off after four slides in 33 seconds. Don't burn a follow-up on him this week.
3

Pull the same answers over the API

Everything the dashboard shows is one API call away — per session, per investor:

curl https://apdf.io/api/docs/1ded0-93481-02007/analytics/sessions \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
{
    "data": [
        {
            "session_id": "sMayaDeckRead001",
            "viewer_id": "vMayaLindq01xxxx",
            "recipient": {
                "name": "Maya Lindqvist",
                "email": "maya@nordicventures.example"
            },
            "device_type": "desktop",
            "browser": "Chrome",
            "os": "Linux",
            "referer": null,
            "utm_source": null,
            "created_at": "2026-07-23 01:52:14.546",
            "pages_viewed": 10,
            "total_duration_ms": 389000,
            "completion_pct": 100,
            "prints": 0,
            "downloads": 0
        }
    ]
}

Which makes the investor ranking a one-liner — sorted by attention, ready for your Monday pipeline review:

curl -s https://apdf.io/api/docs/1ded0-93481-02007/analytics/sessions \
  -H "Authorization: Bearer YOUR_API_TOKEN" -H "Accept: application/json" \
  | jq -r '.data | sort_by(-.total_duration_ms) | .[]
      | "\(.recipient.name): \(.total_duration_ms / 60000 | floor)m\(.total_duration_ms % 60000 / 1000 | floor)s · \(.completion_pct)% read"'
Maya Lindqvist: 6m29s · 100% read
Sofia Ricci: 4m47s · 100% read
Jonas Weber: 0m33s · 40% read

Where to go from here

Knowing who read it is the start — the same links can tell you the moment things change.

Ready to see who reads?