Solutions
Experience measurement
Track sentiment and KPIs with AI-driven gap analysis
Strategic & foundational discovery
Uncover market whitespace with AI-led foundational studies
Journey & behavioral research
Connect user actions to motivations across the lifecycle
Market & consumer Insights
Understanding markets, audiences, & opportunity
Concept & prototype testing
Test designs and prototypes with rapid feedback
Agents
Design
Structure rigorous studies
Field
Run adaptive studies at scale
Analyze
Get statistical analysis you can trust
Synthesize
Turn results into research reports
Deploy
Email
Reach external audiences with native deliverability
Panels
Recruit from 300K+ verified participants
Web apps and websites
Embed studies in web experiences
Mobile apps
Run studies in iOS and Android apps
Customers
Community
Events
Join curated gatherings shaping the future of research
Blog
Insights on integrating AI into research craft
Book icon
Guides
Ultimate playbooks for enterprise survey research
Pricing
Sign in
Book a demo
Sign in
Book a demo
Guide

TURF Analysis with AI: Picking the Features That Reach the Most Users

October 22, 2026

By James Villacci

Example H2
Example H3
Example H4
Example H5
Example H6

Introduction

To run a TURF analysis with Claude, give it a pick-any survey export and a prompt that cleans the file, sets the base correctly, and searches every possible set of items instead of ranking them by popularity. Reach is the share of respondents who picked at least one item in the set. On our synthetic test file, the best three of eight features reached 73.7 percent, 13.1 points more than the three most popular.

Last updated October 2026

What We Tested, and When

Teams usually ask TURF a narrow question: if we can only ship three things, which three reach the most people? Popularity rankings can’t answer that, because the most popular items often appeal to the same respondents. A chat assistant picks its own cleaning rules unless you state yours.

We ran every Claude test on this page in claude.ai on October 15, 2026, on a Claude Team plan, with the model picker showing Opus 5.5 at its default Medium setting. The data is a synthetic export shaped like a Sprig survey export. Results on other models and dates may differ.

Claude, working in James Villacci’s Chrome browser, ran the tests and saved every transcript. We matched the uploaded file to the original by size, not by checksum. Two attempts to send a prompt didn’t submit, created no chat, and were resent unchanged.

What Is TURF Analysis, and How Does It Work?

TURF stands for total unduplicated reach and frequency. It works on a pick-any question, where each respondent selects every item they’d use, and it finds the portfolio of a fixed size that reaches the most distinct respondents.

Reach counts a respondent once if they picked at least one item in the portfolio. Frequency counts every selection of the portfolio’s items. Q’s documentation describes reach as the weighted share of respondents with a positive response to at least one alternative, and frequency as the weighted count of positive responses, which breaks ties between portfolios of equal reach (Q help center, retrieved October 15, 2026).

Search is the hard part. An exhaustive search checks every possible portfolio. Sawtooth Software caps its exhaustive search at 5,000,000 portfolios per run and switches to a stepwise algorithm above that, which is why choosing five items from 50 searches exhaustively and choosing six from 50 doesn’t (Sawtooth MaxDiff Analyzer manual, retrieved October 15, 2026). Eight items choosing three is only 56 portfolios, so Claude can check them all.

When Should You Use TURF Instead of MaxDiff?

Use TURF when your question is which set of options reaches the most people, and use MaxDiff when it is how strongly respondents prefer each item. TURF needs a multi-select question. TURF treats each respondent’s picks as a yes or no and ignores how strongly they prefer an item.

MaxDiff answers a different question: how strongly do respondents prefer each item relative to the others? It produces a ranking, and a ranking can’t tell you whether your top three items appeal to the same people. Sprig’s MaxDiff guide covers the design, and the MaxDiff analysis with Claude guide covers the analysis.

Sprig doesn’t publish a TURF tool. MaxDiff is available on Sprig’s Enterprise plan, and the analysis in this guide runs in Claude on an exported file.

TURF also fits message sets, concepts and product bundles. A team choosing which three claims to carry in a message test is asking the same question.

Reach Only or Reach and Frequency?

