Skip to content

Generating Reports and Insights ​

Advanced analysis techniques for extracting maximum value from your research data.

Overview ​

After conducting user interviews, Synthetic Users provides powerful tools to analyze responses, identify patterns, and generate professional reports. This guide covers the complete analysis workflow.

Prerequisites: Completed study with interview responses (First Study Guide)

Understanding the Analysis Pipeline ​

Research analysis follows this flow:

  1. Raw Interviews → Individual user responses
  2. Summaries → AI-generated insights and themes
  3. Knowledge Graphs → Visual relationship mapping
  4. Reports → Professional documents for stakeholders
  5. Follow-up Analysis → Iterative deep-dives

Generating Summaries ​

Create a Study Summary ​

Summaries aggregate all interview responses and extract key insights:

python
# Python
from syntheticusers import ApiClient, Configuration, StudiesApi

configuration = Configuration(
    host="https://api.syntheticusers.com/api/v1",
    access_token="your-access-token"
)

with ApiClient(configuration) as api_client:
    studies_api = StudiesApi(api_client)
    
    summary = studies_api.generate_summary_v1(
        project_id="your-project-id",
        study_id="your-study-id",
        summary_create={
            "title": "Q1 2026 User Research Findings",
            "description": "Key insights from mobile app navigation study"
        }
    )
    
    summary_id = summary.id
    print(f"Summary generated: {summary_id}")
typescript
// TypeScript
import { createConfiguration, StudiesApi } from '@syntheticusers/sdk'

const config = createConfiguration({
  baseServer: 'https://api.syntheticusers.com',
  authMethods: {
    HTTPBearer: {
      tokenProvider: {
        getToken: () => 'your-access-token'
      }
    }
  }
})

const studiesApi = new StudiesApi(config)

const summary = await studiesApi.generateSummaryV1({
  projectId: 'your-project-id',
  studyId: 'your-study-id',
  summaryCreate: {
    title: 'Q1 2026 User Research Findings',
    description: 'Key insights from mobile app navigation study'
  }
})

const summaryId = summary.id
console.log(`Summary generated: ${summaryId}`)

Use generate_summary to create AI-powered summaries.

What Summaries Include ​

Generated summaries typically contain:

  • Key Themes: Recurring patterns across interviews
  • User Sentiment: Emotional responses and attitudes
  • Pain Points: Challenges and frustrations users mentioned
  • Opportunities: Ideas and suggestions from users
  • Quotes: Representative user statements
  • Recommendations: Actionable next steps based on insights

Retrieve Summary Content ​

python
# Python
from syntheticusers import SummariesApi

summaries_api = SummariesApi(api_client)

summary_details = summaries_api.get_summary_v1(
    project_id="your-project-id",
    summary_id=summary_id
)

print(summary_details.content)

Use get_summary to retrieve summary details.

Interactive Analysis with Follow-ups ​

Ask Questions About Your Summary ​

Use natural language to explore specific aspects:

python
# Python
response = summaries_api.summary_follow_up_v1(
    project_id="your-project-id",
    summary_id=summary_id,
    summary_follow_up_request={
        "message": "What were the most common pain points mentioned by users over 40?"
    }
)

print(response.answer)
typescript
// TypeScript
import { SummariesApi } from '@syntheticusers/sdk'

const summariesApi = new SummariesApi(config)

const response = await summariesApi.summaryFollowUpV1({
  projectId: 'your-project-id',
  summaryId: summaryId,
  summaryFollowUpRequest: {
    message: 'What were the most common pain points mentioned by users over 40?'
  }
})

console.log(response.answer)

Use summary_follow_up to query summaries.

Example Follow-up Questions ​

  • "What percentage of users mentioned accessibility concerns?"
  • "How did iOS users differ from Android users in their responses?"
  • "What specific features did power users request most frequently?"
  • "Were there any surprising insights that contradicted our assumptions?"
  • "Which user segment showed the most enthusiasm for the proposed solution?"

Iterative Deep-Dives ​

Chain follow-up questions to explore themes:

python
# Python
# Start broad
q1 = summaries_api.summary_follow_up_v1(
    project_id=project_id,
    summary_id=summary_id,
    summary_follow_up_request={"message": "What were the top 3 themes?"}
)

# Dig deeper into one theme
q2 = summaries_api.summary_follow_up_v1(
    project_id=project_id,
    summary_id=summary_id,
    summary_follow_up_request={"message": "Tell me more about the navigation theme. What specific issues did users mention?"}
)

# Get actionable recommendations
q3 = summaries_api.summary_follow_up_v1(
    project_id=project_id,
    summary_id=summary_id,
    summary_follow_up_request={"message": "Based on the navigation issues, what are the top 3 changes we should prioritize?"}
)

Visualizing Insights with Knowledge Graphs ​

