Pitch deck tracking

The same machinery pointed at a document instead of a website. Built for the HLD Sentinel investor deck, and available for any hosted deck or proposal where the question is not "how many people opened it" but "did this person read it, and where did they stop".

Why it is separate

A deck is one HTML page. Every slide change happens in the browser, so request logs show a single hit and tell you nothing. A deck also has a fixed slide count and a named audience, where a website has open-ended URLs and anonymous visitors — which is why slides are tracked by number and sessions can be labelled by recipient.

Per-slide reach

The number worth reading is reach-through: how far each viewer got before they stopped. A deck where everyone reaches slide four and nobody reaches slide six has a problem on slide five, and no amount of aggregate open-rate says so.

NameTypeRequiredDescription
max_slideintegerNoThe furthest slide this viewer reached.
sessions_reachedintegerNoPer slide: how many viewers ever got this far.
slide_views / unique_viewersintegerNoEntries into a slide, and how many distinct viewers produced them. The gap is revisits.
avg_dwell_msnumberNoAverage time on the slide, from slide exits.
completedbooleanNoReached the final slide.
pdf_downloadedbooleanNoTook the PDF — usually the strongest single signal in the whole record.

Slide heatmaps

Two layers per slide, exactly as for a web page: raw click coordinates, and a binned pointer attention grid. Positions are fractions of the slide rather than pixels, because a deck letterboxes itself into whatever viewport it lands in — a click 40% across is the same place on a laptop and a boardroom display, and 700 pixels is not.

bash
GET /api/pitch-tracking/heatmap?deck=sentinel&slide=3
GET /api/pitch-tracking/heatmap?deck=sentinel&slide=3&mode=pointer

Who, not how many

NameTypeRequiredDescription
visitor_labelstringNoFrom ?v= on the shared link. A session has a name before anyone has to recognise an IP address.
visit_numberintegerNoWhich visit this is. Counted server-side, so a cleared localStorage does not reset it.
viewer_name / viewer_emailstringNoWhen the link had an email gate. Set mid-session, never inferred.
ip_company / ip_ptrstringNoThe organisation behind the address, from one reverse-DNS lookup per session.
first_advance_msintegerNoHow long before they moved off slide one. A long pause here and a short deck is someone who opened it and left.
slide_revisitsintegerNoGoing back to a slide is interest, and it is invisible in a page-count.

Engagement signals

  • Navigation method — keyboard, click, touch or wheel. Keyboard is a careful reader; wheel is a skim.
  • Zoom level, copy, print and screenshot attempts, and the context menu.
  • Active time against wall-clock time, so a deck left open on a second monitor is not counted as reading.
  • Full-screen and overview-mode entries.

Bot filtering matters more here

Warning:Link-detonation sandboxes — Microsoft Safe Links, LinkedIn's scanner — render a deck properly and click through several slides within a minute of the email being sent. Left unfiltered they look exactly like the recipient opening it immediately, which is the single most misleading thing this system could tell you. They are flagged by network and by browser shape, not by whether the session did anything.

Access

Deck analytics are read through /api/pitch-tracking/analytics and are restricted to HLD global administrators — decks are internal material, so there is no client key path for them. Ask HLD to set up tracking on a deck; the dashboard lives at /pitch/tracking.