This guide’s headline number is reach only. A respondent counts if the portfolio gives them at least one item they’d use, which is the right question when the goal is to avoid leaving people with nothing.

Frequency adds depth. Q documents a depth variant that requires a minimum number of selections per respondent before counting them as reached, up to the portfolio size (Q help center, retrieved October 15, 2026).

The two definitions can pick different portfolios, and frequency also settles ties. In our answer-key script, which we didn’t run in Claude, requiring two or more selections changes the best three features from Gantt view, Time tracking and Custom fields to Gantt view, Workload view and Recurring tasks, and reach drops to 30.4 percent.

What Data Does This Example Use?

We built a synthetic roadmap survey for a fictional project-management app called Taskboard. No real respondents are involved. The file has 501 rows, fielded October 5 to 11, 2026, with Q1 asking which of eight features a respondent would use at least once a month and Q2 asking which one to build first.

The file follows the column names of Sprig’s Response-text export, with plan and team size as Attributes_1 and Attributes_2. Sprig’s export documentation doesn’t say how a multi-select answer or a skipped question appears there, so copy your own file’s separator and skip marker into the prompt. Ours separates items with a comma and a space and writes SKIPPED for skipped answers.

Eight traps sit in the file, each with a known answer from a script:

  1. 25 bot rows with captcha scores below 0.30, placed mid-file
  2. Six visitors who submitted twice
  3. 18 partial responses with no completion time
  4. 15 skipped answers, and 45 respondents who picked "None of these"
  5. Workload view, where 95.3 percent of selectors also picked Gantt view
  6. Q2, a single-choice question that isn’t pick-any
  7. A size-4 near-tie, 361 respondents against 359
  8. Plan-by-team-size cells, three empty and five thin

After cleaning, 452 responses remain and the base is 437, because 15 skipped Q1. The reach ceiling is 89.7 percent, since 45 respondents wanted no item. We didn’t revise the dataset after any run, and we ran no pilots.

Getting the Data Out of Sprig

The Sprig MCP server lets Claude query responses without an export. We didn’t test TURF through it. Sprig documents role-scoped access, but its materials describe the per-call response cap inconsistently, so check the cap before relying on it for a large study.

What Does a Plain Prompt Get Wrong?

We wrote the plain prompt first, froze it at 05:06 UTC on October 15, and didn’t edit it:

I've attached our Q4 roadmap survey export (taskboard_roadmap_q4_2026.csv).
Question 1 asked which of eight features people would use at least once a month.
We can only build three next quarter. Run a TURF analysis and tell me which three
features to build and how many of our users that would reach. Flag anything I
should be careful about.

What the Plain Prompt Got Right

We ran it twice, each in a fresh chat. Both runs picked Gantt view, Time tracking and Custom fields, the correct portfolio, after comparing three-feature combinations. Run 1 said it checked all 56.

Both found the 25 bot rows, the six repeat visitors and the Gantt-Workload overlap. Both kept skipped answers out of the base and kept "None of these" in it. Both ran a 1,000-resample bootstrap unprompted, and the portfolio won 957 and 954 times. Both warned that survey respondents aren’t your user base and that stated interest runs higher than real use.

Both also raised small Enterprise samples and Recurring tasks as the second-most popular first pick, and run 1 noted build cost.

What the Plain Prompt Left to Claude

The numbers differ from the key where Claude chose its own rules. Both runs kept the 18 partial responses, so their base was 455 and their reach was 73.4 and 73.6 percent against 73.7. Run 1 kept each repeat visitor’s latest response, and run 2 kept the first.

Our script reproduces both numbers exactly from those choices, so neither is an arithmetic error. But the reach ceiling read 90.1 percent instead of 89.7, and the Gantt-Workload overlap read 87 of 91 and 88 of 89 instead of 82 of 86.

Neither run reported plan-by-team-size cells, so neither found the three empty cells. Neither called the size-4 near-tie, and neither recomputed its numbers a second way. Run 2 gave the bot rows as 238 to 262, two off from the file’s lines 240 to 264.

Both plain runs also made Enterprise claims that disagreed with each other, and we don’t repeat them.

