---
source: "niche-automation-prospecting"
date: "2026-03-14"
tags: [research, methodology, cold-email, ab-test, copy-testing, experiment-design]
---

# Blind Email A/B/C Test — Experiment Methodology and Replication Guide

## Purpose

Tests which of three email versions performs best with actual buyers — and whether business-consultant gatekeepers can reliably predict buyer preference. Blind comparison removes version-label bias: judges rank emails without knowing which version they're reading or who wrote them. This isolates copy quality from author credibility.

The experiment also benchmarks gatekeeper accuracy, which determines whether consultants/advisors can serve as a proxy for buyer panels in future tests where finding real owner-operators is expensive or slow.

## What Was Compared

Three email versions written for the pest-control-spring-2026 campaign, all targeting the same pain (after-hours lead loss):

- **Draft** — Golden 4-Sentence Framework structure: pain hook, stat, implication, single question close
- **Revised** — Rubric-critique rewrite of draft: tightened framing, removed escape hatches, strengthened closes
- **Copywriter** — 10 distinct copy strategies, one per group (scenario contrast, empathetic review framing, one-liner pattern interrupt, disarming self-aware opener, etc.)

The 30 total emails were organized into 10 positionally matched groups (group 1 = all three versions on the same hook/angle, group 2 = all three on a different hook, etc.). Each group contained exactly one draft, one revised, and one copywriter version covering the same underlying angle — with some exceptions noted under Limitations.

## Two-Panel Design

### Gatekeepers (5 judges)

Business consultants and advisors acting as proxies for buyers. Each was given the gatekeeper ballot — 10 groups × 3 emails — and asked to rank each group 1st/2nd/3rd as if deciding which email would most likely get a response from a pest control owner-operator. Persona framing was provided: they were told to evaluate from the perspective of a skeptical, time-pressed SMB owner who receives cold email frequently. Judges did not know about the owner panel, the version labels (draft/revised/copywriter), or each other's responses.

### Owners (3 judges)

Actual pest control owner-operators, each with differentiated profiles:

- **Mike Deluca** — 22-year owner-operator, Ohio, 12 trucks, GorillaDesk user, tech-skeptical
- **Sandra Kowalski** — 6-year owner-operator, Texas, 8 trucks (growth-mode operator)
- **Ray Tanner** — 14-year owner-operator, Georgia, 7 trucks

Each was given the owner ballot — independently scrambled from the gatekeeper ballot — and asked to rank each group as if the emails had arrived in their actual inbox. Owners did not know about the gatekeeper panel, the version labels, or each other.

**Blind guarantee:** Neither panel knew about the experiment structure, the other panel, the version labels, or each other. Each received a ballot with UUID-identified emails only — no author or version metadata.

## Ballot Construction

The `build_ballots.py` script produced four output files from hardcoded email data:

1. **ballot-data.json** — raw structured data (not blind; version labels intact) for reference
2. **gatekeeper-ballot.json** — scrambled ballot for the gatekeeper panel
3. **owner-ballot.json** — independently scrambled ballot for the owner panel
4. **ballot-mapping.json** — unscrambling key mapping every UUID back to `{group_num, version}`

**UUID scheme:**
- Gatekeeper ballot IDs: `gk-{uuid4}` (e.g., `gk-9b5ca2c2-cea3-44a3-8fd7-0d0fcdaa2df7`)
- Owner ballot IDs: `ow-{uuid4}` (e.g., `ow-47962807-35bf-4c70-bbe5-9c0cb2d5327d`)
- The prefix makes it immediately clear which ballot an ID belongs to without consulting the mapping file

**Scramble logic:** For each group, the three versions were independently shuffled using Python's `random.shuffle()` with `random.seed()` (true random, no fixed seed). Gatekeeper and owner ballots received separate shuffles — even within the same group, the three emails appear in a different order on each ballot. This prevents cross-contamination if a judge somehow saw both ballots.

**Mapping file structure:** A flat JSON object keyed by UUID. Each value is `{"group_num": N, "version": "draft|revised|copywriter"}`. Used post-scoring to decode which version received which rank.

## Scoring System

Ranked-choice scoring within each group:
- 1st place = 3 points
- 2nd place = 2 points
- 3rd place = 1 point

Scores were aggregated within each panel (gatekeeper total = sum of all 5 judges × 10 groups = max 150 points per version; owner total = sum of all 3 judges × 10 groups = max 90 points). A combined 8-judge score was also computed for overall version ranking.

Tie-breaking: when two versions tied on weighted score within a group, 1st-place vote count was used as tiebreaker.

## Gatekeeper Accuracy Metric

For each of the 10 groups, the majority gatekeeper pick (version with highest gatekeeper weighted score) was compared against the majority owner pick. Agreement = 1, disagreement = 0.

