Skip to main content
Focus Groups let you run simulated audience research at scale. Define your questions, choose your personas, set a sample size, and get quantitative scores plus qualitative reasoning from a synthetic panel — in minutes instead of weeks. A single Focus Group can simulate N=25 to 200+ respondents across multiple audience segments, combining question types like NPS, Likert scales, open-ended responses, and ranking exercises into one cohesive study.
Focus Groups are asynchronous. You create a study, then poll for results. Most studies complete in 30–120 seconds depending on sample size and question count.

Key Features

12 Question Types

NPS, Likert, multiple choice, open-ended, rating, ranking, semantic differential, and more

Persona-Based Panels

Mix multiple personas for diverse, segment-specific responses

Scalable Sample Sizes

From 10 to 200+ respondents per study

Aggregate + Individual

Get both statistical summaries and individual respondent reasoning

Focus Group Lifecycle

Creating a Focus Group

1

Choose your personas

Select 1–10 persona IDs that represent your target audience segments. The more diverse your panel, the richer the cross-segment analysis.
2

Define your questions

Write 1–20 questions using the supported question types. Mix quantitative (NPS, Likert) with qualitative (open-ended) for well-rounded insights.
3

Set sample size and submit

Choose a sample size (10–200+). Larger samples give more statistical confidence but cost more credits.
4

Poll for results

The study runs asynchronously. Poll the GET endpoint until status is "COMPLETED".

Full Creation Example

import requests

response = requests.post(
    "https://app.mavera.io/api/v1/focus-groups",
    headers={"Authorization": "Bearer mvra_live_your_key_here"},
    json={
        "name": "Product Launch Feedback",
        "sample_size": 50,
        "persona_ids": [
            "gen_z_consumer",
            "millennial_professional",
            "gen_x_parent"
        ],
        "questions": [
            {
                "question": "How likely are you to recommend this product to a friend?",
                "type": "NPS",
                "order": 1
            },
            {
                "question": "The product design feels modern and appealing.",
                "type": "LIKERT",
                "order": 2
            },
            {
                "question": "Which features interest you most?",
                "type": "MULTIPLE_CHOICE",
                "options": ["Speed", "Design", "Price", "Sustainability", "Brand reputation"],
                "order": 3
            },
            {
                "question": "Rate the overall value for money.",
                "type": "RATING",
                "order": 4
            },
            {
                "question": "Rank these factors by importance when choosing this product.",
                "type": "RANKING",
                "options": ["Price", "Quality", "Brand", "Reviews", "Sustainability"],
                "order": 5
            },
            {
                "question": "Would you switch from your current product to this one?",
                "type": "YES_NO",
                "order": 6
            },
            {
                "question": "How innovative vs traditional does this product feel?",
                "type": "SEMANTIC_DIFFERENTIAL",
                "left_label": "Traditional",
                "right_label": "Innovative",
                "order": 7
            },
            {
                "question": "What would make you more likely to purchase?",
                "type": "OPEN_ENDED",
                "order": 8
            }
        ],
        "workspace_id": "your_workspace_id"
    }
)

focus_group = response.json()
print(f"Focus Group ID: {focus_group['id']}")
print(f"Status: {focus_group['status']}")

Question Types

TypeDescriptionResponse FormatBest For
NPSNet Promoter Score (0–10)Numeric score + reasoningMeasuring recommendation likelihood
LIKERT5-point agreement scaleScale value (1–5) + explanationGauging attitudes and opinions
MULTIPLE_CHOICESelect from defined optionsSelected option(s) + reasoningFeature preference, forced choices
OPEN_ENDEDFree-form responseDetailed textExploratory insights, “why” questions
RATINGStar rating (1–5)Rating + explanationQuick satisfaction scoring
YES_NOBinary choiceYes/No + reasoningGo/no-go decisions, adoption intent
RANKINGOrder options by preferenceRanked list + reasoningPriority ordering, trade-off analysis
SLIDERNumeric scale (custom range)Value + explanationFine-grained measurement
MATRIXMultiple items on same scaleMatrix of responsesComparing multiple attributes
SEMANTIC_DIFFERENTIALBetween two oppositesPosition (1–7) + explanationBrand perception, positioning
CONJOINTTrade-off analysisPreference dataPricing and feature optimization
MAXDIFFBest/worst selectionSelection + reasoningFinding most/least important attributes
Recommended mix: Start with 1–2 quantitative questions (NPS, Likert, Rating) to get scoreable data, then add 1–2 qualitative questions (Open-ended) for depth. Finish with a Ranking or Semantic Differential for nuanced insight. Keep total questions under 10 for best quality.

Polling for Results

Focus Groups run asynchronously. Poll the status endpoint until the study completes.
import time
import requests

focus_group_id = "fg_abc123"
headers = {"Authorization": "Bearer mvra_live_your_key_here"}

while True:
    response = requests.get(
        f"https://app.mavera.io/api/v1/focus-groups/{focus_group_id}",
        headers=headers
    )
    result = response.json()

    if result["status"] == "COMPLETED":
        print("Focus group complete!")
        break
    elif result["status"] == "FAILED":
        print(f"Focus group failed: {result.get('error')}")
        break
    else:
        print(f"Status: {result['status']}... waiting")
        time.sleep(5)
Status values:
StatusMeaning
PENDINGStudy created, not yet started
PROCESSINGResponses being generated
COMPLETEDAll results available
FAILEDAn error occurred

Interpreting Results

Aggregate Scores

Each question returns an aggregate summary alongside individual responses.
result = response.json()