What Prompt Should You Use?

The prompt we tested names your exact column headers, lists the cleaning steps in order, defines the two non-item values, forbids the popularity shortcut, sets a thin-cell threshold that counts zero, adds a bootstrap, asks for an independent recompute and tells Claude to stop rather than guess. It states the rules the analysis has to follow instead of describing the analysis you want.

Copy the prompt below and replace the bracketed defaults with your own. Keep the structure.

What this prompt does: runs a TURF (total unduplicated reach and frequency) analysis on one pick-any survey question and finds the set of items that reaches the most respondents.
What it returns: a cleaning log, the base and the reach ceiling, a single-item reach table, a duplication check, the best portfolios at each size with reach and frequency, each item's contribution to the best portfolio, reach by segment with thin and zero cells flagged, a bootstrap check on the ranking, a side-by-side recompute, and a workbook named [OUTPUT FILE, default: turf_results.xlsx] with one sheet per step.

File: [FILE, default: taskboard_roadmap_q4_2026.csv].

Use code to calculate this, not estimation. Load every row before reporting anything. Do not report any number you did not compute in code.

Columns, matched exactly. Stop and tell me if any is missing:
visitorId, createdAt, completedAt, captchaScore, [PICK-ANY COLUMN, default: Q1_Response], [SEGMENT A, default: Attributes_1], [SEGMENT B, default: Attributes_2].
The pick-any column holds the selected items in one cell, separated by a comma and a space.
Items: [ITEM LIST, default: Gantt view, Workload view, Recurring tasks, Time tracking, Guest access, Custom fields, Approval flows, Offline mobile mode].
Two values are not items. "None of these" means the respondent answered and wanted no item. "SKIPPED" means the question was shown and not answered.
Any other column, including single-choice questions such as Q2_Response, is not an input to reach. Do not use it.

Step 1, clean, in this order, counting each step:
a. Remove rows with captchaScore below [BOT THRESHOLD, default: 0.30].
b. Where a visitorId appears more than once, keep the row with the latest completedAt.
c. Remove rows with a blank completedAt (partials).
Report rows in file, rows removed at each step, and rows remaining.

Step 2, base. "SKIPPED" is excluded from the base and counted. "None of these" stays in the base, is never reached, and is counted. Never treat SKIPPED as "None of these". Report the base, the SKIPPED count, the "None of these" count and share, and the highest reach any portfolio could achieve (100 minus the "None of these" share).

Step 3, definitions. A respondent is reached by a portfolio if they selected at least one item in it. Reach is respondents reached divided by the step 2 base. Frequency is the total number of selections of the portfolio's items across the base.

Step 4, single items. Report each item's reach in respondents and percent, ordered from highest to lowest.

Step 5, duplication. For every ordered pair of items, report the share of the first item's selectors who also selected the second. List every pair at or above [OVERLAP THRESHOLD, default: 80%].

Step 6, search. Evaluate every possible portfolio of each size from 1 to [MAX SIZE, default: 4]. Do not build a portfolio by taking the most popular items, and do not use a stepwise shortcut. For each size, list the top [TOP N, default: 3] portfolios by reach, breaking ties by frequency, with reach in respondents, reach in percent and frequency. The headline portfolio is the best one at size [PORTFOLIO SIZE, default: 3].

Step 7, contribution. For the headline portfolio, report for each item the reach lost, in respondents and points, if that item alone is removed.

Step 8, segments. Report the headline portfolio's reach by SEGMENT A and SEGMENT B, with the base n for each cell, including combinations with no rows. A cell with fewer than [THRESHOLD, default: 30] respondents is below threshold, and zero is under the threshold. List zero cells and thin cells in two separate lists, with counts. Report no percentage for a below-threshold cell.

Step 9, sampling error. Draw [RESAMPLES, default: 1000] bootstrap resamples of the step 2 base with replacement, using seed [SEED, default: 42]. Rerun the step 6 search in each. Report the 95 percent interval for the headline portfolio's reach, and for sizes [PORTFOLIO SIZE] and [MAX SIZE] the share of resamples in which each of the top 3 portfolios is best. Say whether the top two portfolios at each size can be told apart. Do not call any difference significant.

