Logo
Apdf tutorials August 2026 4 min read

How to A/B Test Two Versions of Your Sales One-Pager

Every sales team has this argument: the feature-tour one-pager versus the customer-story one-pager, settled by whoever argues longest. Attachments can't end the debate — both versions disappear into inboxes and return nothing.

Tracking links can. Split your next send down the middle, give each half a different variant, and a week later the reading data calls the winner — not the loudest voice in the room.

What you'll build
Two variants, ten prospects, five links each — and a verdict from real reading behavior: Variant A: 13.5s average dwell · Variant B: 43.4s and two re-opens → B ships to the rest of the list
Everything in this tutorial works on the free plan
1

Make it a fair fight

Change one variable. Here that's the framing — Variant A tours the features, Variant B tells one customer's outcome story — with the same offer, same design, same send day. Upload both as private documents:

curl -X POST https://apdf.io/api/docs \
  -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" \
  --data-urlencode "file=https://your-site.example/onepager-a.pdf" \
  --data-urlencode "name=Reporting One-Pager — Variant A" \
  -d "is_public=0"
# repeat for Variant B — note both doc_ids
2

Split the list mechanically

No cherry-picking — alternate rows of the contact CSV so neither variant gets the warmer half. One loop mints the links:

i=0
while IFS=, read -r NAME EMAIL; do
  DOC=$([ $((i % 2)) -eq 0 ] && echo "$A_ID" || echo "$B_ID")
  curl -s -X POST "https://apdf.io/api/docs/$DOC/links" \
    -H "Authorization: Bearer $API_TOKEN" -H "Accept: application/json" \
    --data-urlencode "name=$NAME" --data-urlencode "email=$EMAIL" -o /dev/null
  i=$((i+1)); sleep 1  # stay under the API rate limit
done < <(tail -n +2 contacts.csv)

Ten contacts in, five links on each variant out. Mail-merge each half its own URLs and the experiment is live — every open and every second of reading now lands on the right side of the scoreboard, attributed by name.

3

Read the scoreboard

A week later, one call per variant settles it:

$ curl -s "https://apdf.io/api/docs/$A_ID/analytics" -H "Authorization: Bearer $API_TOKEN" \
    -H "Accept: application/json" | jq '.data | {sessions, unique_viewers, avg_duration_ms}'
{
  "sessions": 4,
  "unique_viewers": 4,
  "avg_duration_ms": 13500
}

$ curl -s "https://apdf.io/api/docs/$B_ID/analytics" -H "Authorization: Bearer $API_TOKEN" \
    -H "Accept: application/json" | jq '.data | {sessions, unique_viewers, avg_duration_ms}'
{
  "sessions": 7,
  "unique_viewers": 5,
  "avg_duration_ms": 43429
}

Reading the numbers like an experimenter:

  • Dwell time is the verdict — 13.5 versus 43.4 seconds average on the same-length page. Variant B held people three times longer.
  • Re-opens are the tell — B logged 7 sessions from 5 viewers: two people came back. Nobody returned to A.
  • Reach differed too — 4 of 5 opened A, 5 of 5 opened B. With identical subject lines, that's noise; log it, don't celebrate it.
  • Completion can't referee a one-pager — it reads 100% on both sides the moment anyone opens page one of one. For single-page tests, dwell and re-opens carry the decision.
4

Call it honestly, then ship the winner

Five readers per arm is a directional test, not a p-value — treat a 3× dwell gap as a confident direction and anything under 1.5× as a tie. Send the winner to the rest of the list (the bulk links script scales the mail merge), and keep the loser's link set live: stragglers who open late keep feeding the data.

Then test the next single variable — subject line, opening claim, the case study you lead with. The scoreboard's already built.

Where to go from here

The experiment machinery generalizes — same links, bigger questions.

Ready to see who reads?