Unwrapped

Legacy SaaS dossier · docsend

DocSend

DocSend

CategoryDocument trackingDocSend Advanced (Dropbox upsell)Site ↗

A short-link generator with page-by-page view tracking. A weekend project sold as a sales-enablement category.

01 · Data

Data the SaaS sits on

S3 (PDFs)
S3 (PDFs)Yours
PDF.js renderer
PDF.js rendererPublic
Resend (alerts)
Resend (alerts)API

Internal Build Score

0.84

Feasibility of a useful internal substitute for the actually-used 20% of this SaaS, built with Claude and your own data layer.

IBS = 0.25·U + 0.25·C + 0.20·D + 0.15·I + 0.15·Mthis record · 84%
  • U

    User adoption gap

    weight 0.250.60

    How much licensed surface area sits idle.

  • C

    Core simplicity

    weight 0.250.97

    How small the actually-used 20% is when re-implemented honestly.

  • D

    Data portability

    weight 0.200.85

    How clean the exit is, exports, formats, audit lock.

  • I

    Integration burden (inverse)

    weight 0.150.92

    How few external systems must keep working through the SaaS.

  • M

    Moat erosion

    weight 0.150.95

    How much the original differentiator has been commoditised by LLMs + cheap infra.

Editorial heuristic. Not investment advice, not a procurement recommendation.

03 · Feature usage

Commonly used vs. rarely touched

Commonly used

05

  • Upload PDF, get a short link
  • Per-recipient link with email gate
  • Page-by-page view duration
  • Email alert when a deck is opened
  • Revoke / expire link

Rarely touched

06

  • Spaces, folders of links
  • Data rooms competing with a real VDR
  • eSign add-on inside the Dropbox suite
  • Per-page commenting nobody uses on a pitch deck
  • Branded portals on the top tier
  • Custom domains as an enterprise SKU

Internal build

Build it yourself

01 · Stack & flow

Next.js
Next.js
Postgres
Postgres
PDF.js
PDF.js
S3
S3
Resend
Resend

Internal build map

Data in

PDF in S3
Recipient link
Viewer heartbeats

Agent layer

View summariser

Logic

email gate
5s page heartbeat
first-open alert
14-day roll-up

Outputs

Events table
Open alert
Engagement digest
Build time
1 weeks
Run cost
$0.25/seat·mo
vs. SaaS
$15K / yr

Build outline

  1. S3 upload + signed URL per recipient
  2. PDF.js viewer with email-gate intercept
  3. Heartbeat every 5s with current page
  4. Events table: open / page / time-on-page
  5. Email + Slack webhook on first open

02 · Claude prompt

First, map what you actually use (optional)
Step 1 · usage audit prompt

// DocSend usage audit, scope the rebuild Input: the document list with per-link view counts, the spaces / data rooms, and the team's send volume by user over 90 days. ## Do 1. Keep the link + view-tracking feature, that is the actual product. 2. Mark spaces / data rooms as active or abandoned by last view. 3. Flag any data room with NDA / gating needs, those may warrant a real VDR rather than a rebuild. ## Output JSON: { keep_features[], active_spaces[], vdr_candidates[], drop[] }.

Step 2 · rebuild the core

// Deck-view summariser, sales digest You receive (a) one prospect's view events for the last 14 days (timestamp, page, duration_ms), and (b) the deck's page index (slide titles). ## What you must do 1. Identify the slides the prospect lingered on (> 60s) and the slides they skipped (< 5s). 2. Produce one sentence: "Spent most time on …; skipped …; opened N times across M days." 3. Return a confidence flag: "strong signal" / "weak signal" / "noise", based on total session count and time depth. ## What you do not do - Do not infer intent ("they're going to buy"); only describe behaviour. - Do not paraphrase slide content the prospect didn't view. ## Output JSON: { summary, confidence, hot_slides[], skipped_slides[] }.

03 · Result

Summary for prospect ACME, Series A deck
deck:series-a-v3#prospect:acme

Spent most time on slides 5 (Market) and 11 (Pricing); skipped Team; opened 4× across 6 days. Strong signal.