**Result: 60% accuracy (6/10 groups).**

**Systematic bias pattern observed:** Gatekeepers consistently over-indexed on research signals and analytical depth relative to what owners actually responded to. In groups 8 and 10, gatekeepers chose versions that demonstrated more business knowledge; owners in both cases chose shorter, less analytical formats. Gatekeepers also underweighted emotional recognition — the instant "that's my life" reaction that drove owner behavior in groups 7 and 8. A secondary bias: gatekeepers were more tolerant of competitive claims and slightly underestimated how much growth-mode operators respond to market-position arguments (group 6).

## Files Generated

| File | Purpose |
|---|---|
| `build_ballots.py` | Ballot construction script — generates all 4 JSON artifacts |
| `ballot-data.json` | Raw email data with version labels (not blind) |
| `gatekeeper-ballot.json` | Scrambled ballot delivered to gatekeeper panel |
| `owner-ballot.json` | Independently scrambled ballot delivered to owner panel |
| `ballot-mapping.json` | UUID → {group_num, version} decoding key |
| `gatekeeper-1-results.json` through `gatekeeper-5-results.json` | Individual gatekeeper rankings with rationale |
| `gatekeeper-aggregate.json` | Aggregated gatekeeper scores per version per group |
| `gatekeeper-aggregate-summary.md` | Narrative summary of gatekeeper results, patterns, themes |
| `owner-1-results.json` through `owner-3-results.json` | Individual owner rankings with rationale |
| `owner-1-elaboration.md` through `owner-3-elaboration.md` | Extended owner commentary per group |
| `owner-aggregate.json` | Aggregated owner scores per version per group |
| `owner-aggregate-summary.md` | Narrative summary of owner results |
| `final-analysis.md` | Combined analysis: gatekeeper accuracy, version performance, consensus wins, divergence breakdown |

## Replication Notes

**Adapting persona specs for a different buyer profile:** Replace the three owner personas with profiles representative of the target niche. Key differentiators to specify: years in business, company size (employees or trucks), software stack (signals tech sophistication), and operator mode (growth vs. stability). The more differentiated the three personas, the more useful the disagreements between them are.

**Minimum judge count:** 5 gatekeepers is adequate for detecting systematic bias; 3 owners is the minimum viable panel. With only 3 owners, a single outlier can swing a group result — 5 owners would be more reliable. Consider 3 owners + 2 "challenger" owners with atypical profiles (very small, very large, different geography) to stress-test findings.

**Positional mismatch:** If the three versions don't cover the same angle within a group, the comparison becomes angle vs. angle rather than execution vs. execution. Audit for this before running the experiment: each group should share a core hook. Mismatched groups can still be scored but results are less actionable — note them explicitly in the analysis.

**Extending to more than 3 versions:** The ranked-choice system extends naturally. With 4 versions, scoring becomes 1st=4pts, 2nd=3pts, 3rd=2pts, 4th=1pt. With more than 5 versions per group, judge fatigue becomes a real concern — consider splitting into elimination rounds (top 3 per preliminary group, then finals) rather than asking for full rankings across 6+ options.

**Script reuse:** `build_ballots.py` is self-contained. Swap in new email data in the `EMAIL_DATA` dict, adjust group count, and rerun. The UUID prefix convention (`gk-` / `ow-`) and independent shuffle logic should be preserved for all future runs.

## Limitations

**Positional grouping issue:** Groups 3 and 6 had cross-angle comparisons. In group 3, the draft and revised versions covered weekend call capture (wasp nest Saturday scenario); the copywriter version opened with the 47% after-hours stat, a different hook. In group 6, draft and revised covered competitive first-mover framing; the copywriter version pivoted to 1-star review / communication framing. Judges in these groups were comparing both angle and execution simultaneously. The group 3 revised version winning unanimously may partly reflect angle advantage (concrete scenario) rather than pure execution quality. Group 6 results should be read with the same caveat.

**Panel size:** 3 owners is the minimum viable panel. Results are directionally useful but a single strong-preference outlier (as seen in groups 4 and 10 with Ray Tanner) can materially shift aggregate scores. Treat per-group owner results as signals, not verdicts.

**Judge selection bias:** Gatekeepers were business consultants/advisors — likely more analytically oriented than average cold email recipients. This may explain their systematic preference for research-signaling emails. Replicating with a gatekeeper panel of sales practitioners rather than business advisors could produce different accuracy numbers.

**Single campaign context:** All emails address the same pain (after-hours lead loss) in the same niche (pest control). The gatekeeper accuracy finding (60%) and the systematic biases observed may not generalize to campaigns with different pain categories, different buyer sophistication levels, or different email structures.