Generate Knowledge Graphs ​

Knowledge graphs visualize relationships between:

  • Problems and Solutions
  • User Needs and Features
  • Pain Points and Opportunities
  • Concepts and Themes
python
# Python
knowledge_graph = studies_api.generate_knowledge_graph_v1(
    project_id="your-project-id",
    study_id="your-study-id"
)

print("Knowledge graph generated successfully!")
print(f"Nodes: {len(knowledge_graph.nodes)}")
print(f"Edges: {len(knowledge_graph.edges)}")
typescript
// TypeScript
const knowledgeGraph = await studiesApi.generateKnowledgeGraphV1({
  projectId: 'your-project-id',
  studyId: 'your-study-id'
})

console.log('Knowledge graph generated successfully!')
console.log(`Nodes: ${knowledgeGraph.nodes.length}`)
console.log(`Edges: ${knowledgeGraph.edges.length}`)

Use generate_knowledge_graph to create visualizations.

Understanding Graph Structure ​

Knowledge graphs contain:

  • Nodes: Entities (problems, solutions, concepts, insights)
  • Edges: Relationships (causes, solves, relates_to, supports)
  • Attributes: Metadata (importance, sentiment, frequency)

Use Cases for Knowledge Graphs ​

  • Pattern Recognition: Identify which problems affect multiple solutions
  • Impact Analysis: See which solutions address the most pain points
  • Theme Clustering: Group related concepts visually
  • Stakeholder Communication: Present complex findings intuitively

Creating Professional Reports ​

Standalone Reports ​

Create comprehensive documents that combine multiple data sources:

python
# Python
from syntheticusers import ReportsApi

reports_api = ReportsApi(api_client)

report = reports_api.create_report_v1(
    project_id="your-project-id",
    report_create={
        "title": "Q1 2026 Mobile App Research Report",
        "description": "Comprehensive findings from navigation study with actionable recommendations",
        "study_ids": ["study-1", "study-2"],  # Include multiple studies
        "summary_ids": ["summary-1", "summary-2"]  # Include multiple summaries
    }
)

report_id = report.id
print(f"Report created: {report_id}")
typescript
// TypeScript
import { ReportsApi } from '@syntheticusers/sdk'

const reportsApi = new ReportsApi(config)

const report = await reportsApi.createReportV1({
  projectId: 'your-project-id',
  reportCreate: {
    title: 'Q1 2026 Mobile App Research Report',
    description: 'Comprehensive findings from navigation study with actionable recommendations',
    studyIds: ['study-1', 'study-2'],  // Include multiple studies
    summaryIds: ['summary-1', 'summary-2']  // Include multiple summaries
  }
})

const reportId = report.id
console.log(`Report created: ${reportId}`)

Use create_report to create reports.

Generate Report Content ​

Build the complete report with sections:

python
# Python
full_report = reports_api.generate_full_report_v1(
    project_id="your-project-id",
    report_id=report_id
)

print("Full report generated!")
print(f"Sections: {len(full_report.sections)}")

Use generate_full_report to build report content.

Generate Table of Contents ​

Create structured navigation for long reports:

python
# Python
toc = reports_api.generate_toc_endpoint_v1(
    project_id="your-project-id",
    report_id=report_id
)

for section in toc.sections:
    print(f"{section.number}. {section.title}")

Use generate_toc_endpoint to create table of contents.

Retrieve Report Details ​

python
# Python
report_details = reports_api.get_report_v1(
    project_id="your-project-id",
    report_id=report_id
)

print(report_details.title)
print(report_details.content)

Use get_report to retrieve report details.

Exporting and Sharing ​

Export Summaries ​

Download summaries in multiple formats:

python
# Python
# Export as PDF
pdf_content = summaries_api.export_summary_v1(
    project_id="your-project-id",
    summary_id=summary_id,
    format="pdf"
)

with open("research-summary.pdf", "wb") as f:
    f.write(pdf_content)

# Export as plain text
text_content = summaries_api.export_summary_v1(
    project_id="your-project-id",
    summary_id=summary_id,
    format="txt"
)

with open("research-summary.txt", "w") as f:
    f.write(text_content.decode('utf-8'))
typescript
// TypeScript
// Export as PDF
const pdfContent = await summariesApi.exportSummaryV1({
  projectId: 'your-project-id',
  summaryId: summaryId,
  format: 'pdf'
})

await fs.promises.writeFile('research-summary.pdf', pdfContent)

// Export as plain text
const textContent = await summariesApi.exportSummaryV1({
  projectId: 'your-project-id',
  summaryId: summaryId,
  format: 'txt'
})

await fs.promises.writeFile('research-summary.txt', textContent)

Use export_summary to export summaries.

Download Study PDFs ​

Export complete studies with all interviews:

python
# Python
study_pdf = studies_api.get_study_pdf_v1(
    project_id="your-project-id",
    study_id="your-study-id"
)

with open("complete-study.pdf", "wb") as f:
    f.write(study_pdf)

print("Study PDF exported successfully!")
typescript
// TypeScript
const studyPdf = await studiesApi.getStudyPdfV1({
  projectId: 'your-project-id',
  studyId: 'your-study-id'
})

await fs.promises.writeFile('complete-study.pdf', studyPdf)
console.log('Study PDF exported successfully!')

Use get_study_pdf to download studies as PDFs.

Sharing Best Practices ​

  • PDFs: Best for stakeholder presentations and archival
  • Text: Easy to integrate into other documents or tools
  • Knowledge Graphs: Share visual insights in meetings
  • Report Links: Provide web access for collaborative review

Advanced Analysis Techniques ​

Comparing Multiple Studies ​

Analyze trends across multiple research initiatives:

python
# Python
# Create a meta-report combining multiple studies
meta_report = reports_api.create_report_v1(
    project_id="your-project-id",
    report_create={
        "title": "Q4 2025 - Q1 2026 Quarterly Insights",
        "description": "Trends and patterns across 4 months of user research",
        "study_ids": [
            "study-oct-2025",
            "study-nov-2025",
            "study-dec-2025",
            "study-jan-2026"
        ]
    }
)

# Ask comparative questions
comparison = summaries_api.summary_follow_up_v1(
    project_id="your-project-id",
    summary_id=meta_summary_id,
    summary_follow_up_request={
        "message": "How have user priorities changed from October to January?"
    }
)

Regenerating Analysis ​

Update summaries when you add new interview data:

python
# Python
# Run additional interviews
studies_api.interview_v1(
    project_id="your-project-id",
    study_id="your-study-id",
    interview_request={
        "message": "Follow-up question based on initial findings..."
    }
)

# Regenerate summary to include new data
updated_summary = studies_api.generate_summary_v1(
    project_id="your-project-id",
    study_id="your-study-id",
    summary_create={
        "title": "Updated Research Findings",
        "description": "Includes follow-up interview responses"
    }
)

Segment-Specific Analysis ​

Analyze subsets of your audience:

python
# Python
# Ask targeted follow-up questions
power_users = summaries_api.summary_follow_up_v1(
    project_id="your-project-id",
    summary_id=summary_id,
    summary_follow_up_request={
        "message": "Focus only on responses from users who identified as 'power users'. What were their unique concerns?"
    }
)

mobile_vs_desktop = summaries_api.summary_follow_up_v1(
    project_id="your-project-id",
    summary_id=summary_id,
    summary_follow_up_request={
        "message": "Compare the responses of mobile-first users vs desktop-first users. What differences stand out?"
    }
)

Monitoring Progress in Real-time ​

Stream Events ​

Track analysis generation as it happens:

python
# Python
from syntheticusers import ProjectsApi

projects_api = ProjectsApi(api_client)

# Stream events for real-time updates
events = projects_api.stream_events_v1(
    project_id="your-project-id",
    workspace_id="your-workspace-id"
)

for event in events:
    if event.type == "summary.generated":
        print(f"Summary complete: {event.data.summary_id}")
    elif event.type == "report.generated":
        print(f"Report complete: {event.data.report_id}")

Use stream_events for real-time monitoring.

Best Practices ​

When to Generate Summaries ​

  • After all interviews complete: Wait for full dataset
  • Before stakeholder meetings: Prepare insights in advance
  • At research milestones: Capture progress at key points

Effective Follow-up Questions ​

  • Start broad, then narrow: "What were the themes?" → "Tell me more about theme X"
  • Compare segments: "How did group A differ from group B?"
  • Quantify insights: "What percentage mentioned feature X?"
  • Seek actionability: "What are the top 3 changes to prioritize?"

Report Structure ​

Include these sections for comprehensive reports:

  1. Executive Summary: Key findings at a glance
  2. Methodology: Study design and audience details
  3. Key Insights: Main themes with supporting quotes
  4. Recommendations: Prioritized action items
  5. Appendix: Full interview transcripts and data

Export Timing ​

  • Draft insights: Use text format for easy editing
  • Internal reviews: Share web links for collaboration
  • Final deliverables: Export PDFs for distribution

Troubleshooting ​

Empty or incomplete summaries?

  • Ensure all interviews completed successfully
  • Check that interview responses contain substantive content
  • Try regenerating with a more specific description

Knowledge graph not displaying relationships?

  • Verify that problems and solutions are linked to the study
  • Ensure concepts are properly tagged
  • Check that interview data contains entity references

Export failures?

  • Verify summary generation completed successfully
  • Check that you have the necessary permissions
  • Try a different export format

Next Steps ​

Released under the MIT License.