Step 10, recompute. Recompute the base, every single-item reach and the reach of each top 3 portfolio at size [PORTFOLIO SIZE] a second way: plain Python with the csv module and integer bitmasks, no pandas, reusing no variable from steps 1 to 9. Show both results side by side.

If the two methods disagree, or any step could not be done as written, say so and show both values. Do not silently pick one.

Stop rule: if a required column is missing, a value in the pick-any column is neither a listed item nor one of the two markers, or you find a data pattern this prompt does not cover, stop and report it before continuing.

Save each step as its own sheet in OUTPUT FILE, and print the cleaning log, the base and the headline portfolio table in the chat.

Each part answers a gap from the plain runs or a risk we wanted to rule out:

  • Cleaning order: replaces Claude’s choices with yours and counts each step. All three engineered runs removed the partials and kept the latest response, and each cleaning log read 501, 25, 6, 18 and 452.
  • Two non-item values: keeps skipped answers out of the base and "None of these" in it, which gave a base of 437 and a ceiling of 89.7 percent in all three runs.
  • Exhaustive search: forbids the popularity shortcut and the stepwise shortcut. No run took either, plain or engineered, so this clause is insurance we didn’t see tested.
  • Thin cells that count zero: all three runs listed the three empty cells and the five thin plan-by-size cells separately, plus one thin team-size total.
  • Bootstrap with a stated seed: produced an interval and a near-tie call. The reach interval was 69.3 to 77.8 percent in two runs and 69.6 to 77.8 in the third, with the same seed.
  • Second-method recompute: all three runs reported that a csv-and-bitmask script agreed on every value. We didn’t open the scripts.
  • Stop rule: no run triggered it, so we can’t say how Claude handles a missing column.

The bot threshold, the thin-cell threshold and the segment columns are judgment calls that belong to your team.

Adapting the Prompt to Your Own Export

Most teams need four edits, in this order:

  1. Replace the column names with the exact headers in your file
  2. Replace the item list with your own items, spelled exactly as they appear in the pick-any cells
  3. Replace the separator and the SKIPPED marker with the ones your export uses
  4. Set the portfolio size and the segment columns your team reports against

If your export has no captcha column, delete step 1a, or the prompt will stop and report the missing column, a case we didn’t run. For segment cuts beyond the two attribute columns, the cross-tab guide covers thin cells.

What Did the Engineered Prompt Find?

All three engineered runs returned the same headline: build Gantt view, Time tracking and Custom fields, which reaches 322 of 437 respondents, or 73.7 percent. Our answer key agrees to the respondent.

| Portfolio size | Best portfolio | Reach | |:--------------:|:------------------------------------------:|:-----:| | 1 | Gantt view | 38.2% | | 2 | Gantt view + Time tracking | 59.3% | | 3 | Gantt view + Time tracking + Custom fields | 73.7% | | 4 | Adds Offline mobile mode | 82.6% |

Sizes 1 and 2 come from our answer key. Sizes 3 and 4 match all three runs.

Removing one item shows what each contributes: dropping Gantt view loses 146 respondents (33.4 points), Time tracking 88 (20.1 points) and Custom fields 63 (14.4 points). The runner-up at size 3, Gantt view, Time tracking and Approval flows, reaches 69.3 percent.

At size 3 the best portfolio won 97.1 to 97.7 percent of bootstrap resamples, so the top two can be told apart. At size 4 the best won 61.3 to 62.7 percent and the runner-up 37.1 to 38.2, and the gap interval included zero. Treat those two as interchangeable.

Claude reported reach between 72 and 74 percent in every cell with enough respondents, and our script agrees. The engineered runs took about five minutes each, against about two for the plain runs. We didn’t open the workbooks they reported.

What Is the TURF-Specific Mistake?

The TURF-specific mistake is ranking items by popularity and calling the top three a portfolio. Popular items often appeal to the same people, so they duplicate each other’s reach.

