Luka Mrkić
Head of BD
Insights, strategies, and real-world playbooks on AI-powered marketing.
JUN 1, 2026
If you are evaluating who should build this for your team, this guide gives you both the technical blueprint and the standards to evaluate the work.
Most positioning workshops produce copy by argument. The team gets in a room, debates three candidate headlines, picks one by consensus or by the loudest voice, and ships it. The copy then sits on a homepage and gets graded by traffic that arrives weeks later. By then the team has moved on and nobody traces the result back to the headline.
The Claude workflow inverts that. It pulls in the public evidence (homepages, pricing pages, public reviews) and the private evidence (sales transcripts, win and loss notes, your own current copy) and runs them through a structured prompt that tags claims, clusters them, surfaces overlaps and gaps, and only then drafts copy. Every angle that comes out of the workflow is tied to a specific gap with a specific source line behind it. The team is no longer arguing about taste; they are choosing between angles that each have a paper trail.
The output is not a final homepage. It is three or four positioning angles, each with a draft headline, a draft subhead, a proof line, and the source quotes that support it. The team picks the one to test, the page test happens, and the next round of the workflow uses the test data as another input.

Five steps. Collect the inputs. Structure them with Claude. Contrast to find the gaps. Draft positioning angles. Score and test. The model does the heavy lifting in steps two and four; the human team owns steps one, three, and five. The split matters because positioning copy that the team did not co-author rarely survives the first sales call.

Six categories. Aim for five competitors in the first pass. More than that and the model loses signal in the tagging step; fewer and the contrast step has nothing to push against.
inputs/
competitors/
acme/homepage.md
acme/pricing.md
acme/reviews.md
beta/...
internal/
transcripts/
2026-05-call-01.md
...
win-loss/
2026-q2.csv
own/
homepage.md
pricing.md
The first model pass turns the raw inputs into a tagged claim table. For every source file, Claude reads the text and emits a list of claims, each with a category, a strength score, and the source citation. Categories are tight: outcome promise, audience, mechanism, proof, price anchor, integration, deprecation jab, and other. Strength is the model’s read on how loud the claim is on the page, scored one to five.
# claim_tagger.py
import json, os, anthropic
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
SYSTEM = '''You extract positioning claims from a marketing page or transcript.
Categories: outcome, audience, mechanism, proof, price_anchor, integration, jab, other.
For each distinct claim return JSON:
- text: the exact claim line, max 25 words
- category: one of the categories above
- strength: integer 1 to 5 (1=buried, 5=hero line)
- source_quote: the line from the source that the claim came from
Return a JSON array of claim objects. Skip filler, legal, and nav copy.'''
def tag(source_id: str, body: str) -> list[dict]:
msg = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2000,
system=SYSTEM,
messages=[{"role": "user",
"content": f"SOURCE: {source_id}\n\n{body}"}],
)
text = msg.content[0].text
arr = json.loads(text[text.find('['):text.rfind(']')+1])
for c in arr:
c["source"] = source_id
return arr
Run the tagger over every source file in the inputs folder. The result is a single flat list of tagged claims, typically 300 to 800 rows for a five-competitor pass. Save it as a CSV; it is the dataset every later step reads from.
This is where the human team earns its keep. With the claim table open, you are looking for three things. Overlaps: claims that three or more competitors make at hero strength. These are the table stakes; copying them gives you nothing. Saturations: outcome promises that are present on every page in the set, which means the buyer hears them as background noise. Gaps: categories where the strong claims are sparse, or where your reviews and transcripts say something the competitors do not.
You can ask Claude for a first pass on overlaps and gaps in one call. Send it the claim table grouped by competitor and ask for an overlap report. Then read the report by hand. The model finds the obvious overlaps fast; the team finds the gaps that actually matter because they remember the calls.
# overlap_report prompt fragment
system: |
You read a claim table grouped by vendor.
Return JSON with two arrays:
overlaps: claims made at strength >= 4 by 3+ vendors
gaps: claim categories where no vendor has any
claim at strength >= 3, or where our reviews
and transcripts contain a strong claim that
no competitor matches.
For every gap, include the source_quote that proves
the gap is real.

Three angles per round is the right number. Two leaves the team picking between A and B and they always pick the safer one. Four spreads the team’s attention. Three forces a real choice.
The drafting prompt is where weak vs strong matters most. A weak prompt asks Claude to write a headline. A strong prompt walks the model through the workflow it just read: tag the inputs, list the overlaps, list the gaps, pick the three gaps with the best proof, draft one angle per gap, and tie each angle to the source lines that justify it. The output is structured JSON the team can score directly.
# positioning_draft.py
SYSTEM = '''You draft three positioning angles for a B2B SaaS company.
Inputs you receive:
- a claim table grouped by competitor
- our review snippets and transcripts
- our current homepage copy
Workflow:
1. Identify 3 gaps where competitors are weak and our evidence is strong.
2. For each gap, draft one positioning angle as JSON with:
- angle_name: 2 to 4 words
- headline: max 12 words, names a specific outcome or mechanism
- subhead: max 25 words, names the audience and the proof
- proof_line: 1 sentence, names a customer, a number, or a workflow
- source_quotes: 3 to 5 lines from the inputs supporting the angle
- risk: 1 sentence on what could make this angle wrong
Return strict JSON: an array of 3 angle objects.'''
If you want this set up cleanly inside your stack with logging, retries, and a feedback loop into a CRM, that is the kind of work we ship at Espressio.

The angles come out of step four with proof attached. Before any of them go near a homepage, score them against the six checks in the table above. Specificity, buyer job fit, named proof, differentiation, sales read, and testability. Any angle that fails two or more checks goes back into a redraft round with the model. Any angle that passes all six is a candidate for a page test.
The page test itself is the only true ranking step. A workshop vote is a guess; a homepage A B with real traffic is a result. Plan the test before the meeting that picks the angle, otherwise the team will ship the favored angle without a counterfactual and you will be back here in six months.
Three signals tell you the workflow is paying back. First, the homepage test you ran against the current copy lifts a top of funnel metric (signups, demo requests, trial starts) by an amount you can defend statistically. Second, the sales team uses the new headline language in cold calls and on first calls without being asked to. Third, the next round of the workflow takes less time because the inputs folder is already up to date and the tagger prompt is already tuned. If any of the three drift, the angle is wrong or the test was underpowered; redraft before you replatform.
Sonnet handles both the tagging step and the drafting step well at a reasonable price. Opus produces marginally tighter drafts on the final step and can be worth it on the angle generation pass if the team is going to ship to a page. Haiku is too inconsistent on the JSON contract for the tagger and should be avoided for this workflow.
A workshop produces angles from the team’s intuition. This workflow produces angles from the evidence in front of the team. The two combine well. Run the workflow first, then hold a workshop to pick which angle to test. The workshop now argues from the proof lines.
No. The inputs are small enough that they fit inside a single Claude context window. For five competitors and a dozen transcripts you are looking at well under a million tokens. Keep the inputs as flat files until the dataset gets large enough that retrieval matters; for almost every team it never does.
Quarterly is the default. Run a fresh pass when your top three competitors ship a major homepage refresh, when your own pricing changes, when you raise a round, or when the win and loss notes show a new objection three deals in a row.
It replaces the input gathering and the first draft, which is where most of the consultant’s billable hours go. It leaves the judgment call on which angle to test and the conversations with the sales team to the humans who own the outcome. The right framing is that the workflow is the consultant’s research assistant.
If you want positioning work like this set up cleanly inside your marketing operations, let’s talk.