> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mavera.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Focus Groups

> AI-powered synthetic focus group research

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.

<Info>
  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.
</Info>

## Key Features

<CardGroup cols={2}>
  <Card title="12 Question Types" icon="list-check">
    NPS, Likert, multiple choice, open-ended, rating, ranking, semantic differential, and more
  </Card>

  <Card title="Persona-Based Panels" icon="users">
    Mix multiple personas for diverse, segment-specific responses
  </Card>

  <Card title="Scalable Sample Sizes" icon="chart-line">
    From 10 to 200+ respondents per study
  </Card>

  <Card title="Aggregate + Individual" icon="magnifying-glass-chart">
    Get both statistical summaries and individual respondent reasoning
  </Card>
</CardGroup>

## Focus Group Lifecycle

```mermaid theme={"dark"}
sequenceDiagram
    participant App as Your Application
    participant API as Mavera API
    participant Engine as Research Engine

    App->>API: POST /focus-groups (questions, personas, sample_size)
    API-->>App: { id, status: "PROCESSING" }

    loop Poll for completion
        App->>API: GET /focus-groups/{id}
        API-->>App: { status: "PROCESSING" }
    end

    API->>Engine: Generate N responses per persona
    Engine->>Engine: Aggregate scores, analyze themes
    Engine-->>API: Results ready

    App->>API: GET /focus-groups/{id}
    API-->>App: { status: "COMPLETED", results: [...] }
```

## Creating a Focus Group

<Steps>
  <Step title="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.
  </Step>

  <Step title="Define your questions">
    Write 1–20 questions using the supported question types. Mix quantitative (NPS, Likert) with qualitative (open-ended) for well-rounded insights.
  </Step>

  <Step title="Set sample size and submit">
    Choose a sample size (10–200+). Larger samples give more statistical confidence but cost more credits.
  </Step>

  <Step title="Poll for results">
    The study runs asynchronously. Poll the GET endpoint until `status` is `"COMPLETED"`.
  </Step>
</Steps>

### Full Creation Example

<CodeGroup>
  ```python Python theme={"dark"}
  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']}")
  ```

  ```javascript JavaScript theme={"dark"}
  const response = await fetch("https://app.mavera.io/api/v1/focus-groups", {
    method: "POST",
    headers: {
      Authorization: "Bearer mvra_live_your_key_here",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      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: "What would make you more likely to purchase?",
          type: "OPEN_ENDED",
          order: 5,
        },
      ],
      workspace_id: "your_workspace_id",
    }),
  });

  const focusGroup = await response.json();
  console.log(`Focus Group ID: ${focusGroup.id}`);
  console.log(`Status: ${focusGroup.status}`);
  ```
</CodeGroup>

## Question Types

| Type                    | Description                  | Response Format                 | Best For                                |
| ----------------------- | ---------------------------- | ------------------------------- | --------------------------------------- |
| `NPS`                   | Net Promoter Score (0–10)    | Numeric score + reasoning       | Measuring recommendation likelihood     |
| `LIKERT`                | 5-point agreement scale      | Scale value (1–5) + explanation | Gauging attitudes and opinions          |
| `MULTIPLE_CHOICE`       | Select from defined options  | Selected option(s) + reasoning  | Feature preference, forced choices      |
| `OPEN_ENDED`            | Free-form response           | Detailed text                   | Exploratory insights, "why" questions   |
| `RATING`                | Star rating (1–5)            | Rating + explanation            | Quick satisfaction scoring              |
| `YES_NO`                | Binary choice                | Yes/No + reasoning              | Go/no-go decisions, adoption intent     |
| `RANKING`               | Order options by preference  | Ranked list + reasoning         | Priority ordering, trade-off analysis   |
| `SLIDER`                | Numeric scale (custom range) | Value + explanation             | Fine-grained measurement                |
| `MATRIX`                | Multiple items on same scale | Matrix of responses             | Comparing multiple attributes           |
| `SEMANTIC_DIFFERENTIAL` | Between two opposites        | Position (1–7) + explanation    | Brand perception, positioning           |
| `CONJOINT`              | Trade-off analysis           | Preference data                 | Pricing and feature optimization        |
| `MAXDIFF`               | Best/worst selection         | Selection + reasoning           | Finding most/least important attributes |

<Tip>
  **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.
</Tip>

## Polling for Results

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