In our file the three most popular features, Gantt view, Recurring tasks and Time tracking, reach 60.6 percent. The best three reach 73.7, a gap of 13.1 points. Workload view ranks fourth on its own but adds only four respondents once Gantt view is in, because 82 of its 86 selectors also picked Gantt view. These are our script’s numbers on a synthetic file.

Sawtooth Software’s exhaustive search evaluates every portfolio for this reason, and it switches to a stepwise method only when the search gets too large (Sawtooth MaxDiff Analyzer manual, retrieved October 15, 2026).

This trap didn’t catch Claude. Neither plain run ranked by popularity, and on our file a greedy stepwise pick in our script also matches the best answer at size 3. We don’t claim stepwise search fails in general, only that it can’t be assumed to match without checking.

When Should You Not Run TURF in a Chat Assistant?

Six kinds of TURF work belong in another instrument:

  • Many items: an exhaustive search grows fast. Q skips portfolio sizes that would involve 1,000,000 or more combinations and says its stochastic search is highly likely but not guaranteed to find the optimum. Use dedicated TURF software that documents its search method, like Q or Sawtooth.
  • Reach driven by preference strength: if reach should count only respondents likely to choose an item, run a probability-weighted TURF in dedicated software, or run the MaxDiff recipe first.
  • Weighted samples: if results need to project to a population, use a statistics package with survey-weighting support, like R’s survey package, Stata’s survey commands or SPSS Complex Samples. Our recipe applies none.
  • Cost or price trade-offs: if items have different build costs or prices, TURF’s reach alone misleads. Conjoint analysis handles trade-offs.
  • A tracker that needs to be identical every wave: ask Claude to write the script once, then run the script each wave.
  • Restricted response data: use your survey platform’s own analysis or an approved internal environment, never a personal chat account.

We tested none of these alternatives. They are the better tools for the job in each case, not results from our runs.

Plain Versus Engineered: Which Gets TURF Right?

The plain prompt got the answer, and the engineered prompt got the answer plus numbers that matched our key. Per trap, the two split like this:

| Trap | Answer key | Plain runs | Engineered runs | |:---------------------:|:--------------------------:|:--------------------------------------------:|:----------------:| | Best size-3 portfolio | Gantt, Time, Custom fields | Right, both | Right, 3 of 3 | | Reach | 322 of 437, 73.7% | 73.4% and 73.6%, base 455 | 73.7%, 3 of 3 | | Bots, 25 | Remove | Removed, both | Removed, 3 of 3 | | Repeat visitors, 6 | Keep latest | Latest in 1, first in 2 (rule not requested) | Latest, 3 of 3 | | Partials, 18 | Remove | Kept, both | Removed, 3 of 3 | | Skipped and None | 15 out, 45 in | Right, both | Right, 3 of 3 | | Popularity trap | Don’t rank by popularity | Avoided, both | Avoided, 3 of 3 | | Zero and thin cells | 3 zero, 5 thin | Not requested, not reported | Found, 3 of 3 | | Size-4 near-tie | Can’t be told apart | Not requested, not called | Called, 3 of 3 | | Second-method check | Required by prompt | Not requested, not done | Reported, 3 of 3 | | Q2 as wrong input | Don’t use for reach | Side check only, reach from Q1 | Not used, 3 of 3 |

Both prompts caught the bots, the repeat visitors, the skipped answers and the overlap. The engineered prompt’s edge is rule adherence, segment cells, the near-tie call and the recompute. On this file, neither prompt’s headline would have sent the team down the wrong road.

What the Engineered Prompt Still Won't Catch

Stated interest inflates reach, because "would use monthly" isn’t adoption. Whether a respondent counts as reached is a judgment, and a stricter definition can change the winner, as our depth-2 script showed. The prompt applies no weights. Sprig’s guide to analyzing survey data with AI without losing rigor carries the validation protocols this recipe doesn’t repeat.

What We Saw and Didn't See

Thinking Machines Lab reported in September 2025 that 1,000 completions at temperature zero produced 80 distinct outputs. We saw run-to-run variation: the plain runs disagreed on the retake rule and the reach figure, which is only suggestive because the plain prompt didn’t specify a rule, and the engineered bootstrap tails moved between runs while the headline didn’t.