for question_result in result["results"]:
    print(f"\nQuestion: {question_result['question']}")
    print(f"Type: {question_result['type']}")
    print(f"Summary: {question_result['summary']}")

    if question_result["type"] == "NPS":
        print(f"  NPS Score: {question_result['nps_score']}")
        print(f"  Promoters: {question_result['promoters']}%")
        print(f"  Passives: {question_result['passives']}%")
        print(f"  Detractors: {question_result['detractors']}%")

    elif question_result["type"] == "LIKERT":
        print(f"  Mean: {question_result['mean']}")
        print(f"  Median: {question_result['median']}")
        print(f"  Std Dev: {question_result['std_dev']}")

    elif question_result["type"] == "MULTIPLE_CHOICE":
        for option, count in question_result["distribution"].items():
            print(f"  {option}: {count} votes")

    elif question_result["type"] == "RANKING":
        for rank, item in enumerate(question_result["average_ranking"], 1):
            print(f"  #{rank}: {item}")

Individual Responses

Drill into individual respondent data for qualitative depth.
for question_result in result["results"]:
    print(f"\nQuestion: {question_result['question']}")
    for resp in question_result["responses"][:5]:
        print(f"\n  Persona: {resp['persona_name']}")
        if "score" in resp:
            print(f"  Score: {resp['score']}")
        print(f"  Reasoning: {resp['reasoning'][:200]}...")

Cross-Segment Analysis

Compare how different persona segments responded to the same question.
nps_results = result["results"][0]

segment_scores = {}
for resp in nps_results["responses"]:
    segment = resp["persona_name"]
    if segment not in segment_scores:
        segment_scores[segment] = []
    segment_scores[segment].append(resp["score"])

for segment, scores in segment_scores.items():
    avg = sum(scores) / len(scores)
    print(f"{segment}: avg NPS = {avg:.1f}")

Response Format

{
  "id": "fg_abc123",
  "name": "Product Launch Feedback",
  "status": "COMPLETED",
  "sample_size": 50,
  "personas": [
    { "id": "gen_z_consumer", "name": "Gen Z Consumer" },
    { "id": "millennial_professional", "name": "Millennial Professional" },
    { "id": "gen_x_parent", "name": "Gen X Parent" }
  ],
  "questions": [
    { "id": "q1", "question": "How likely are you to recommend this product?", "type": "NPS", "order": 1 }
  ],
  "results": [
    {
      "question_id": "q1",
      "question": "How likely are you to recommend this product?",
      "type": "NPS",
      "nps_score": 42,
      "promoters": 55,
      "passives": 32,
      "detractors": 13,
      "summary": "Strong positive sentiment overall. Gen Z respondents showed the highest likelihood to recommend, driven by the product's sustainability messaging...",
      "responses": [
        {
          "persona_id": "gen_z_consumer",
          "persona_name": "Gen Z Consumer",
          "score": 9,
          "reasoning": "I'd definitely recommend this — the sustainability angle is genuine, not performative, and the design feels like it was made for my generation."
        },
        {
          "persona_id": "gen_x_parent",
          "persona_name": "Gen X Parent",
          "score": 7,
          "reasoning": "Good product, fair price. I'd mention it if someone asked but probably wouldn't go out of my way to recommend it."
        }
      ]
    }
  ],
  "usage": {
    "credits_used": 150
  }
}

When to Use Focus Groups vs Chat vs Mave

ScenarioBest ToolWhy
”How would Gen Z react to this tagline?”ChatSingle persona, single question — fast and cheap
”Compare reactions across 4 segments with NPS scores”Focus GroupsMultiple personas, quantitative data, statistical aggregation
”What’s the market size for EV charging in Europe?”MaveResearch question needing web data and citations
”Test 3 ad concepts with 50 respondents each”Focus GroupsStructured comparison at scale
”Get a quick gut-check from a millennial”ChatConversational, low-cost, real-time
”Deep competitive analysis with sources”MaveMulti-source research with validation

Credits and Pricing

Credit cost depends on sample size, question count, and question complexity.
Sample Size3 Questions5 Questions10 Questions
10–2530–50 credits50–75 credits75–120 credits
26–5050–85 credits75–125 credits125–200 credits
51–10085–140 credits125–200 credits200–350 credits
100+140–250 credits200–350 credits350–500+ credits
Open-ended and conjoint questions cost more per respondent than NPS or yes/no questions because they require more generation.

Listing Focus Groups

Retrieve all focus groups in your workspace.
response = requests.get(
    "https://app.mavera.io/api/v1/focus-groups",
    headers={"Authorization": "Bearer mvra_live_your_key_here"}
)

for fg in response.json()["data"]:
    print(f"{fg['name']}{fg['status']}{fg['sample_size']} respondents")

Best Practices

Combine NPS or Likert questions (numbers you can chart) with open-ended questions (explanations you can quote). This gives you both statistical confidence and narrative depth.
Include personas that represent your actual target audience segments. A panel of Gen Z + Millennial + Gen X gives generational breadth. Adding a Budget Shopper and a Luxury Consumer gives psychographic breadth.
5–8 well-crafted questions yield better results than 15+ rushed ones. Each additional question adds cost and can cause response fatigue in the model.
Focus Groups are ideal for validating messaging, product concepts, pricing strategies, and feature prioritization before committing real-world budget.
Create two focus groups with the same personas but different stimuli (e.g., two taglines, two product descriptions) to see which resonates more.
After a Focus Group reveals a surprising result, follow up with a Chat conversation using the same persona to explore the “why” in depth.
Focus Group results are simulated perspectives, not real consumer data. They are best used for directional insights, concept screening, and hypothesis generation. Validate high-stakes decisions with real audience research.

Next Steps

Run First Focus Group

Step-by-step tutorial with complete scripts

Quickstart: Focus Groups

Get started in 15 minutes

Personas

Choose and create personas for your panels

API Reference

Full API specification