<CodeGroup>
  ```python Python theme={"dark"}
  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)
  ```

  ```javascript JavaScript theme={"dark"}
  const focusGroupId = "fg_abc123";

  async function pollForResults() {
    while (true) {
      const response = await fetch(
        `https://app.mavera.io/api/v1/focus-groups/${focusGroupId}`,
        { headers: { Authorization: "Bearer mvra_live_your_key_here" } }
      );
      const result = await response.json();

      if (result.status === "COMPLETED") {
        console.log("Focus group complete!");
        return result;
      } else if (result.status === "FAILED") {
        throw new Error(`Focus group failed: ${result.error}`);
      }

      console.log(`Status: ${result.status}... waiting`);
      await new Promise((r) => setTimeout(r, 5000));
    }
  }

  const results = await pollForResults();
  ```
</CodeGroup>

**Status values:**

| Status       | Meaning                        |
| ------------ | ------------------------------ |
| `PENDING`    | Study created, not yet started |
| `PROCESSING` | Responses being generated      |
| `COMPLETED`  | All results available          |
| `FAILED`     | An error occurred              |

## Interpreting Results

### Aggregate Scores

Each question returns an aggregate summary alongside individual responses.

```python theme={"dark"}
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.

```python theme={"dark"}
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.

```python theme={"dark"}
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

```json theme={"dark"}
{
  "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

| Scenario                                              | Best Tool        | Why                                                           |
| ----------------------------------------------------- | ---------------- | ------------------------------------------------------------- |
| "How would Gen Z react to this tagline?"              | **Chat**         | Single persona, single question — fast and cheap              |
| "Compare reactions across 4 segments with NPS scores" | **Focus Groups** | Multiple personas, quantitative data, statistical aggregation |
| "What's the market size for EV charging in Europe?"   | **Mave**         | Research question needing web data and citations              |
| "Test 3 ad concepts with 50 respondents each"         | **Focus Groups** | Structured comparison at scale                                |
| "Get a quick gut-check from a millennial"             | **Chat**         | Conversational, low-cost, real-time                           |
| "Deep competitive analysis with sources"              | **Mave**         | Multi-source research with validation                         |

## Credits and Pricing

Credit cost depends on **sample size**, **question count**, and **question complexity**.

| Sample Size | 3 Questions     | 5 Questions     | 10 Questions     |
| ----------- | --------------- | --------------- | ---------------- |
| 10–25       | 30–50 credits   | 50–75 credits   | 75–120 credits   |
| 26–50       | 50–85 credits   | 75–125 credits  | 125–200 credits  |
| 51–100      | 85–140 credits  | 125–200 credits | 200–350 credits  |
| 100+        | 140–250 credits | 200–350 credits | 350–500+ credits |

<Info>
  Open-ended and conjoint questions cost more per respondent than NPS or yes/no questions because they require more generation.
</Info>

## Listing Focus Groups

Retrieve all focus groups in your workspace.

<CodeGroup>
  ```python Python theme={"dark"}
  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")
  ```

  ```bash cURL theme={"dark"}
  curl https://app.mavera.io/api/v1/focus-groups \
    -H "Authorization: Bearer mvra_live_your_key_here"
  ```
</CodeGroup>

## Best Practices

<AccordionGroup>
  <Accordion title="Mix quantitative and qualitative questions">
    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.
  </Accordion>

  <Accordion title="Choose diverse but relevant personas">
    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.
  </Accordion>

  <Accordion title="Keep studies focused">
    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.
  </Accordion>

  <Accordion title="Use for pre-launch validation">
    Focus Groups are ideal for validating messaging, product concepts, pricing strategies, and feature prioritization before committing real-world budget.
  </Accordion>

  <Accordion title="Run comparative studies">
    Create two focus groups with the same personas but different stimuli (e.g., two taglines, two product descriptions) to see which resonates more.
  </Accordion>

  <Accordion title="Cross-reference with Chat">
    After a Focus Group reveals a surprising result, follow up with a Chat conversation using the same persona to explore the "why" in depth.
  </Accordion>
</AccordionGroup>

<Warning>
  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.
</Warning>

## Next Steps

<CardGroup cols={2}>
  <Card title="Run First Focus Group" icon="book" href="/tutorials/run-first-focus-group">
    Step-by-step tutorial with complete scripts
  </Card>

  <Card title="Quickstart: Focus Groups" icon="rocket" href="/quickstart-focus-groups">
    Get started in 15 minutes
  </Card>

  <Card title="Personas" icon="user" href="/features/personas">
    Choose and create personas for your panels
  </Card>

  <Card title="API Reference" icon="code" href="/api-reference/focus-groups/create-a-focus-group">
    Full API specification
  </Card>
</CardGroup>