Liu and colleagues (Transactions of the Association for Computational Linguistics, 2024) found models do worse at using information in the middle of long inputs. Our bots sat mid-file at lines 240 to 264, and every run found them. Every run used code, so this can’t show whether reading without code would miss them.

Frequently Asked Questions

What Is TURF Analysis in Simple Terms?

TURF analysis finds the set of items that reaches the most distinct respondents from a pick-any question. If 437 people each chose the features they’d use, TURF checks every group of three features and reports the group that gives the most people at least one feature they want. It counts each person once, however many items they picked.

Can Claude Run a TURF Analysis?

Claude can run a TURF analysis by writing and running code against every row of an uploaded CSV, as long as code execution is running in your chat. In our five runs on one synthetic file it found the correct best three every time.

Which Claude Model and Plan Did You Test?

We tested in claude.ai on October 15, 2026, on a Claude Team plan, with the model picker showing Opus 5.5 at its default Medium setting. Memory settings were off, and every run used a fresh chat. Other models may differ.

How Do You Know the Plain Version Wasn't Set Up to Fail?

We wrote and froze the plain prompt before the engineered one, and it asks for what a product manager would ask for. It picked the right portfolio in both runs, and this guide reports those successes first.

Can I Upload Customer Survey Data to Claude?

Whether the AI provider can train on your uploads depends on your plan and your privacy setting, so check your plan’s terms in Anthropic’s help center before you upload. Strip personal information and unneeded columns first. We tested only synthetic data.

How Should I Handle None of These in a TURF Analysis?

Keep respondents who picked “None of these” in the base and never count them as reached, and drop respondents who skipped the question. Treating a skip as “None of these” lowers every reach figure. In our file the base is 437 and the highest reach any portfolio could achieve is 89.7 percent.

How Do I Know the Numbers Are Right?

Ask for a second calculation by a different method, as step 10 of the prompt does, and compare. In our engineered runs Claude reported that a csv-and-bitmask recompute agreed, and our own script, built separately, agreed with the engineered runs on the base, the reach and the portfolio.

Will Claude Give the Same Answer Twice?

On the headline, yes in our engineered runs: the same portfolio, base and reach three times. The bootstrap tails differed slightly even with the same stated seed, and the two plain runs disagreed on the retake rule and the reach figure. Name every cleaning rule in the prompt.

How Should You Handle a Messy Export?

Name the mess in the prompt: the exact skip marker, how multi-select answers are separated, which score marks a bot and which duplicate to keep. Our file had bots, repeat visitors and partials, and the engineered prompt handled all three identically in three runs.

How Many Items Can a TURF Analysis Handle?

We tested eight items and portfolios of up to four, which is 162 portfolios in total, and we didn’t test larger problems in Claude. Q’s documentation says it skips portfolio sizes above 1,000,000 combinations, so a long item list belongs in dedicated software.

How Many Respondents Do I Need for TURF?

We found no sourced minimum, so we give none. On our 437-respondent base the best three features had a 95 percent reach interval of about 8 points. Read your own bootstrap interval and the gap between the top two portfolios before you commit a roadmap to one.

Does This Work in ChatGPT?

We tested this workflow only in Claude, so we make no claim about ChatGPT. Any ChatGPT version would need its own logged runs.

Does Sprig Have a TURF Tool?

Sprig doesn’t publish a TURF tool, and its Analyze Agent page doesn’t list TURF among its analyses. You can export a pick-any question from Sprig and run this guide’s prompt in Claude, or use MaxDiff on Enterprise plans when you need preference strength.

Back to top
Solutions
Experience measurementStrategic & foundational discoveryJourney & behavioral researchMarket & consumer insightsConcept & prototype testing
Agents
DesignFieldAnalyzeSynthesize
Deploy
EmailPanelsWeb apps and websitesMobile app
Pricing
Community
EventsBlogGuides
CustomersIntegrationsCompare
Company
About usCareersService agreementPrivacy policyData addendumSystem status
Socials
LinkedInX