One section. Ten audiences. One generic answer.
The upsell page on whyinstitute.com (WP id 16871) serves 10 variants of its pain section based on the visitor's diagnosed WHY archetype, swapped via URL parameter. Same H2, same layout, different copy per WHY. In theory, the sharpest personalization on the site.
In practice, the copy was AI-shaped default. Every variant repeated some version of "your resume isn't the problem, your interviews aren't the problem." The line directly contradicted the product underneath it, the Career Clarity Pack, which IS a resume tool and an interview tool. So the page told the reader her resume wasn't broken, then tried to sell her a resume tool.
The Step 8 to Step 9 conversion (upsell view to checkout started) was sitting at 14% in W21 against a 90-day baseline of 34.8%. Six straight weeks under baseline. Mobile Safari was the weakest cohort at 11.7%. The pain section is the second section after the hero, the place where "is this for me" crystallizes. It was the obvious lever, and it was the weakest copy on the page.
Three framework moves, ten distinct rewrites, one surgical deploy.
I rewrote all 10 variants against three framework rules:
One. Kill the "your resume isn't the problem" frame everywhere. Replace it with "fixing the right surfaces with the wrong inputs." That single reframe stops the page from contradicting the product and lets the bonuses (resume tool, interview tool) read as relief instead of confusion.
Two. Every Real Problem card is now diagnostic-specific per WHY. No two variants share a bullet. Mastery is filtered by people who can't read depth. Better Way is A/B-testing the wrong variable. Make Sense has the diagnostic blindness of being inside her own problem. Contribute is pouring into a format that erases her. Each variant names the structural failure mode for that WHY in this specific search.
Three. Every Truth bar bridges to the Career Clarity Pack with an archetype-shaped verb, not a generic "tools to use it." Simplify ends on "Done." Mastery ends on "in front of the ones who already know what they're looking at." Each truth bar is the same product reveal in the language that WHY's reader uses.
Then I shipped it surgically. I wrote a Python patcher (wp/patch_pain_section_v2.py) that does per-variant block replacement against the live page HTML, preserving the outer data-archetype wrapper attributes including data-active="1" on default. The patch is idempotent. Re-running it is a no-op. Before any write, the script snapshots the current HTML to wp/backups/why-next-steps-16871-20260520-140744.html so rollback is one file copy away.
Voice check applied per the brand's voice-and-language.md: invites not accuses, sixth-grade English, no LinkedIn-coach phrasing, no Barnum statements, no banned vocabulary.
The page wasn't underperforming because the copy was bad. It was underperforming because the same copy was trying to do 10 different jobs. The fix is to stop trying.
Shipped May 20. 14-day measurement window running.
The rewrite went live May 20 via the surgical patcher. Backup snapshot saved pre-deploy. CHANGELOG entry written. The measurement target is a sustained 18 to 22% Step 8 to 9 over a rolling 14-day window, recovering 30 to 60% of the gap to the 90-day baseline. The falsification line is set: if 14-day post-deploy is at or below 15%, copy is not the lever and the next test moves to the technical and sticky-CTA hypotheses already queued in rec-002. Measurement window in progress; result tracked in the W22 audit.
- 10 variants rewritten with diagnostic-specific Real Problem cards, no shared bullets
- "Resume isn't the problem" contradiction killed across all 10, replaced with a frame that lets the product read as relief
- Each Truth bar bridges to the Career Clarity Pack via an archetype-shaped verb, not generic CTA copy
- Deployed via surgical Python patcher, idempotent, with pre-deploy backup snapshot
- 0 collisions on re-run, 0 wrapper attributes lost, default variant
data-active="1"preserved - Falsifiable hypothesis defined before deploy with a clear pivot path if copy isn't the lever
- Measurement window running through June 3; result lands in W22 audit
Real personalization is ten different diagnoses pretending to share an h2.
The page was already doing the hard infrastructural work of serving per-archetype copy. The copy itself was just borrowed from the default. That's the most common form of failed personalization I see: the plumbing is right, the payload is generic. The lift here came from treating each variant as its own writing assignment, with its own diagnostic logic, and then deploying with the kind of surgical idempotency that lets you ship 10 distinct changes in one patch without breaking the wrapper logic underneath.
If you can't say in one sentence what THIS variant gets specifically wrong, you don't have personalization. You have a variable that fires the same string ten different ways.