Files
whyrating/apps/web/src/modules/marketing/demo/demo-synthesis.ts
Alejandro Gutiérrez cc19f2d398 fix: resolve demo report scroll trap and add review evidence appendix
- Change page CSS from fixed height+overflow:hidden to min-height+overflow:visible
- Remove overflow:hidden from ReportPage inline styles
- Add 7 anonymized review evidence entries with classification anchors so the
  Review Evidence appendix section renders in the demo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:03:46 +00:00

1730 lines
50 KiB
TypeScript

/**
* Demo synthesis data for the marketing demo page.
* Anonymized version of a real ReportSynthesis.
*/
// =============================================================================
// Types (copied from whymyrating-engine for self-containment)
// =============================================================================
/**
* TypeScript types for the Reputation Blueprint report.
*
* These types mirror the backend ReportSynthesis JSON shape
* stored in pipeline.executions.synthesis (stage5_synthesize_v2.py).
*
* ALL labels, vocabulary, and category-specific text come from the
* synthesis JSON. The frontend has zero category configs.
*/
// =============================================================================
// Score Breakdown
// =============================================================================
interface ScoreBreakdown {
rating_quality: number;
sentiment_depth: number;
volume: number;
momentum: number;
intensity: number;
}
// =============================================================================
// Theme Analysis
// =============================================================================
interface ThemeScore {
primitive: string;
label: string;
domain: string;
count: number;
weight: number;
valence: {
positive: number;
negative: number;
neutral: number;
mixed: number;
};
intensity: {
i1: number;
i2: number;
i3: number;
};
top_quotes: {
positive: string[];
negative: string[];
};
score_cost?: number; // reputational cost 0-100
}
// =============================================================================
// Domain Performance
// =============================================================================
interface DomainScore {
domain: string;
label: string;
score: number;
weight: number;
volume: number;
primitives: string[];
narrative?: string;
}
// =============================================================================
// Critical Issues
// =============================================================================
interface CriticalIssue {
title: string;
primitive: string;
domain: string;
count: number;
intensity_score: number;
description: string;
quotes: string[];
solution: string;
complexity: 'quick' | 'medium' | 'complex';
score_cost?: number; // reputational cost 0-100
}
// =============================================================================
// Strengths
// =============================================================================
interface Strength {
title: string;
primitive: string;
domain: string;
count: number;
intensity_score: number;
description: string;
quotes: string[];
marketing_angle: string;
}
// =============================================================================
// Action Plan
// =============================================================================
interface ActionItem {
action: string;
source: string;
owner: string;
effort: 'low' | 'medium' | 'high';
timeline: string;
impact: 'high' | 'medium' | 'low';
success_metric: string;
detail?: string;
evidence?: string;
}
// =============================================================================
// Tracking KPIs
// =============================================================================
interface KPI {
metric: string;
current: string;
target_30d: string;
target_90d: string;
}
// =============================================================================
// Evidence
// =============================================================================
interface Evidence {
quote: string;
primitive: string;
valence: string;
context: string;
}
// =============================================================================
// Review Evidence (v3 — full review text with classification anchors)
// =============================================================================
interface ReviewClassification {
primitive: string;
valence: string; // '+', '-', '0', '±'
anchor_text: string;
anchor_start: number | null;
anchor_end: number | null;
}
interface ReviewEvidence {
review_id: string;
author: string;
rating: number | null;
date: string | null;
full_text: string;
classifications: ReviewClassification[];
}
// =============================================================================
// Chart Data (pre-computed by backend)
// =============================================================================
interface ChartDataPoint {
label: string;
value: number;
color?: string;
}
interface DomainRadarPoint {
axis: string;
value: number;
}
interface ThemeMatrixPoint {
primitive: string;
label: string;
positive: number;
negative: number;
neutral: number;
mixed: number;
total: number;
}
interface IntensityHeatmapPoint {
primitive: string;
label: string;
i1: number;
i2: number;
i3: number;
}
interface RatingDistPoint {
rating: number;
count: number;
}
interface RatingTrendPoint {
period: string;
avg_rating: number;
review_count: number;
}
interface MomentumDualPoint {
period: string;
positive: number;
negative: number;
}
interface QuarterlyRatingPoint {
quarter: string; // "2024-Q1"
avg_rating: number;
review_count: number;
}
interface QuarterlyDomainSentimentPoint {
quarter: string;
O?: number; P?: number; J?: number; E?: number; V?: number; // 0-100 positive %
}
interface SeasonalPatternPoint {
quarter_label: string; // "Q1"-"Q4"
avg_rating: number;
review_count: number;
}
interface ReportCharts {
sentiment_donut: ChartDataPoint[];
domain_radar: DomainRadarPoint[];
theme_matrix: ThemeMatrixPoint[];
intensity_heatmap: IntensityHeatmapPoint[];
rating_distribution: RatingDistPoint[];
rating_trend: RatingTrendPoint[];
momentum_dual: MomentumDualPoint[];
quarterly_rating?: QuarterlyRatingPoint[];
quarterly_domain_sentiment?: QuarterlyDomainSentimentPoint[];
seasonal_pattern?: SeasonalPatternPoint[];
}
// =============================================================================
// Staff Leaderboard
// =============================================================================
interface StaffMember {
name: string;
total_mentions: number;
positive: number;
negative: number;
sentiment_score: number; // 0-100
positive_quotes?: string[];
negative_quotes?: string[];
}
interface StaffIndividual {
canonical_name: string;
aliases: string[];
role_inferred: string | null;
positive: number;
negative: number;
total_mentions: number;
sentiment_score: number;
positive_quotes: string[];
negative_quotes: string[];
note: string | null;
}
interface StaffGroup {
canonical_name: string;
aliases: string[];
positive: number;
negative: number;
total_mentions: number;
sentiment_score: number;
positive_quotes: string[];
negative_quotes: string[];
note: string | null;
}
interface StaffExcluded {
name: string;
reason: string;
}
interface StaffLeaderboardResolved {
individuals: StaffIndividual[];
groups: StaffGroup[];
excluded?: StaffExcluded[];
observations: string;
}
// =============================================================================
// Top-Level Report Synthesis (matches JSON stored in executions.synthesis)
// =============================================================================
interface ReportSynthesis {
// Meta
report_version: string;
business_name: string;
category_label: string;
sector_code: string;
report_date: string;
language?: string;
review_count: number;
// Scores
reputation_score: number; // 0-100
score_breakdown: ScoreBreakdown;
current_rating: number;
potential_rating: number;
// Rating Distribution
rating_distribution: Record<string, number>;
// Executive Summary (LLM-generated with sector vocabulary)
headline: string;
verdict: string;
key_findings: string[];
revenue_impact: string;
// AI Narratives (optional — v2.1.0+)
rating_narrative?: string;
themes_narrative?: string;
matrix_narrative?: string;
trends_narrative?: string;
domain_overview?: string;
rating_evolution_narrative?: string;
domain_sentiment_narrative?: string;
seasonal_narrative?: string;
// Themes
themes: ThemeScore[];
// Domains
domains: DomainScore[];
// Critical Issues (LLM-generated solutions)
critical_issues: CriticalIssue[];
// Strengths (LLM-generated marketing angles)
strengths: Strength[];
// Action Plan (LLM-generated)
actions: ActionItem[];
// Tracking
kpis: KPI[];
// Evidence
evidence: Evidence[];
// Staff Leaderboard (array = legacy v2.0.0, object = resolved v2.1.0+)
staff_leaderboard?: StaffMember[] | StaffLeaderboardResolved;
// Review Evidence (v3 — full review text with classification anchors)
review_evidence?: ReviewEvidence[];
// Methodology (v2.2.0+)
methodology?: {
data_source: string;
oldest_review: string | null;
newest_review: string | null;
review_count: number;
classification_model: string;
score_weights: Record<string, number>;
};
// Conclusion (v2.2.0+)
conclusion?: {
takeaways: string[];
ninety_day_focus: string;
review_cadence: string;
cost_of_inaction: string;
};
// Pre-computed chart data
charts: ReportCharts;
}
// =============================================================================
// Demo Data
// =============================================================================
export const demoSynthesis: ReportSynthesis = {
"kpis": [],
"charts": {
"domain_radar": [
{
"axis": "People/Service",
"value": 98.2
},
{
"axis": "Journey/Process",
"value": 97.5
},
{
"axis": "Value",
"value": 89.2
},
{
"axis": "Output/Product",
"value": 95.2
},
{
"axis": "Environment",
"value": 100.0
}
],
"rating_trend": [],
"theme_matrix": [
{
"label": "Manner/Attitude",
"mixed": 0,
"total": 471,
"neutral": 0,
"negative": 9,
"positive": 462,
"primitive": "MANNER"
},
{
"label": "Speed/Wait",
"mixed": 0,
"total": 129,
"neutral": 0,
"negative": 0,
"positive": 129,
"primitive": "SPEED"
},
{
"label": "Competence",
"mixed": 0,
"total": 47,
"neutral": 0,
"negative": 0,
"positive": 47,
"primitive": "COMPETENCE"
},
{
"label": "Recommend",
"mixed": 0,
"total": 45,
"neutral": 0,
"negative": 0,
"positive": 45,
"primitive": "RECOMMEND"
},
{
"label": "Price Fairness",
"mixed": 0,
"total": 41,
"neutral": 0,
"negative": 3,
"positive": 38,
"primitive": "PRICE_FAIRNESS"
},
{
"label": "Attentiveness",
"mixed": 0,
"total": 27,
"neutral": 0,
"negative": 1,
"positive": 26,
"primitive": "ATTENTIVENESS"
},
{
"label": "Value for Money",
"mixed": 0,
"total": 24,
"neutral": 0,
"negative": 5,
"positive": 19,
"primitive": "VALUE_FOR_MONEY"
},
{
"label": "Effectiveness",
"mixed": 0,
"total": 23,
"neutral": 0,
"negative": 1,
"positive": 22,
"primitive": "EFFECTIVENESS"
},
{
"label": "Friction",
"mixed": 0,
"total": 16,
"neutral": 0,
"negative": 3,
"positive": 13,
"primitive": "FRICTION"
},
{
"label": "Reliability",
"mixed": 0,
"total": 15,
"neutral": 0,
"negative": 1,
"positive": 14,
"primitive": "RELIABILITY"
},
{
"label": "Communication",
"mixed": 0,
"total": 14,
"neutral": 0,
"negative": 0,
"positive": 14,
"primitive": "COMMUNICATION"
},
{
"label": "Accuracy",
"mixed": 0,
"total": 11,
"neutral": 0,
"negative": 0,
"positive": 11,
"primitive": "ACCURACY"
},
{
"label": "Price Transparency",
"mixed": 0,
"total": 8,
"neutral": 0,
"negative": 0,
"positive": 8,
"primitive": "PRICE_TRANSPARENCY"
},
{
"label": "Honesty",
"mixed": 0,
"total": 6,
"neutral": 0,
"negative": 0,
"positive": 6,
"primitive": "HONESTY"
},
{
"label": "Taste/Flavor",
"mixed": 0,
"total": 5,
"neutral": 0,
"negative": 1,
"positive": 4,
"primitive": "TASTE"
}
],
"momentum_dual": [],
"sentiment_donut": [
{
"color": "#22c55e",
"label": "Positive",
"value": 867
},
{
"color": "#ef4444",
"label": "Negative",
"value": 24
},
{
"color": "#94a3b8",
"label": "Neutral",
"value": 0
},
{
"color": "#f59e0b",
"label": "Mixed",
"value": 0
}
],
"quarterly_rating": [
{
"quarter": "2024-Q2",
"avg_rating": 4.92,
"review_count": 37
},
{
"quarter": "2024-Q3",
"avg_rating": 4.95,
"review_count": 78
},
{
"quarter": "2024-Q4",
"avg_rating": 4.83,
"review_count": 64
},
{
"quarter": "2025-Q1",
"avg_rating": 4.92,
"review_count": 106
},
{
"quarter": "2025-Q2",
"avg_rating": 4.88,
"review_count": 64
},
{
"quarter": "2025-Q3",
"avg_rating": 4.88,
"review_count": 83
},
{
"quarter": "2025-Q4",
"avg_rating": 4.94,
"review_count": 112
},
{
"quarter": "2026-Q1",
"avg_rating": 4.75,
"review_count": 52
}
],
"seasonal_pattern": [
{
"avg_rating": 4.86,
"review_count": 158,
"quarter_label": "Q1"
},
{
"avg_rating": 4.89,
"review_count": 101,
"quarter_label": "Q2"
},
{
"avg_rating": 4.91,
"review_count": 161,
"quarter_label": "Q3"
},
{
"avg_rating": 4.9,
"review_count": 176,
"quarter_label": "Q4"
}
],
"intensity_heatmap": [
{
"i1": 0,
"i2": 209,
"i3": 262,
"label": "Manner/Attitude",
"primitive": "MANNER"
},
{
"i1": 0,
"i2": 93,
"i3": 36,
"label": "Speed/Wait",
"primitive": "SPEED"
},
{
"i1": 0,
"i2": 28,
"i3": 19,
"label": "Competence",
"primitive": "COMPETENCE"
},
{
"i1": 0,
"i2": 13,
"i3": 32,
"label": "Recommend",
"primitive": "RECOMMEND"
},
{
"i1": 0,
"i2": 31,
"i3": 10,
"label": "Price Fairness",
"primitive": "PRICE_FAIRNESS"
},
{
"i1": 0,
"i2": 16,
"i3": 11,
"label": "Attentiveness",
"primitive": "ATTENTIVENESS"
},
{
"i1": 0,
"i2": 17,
"i3": 7,
"label": "Value for Money",
"primitive": "VALUE_FOR_MONEY"
},
{
"i1": 0,
"i2": 10,
"i3": 13,
"label": "Effectiveness",
"primitive": "EFFECTIVENESS"
},
{
"i1": 1,
"i2": 7,
"i3": 8,
"label": "Friction",
"primitive": "FRICTION"
},
{
"i1": 0,
"i2": 4,
"i3": 11,
"label": "Reliability",
"primitive": "RELIABILITY"
},
{
"i1": 0,
"i2": 8,
"i3": 6,
"label": "Communication",
"primitive": "COMMUNICATION"
},
{
"i1": 0,
"i2": 10,
"i3": 1,
"label": "Accuracy",
"primitive": "ACCURACY"
},
{
"i1": 0,
"i2": 3,
"i3": 5,
"label": "Price Transparency",
"primitive": "PRICE_TRANSPARENCY"
},
{
"i1": 0,
"i2": 4,
"i3": 2,
"label": "Honesty",
"primitive": "HONESTY"
},
{
"i1": 1,
"i2": 3,
"i3": 1,
"label": "Taste/Flavor",
"primitive": "TASTE"
}
],
"rating_distribution": [
{
"count": 10,
"rating": 1
},
{
"count": 3,
"rating": 2
},
{
"count": 2,
"rating": 3
},
{
"count": 12,
"rating": 4
},
{
"count": 569,
"rating": 5
}
],
"quarterly_domain_sentiment": [
{
"J": 100.0,
"O": 100.0,
"P": 100.0,
"V": 60.0,
"quarter": "2024-Q2"
},
{
"J": 92.3,
"O": 100.0,
"P": 100.0,
"V": 100.0,
"quarter": "2024-Q3"
},
{
"J": 100.0,
"O": 100.0,
"P": 98.3,
"V": 87.5,
"quarter": "2024-Q4"
},
{
"J": 95.5,
"O": 83.3,
"P": 99.1,
"V": 100.0,
"quarter": "2025-Q1"
},
{
"J": 92.9,
"O": 100.0,
"P": 98.5,
"V": 80.0,
"quarter": "2025-Q2"
},
{
"J": 100.0,
"O": 100.0,
"P": 95.5,
"V": 100.0,
"quarter": "2025-Q3"
},
{
"J": 100.0,
"P": 99.1,
"V": 83.3,
"quarter": "2025-Q4"
},
{
"J": 100.0,
"O": 100.0,
"P": 92.5,
"V": 83.3,
"quarter": "2026-Q1"
}
]
},
"themes": [
{
"count": 471,
"label": "Manner/Attitude",
"domain": "P",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 9,
"positive": 462
},
"intensity": {
"i1": 0,
"i2": 209,
"i3": 262
},
"primitive": "MANNER",
"score_cost": 1.2,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 129,
"label": "Speed/Wait",
"domain": "J",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 129
},
"intensity": {
"i1": 0,
"i2": 93,
"i3": 36
},
"primitive": "SPEED",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 47,
"label": "Competence",
"domain": "P",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 47
},
"intensity": {
"i1": 0,
"i2": 28,
"i3": 19
},
"primitive": "COMPETENCE",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 45,
"label": "Recommend",
"domain": "meta",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 45
},
"intensity": {
"i1": 0,
"i2": 13,
"i3": 32
},
"primitive": "RECOMMEND",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 41,
"label": "Price Fairness",
"domain": "V",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 3,
"positive": 38
},
"intensity": {
"i1": 0,
"i2": 31,
"i3": 10
},
"primitive": "PRICE_FAIRNESS",
"score_cost": 0.3,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 27,
"label": "Attentiveness",
"domain": "P",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 1,
"positive": 26
},
"intensity": {
"i1": 0,
"i2": 16,
"i3": 11
},
"primitive": "ATTENTIVENESS",
"score_cost": 0.2,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 24,
"label": "Value for Money",
"domain": "V",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 5,
"positive": 19
},
"intensity": {
"i1": 0,
"i2": 17,
"i3": 7
},
"primitive": "VALUE_FOR_MONEY",
"score_cost": 0.7,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 23,
"label": "Effectiveness",
"domain": "O",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 1,
"positive": 22
},
"intensity": {
"i1": 0,
"i2": 10,
"i3": 13
},
"primitive": "EFFECTIVENESS",
"score_cost": 0.2,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 16,
"label": "Friction",
"domain": "J",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 3,
"positive": 13
},
"intensity": {
"i1": 1,
"i2": 7,
"i3": 8
},
"primitive": "FRICTION",
"score_cost": 0.2,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 15,
"label": "Reliability",
"domain": "J",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 1,
"positive": 14
},
"intensity": {
"i1": 0,
"i2": 4,
"i3": 11
},
"primitive": "RELIABILITY",
"score_cost": 0.2,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 14,
"label": "Communication",
"domain": "P",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 14
},
"intensity": {
"i1": 0,
"i2": 8,
"i3": 6
},
"primitive": "COMMUNICATION",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 11,
"label": "Accuracy",
"domain": "O",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 11
},
"intensity": {
"i1": 0,
"i2": 10,
"i3": 1
},
"primitive": "ACCURACY",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 8,
"label": "Price Transparency",
"domain": "V",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 8
},
"intensity": {
"i1": 0,
"i2": 3,
"i3": 5
},
"primitive": "PRICE_TRANSPARENCY",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 6,
"label": "Honesty",
"domain": "meta",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 6
},
"intensity": {
"i1": 0,
"i2": 4,
"i3": 2
},
"primitive": "HONESTY",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 5,
"label": "Taste/Flavor",
"domain": "O",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 1,
"positive": 4
},
"intensity": {
"i1": 1,
"i2": 3,
"i3": 1
},
"primitive": "TASTE",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 3,
"label": "Return Intent",
"domain": "meta",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 3
},
"intensity": {
"i1": 0,
"i2": 1,
"i3": 2
},
"primitive": "RETURN_INTENT",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 2,
"label": "Craftsmanship",
"domain": "O",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 2
},
"intensity": {
"i1": 0,
"i2": 1,
"i3": 1
},
"primitive": "CRAFT",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 1,
"label": "Freshness",
"domain": "O",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 1
},
"intensity": {
"i1": 0,
"i2": 1,
"i3": 0
},
"primitive": "FRESHNESS",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 1,
"label": "Price Level",
"domain": "V",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 1
},
"intensity": {
"i1": 0,
"i2": 0,
"i3": 1
},
"primitive": "PRICE_LEVEL",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 1,
"label": "Ambiance",
"domain": "E",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 1
},
"intensity": {
"i1": 0,
"i2": 1,
"i3": 0
},
"primitive": "AMBIANCE",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
},
{
"count": 1,
"label": "Safety",
"domain": "E",
"weight": 1.0,
"valence": {
"mixed": 0,
"neutral": 0,
"negative": 0,
"positive": 1
},
"intensity": {
"i1": 0,
"i2": 1,
"i3": 0
},
"primitive": "SAFETY",
"score_cost": 0.0,
"top_quotes": {
"positive": [],
"negative": []
}
}
],
"actions": [
{
"owner": "gerente",
"action": "Abordar la actitud del tasador.",
"detail": "",
"effort": "medium",
"impact": "high",
"source": "MANNER",
"evidence": "",
"timeline": "This month",
"success_metric": "Reducción del 50% en menciones negativas sobre la actitud en los próximos 60 días."
},
{
"owner": "gerente",
"action": "Mejorar la claridad en la tasación online.",
"detail": "",
"effort": "medium",
"impact": "medium",
"source": "FRICTION",
"evidence": "",
"timeline": "This month",
"success_metric": "Lograr que al menos el 80% de los clientes mencionen un proceso más claro en sus reseñas en los próximos 90 días."
},
{
"owner": "gerente",
"action": "Revisar las estimaciones de tasación.",
"detail": "",
"effort": "high",
"impact": "high",
"source": "VALUE_FOR_MONEY",
"evidence": "",
"timeline": "This quarter",
"success_metric": "Incrementar en un 30% las menciones positivas sobre la tasación en los siguientes 90 días."
},
{
"owner": "gerente",
"action": "Fortalecer la comunicación post-tasación.",
"detail": "",
"effort": "medium",
"impact": "high",
"source": "RELIABILITY",
"evidence": "",
"timeline": "This month",
"success_metric": "Alcanzar un 95% de satisfacción en la comunicación de pagos en las reseñas en los próximos 60 días."
},
{
"owner": "gerente",
"action": "Reforzar la capacitación en atención al cliente.",
"detail": "",
"effort": "medium",
"impact": "medium",
"source": "ATTENTIVENESS",
"evidence": "",
"timeline": "This month",
"success_metric": "Lograr un 90% de menciones positivas sobre la atención al cliente en las próximas 90 días."
}
],
"domains": [
{
"label": "People/Service",
"score": 98.2,
"domain": "P",
"volume": 559,
"weight": 66.8,
"narrative": "",
"primitives": [
"MANNER",
"COMPETENCE",
"ATTENTIVENESS",
"COMMUNICATION"
]
},
{
"label": "Journey/Process",
"score": 97.5,
"domain": "J",
"volume": 160,
"weight": 19.1,
"narrative": "",
"primitives": [
"SPEED",
"FRICTION",
"RELIABILITY"
]
},
{
"label": "Value",
"score": 89.2,
"domain": "V",
"volume": 74,
"weight": 8.8,
"narrative": "",
"primitives": [
"PRICE_FAIRNESS",
"VALUE_FOR_MONEY",
"PRICE_TRANSPARENCY",
"PRICE_LEVEL"
]
},
{
"label": "Output/Product",
"score": 95.2,
"domain": "O",
"volume": 42,
"weight": 5.0,
"narrative": "",
"primitives": [
"EFFECTIVENESS",
"ACCURACY",
"TASTE",
"CRAFT",
"FRESHNESS"
]
},
{
"label": "Environment",
"score": 100.0,
"domain": "E",
"volume": 2,
"weight": 0.2,
"narrative": "",
"primitives": [
"AMBIANCE",
"SAFETY"
]
}
],
"verdict": "Con una puntuación de reputación de 83/100 y un promedio de 4.89 estrellas, su negocio se posiciona bien en el mercado. Sin embargo, comentarios negativos sobre la actitud del personal y la valoración de vehículos indican áreas críticas que requieren atención.",
"evidence": [],
"headline": "Reputación sólida con áreas de mejora en trato y valoración.",
"language": "es",
"strengths": [
{
"count": 462,
"title": "Manner/Attitude",
"domain": "P",
"quotes": [],
"primitive": "MANNER",
"description": "462 clientes destacan la atención impecable y la amabilidad del personal. Comentarios como 'Excelente trato, muy buena atención' reflejan una experiencia positiva.",
"intensity_score": 1438,
"marketing_angle": "Publicar testimonios de clientes satisfechos en la página web y en redes sociales para resaltar la calidad del servicio al cliente."
},
{
"count": 129,
"title": "Speed/Wait",
"domain": "J",
"quotes": [],
"primitive": "SPEED",
"description": "129 reseñas elogian la rapidez del proceso de revisión y venta. Frases como 'súper rápido todo el proceso' indican eficiencia en el servicio.",
"intensity_score": 330,
"marketing_angle": "Crear un video corto que muestre el proceso rápido de tasación y venta, compartiéndolo en plataformas como Instagram y TikTok."
},
{
"count": 45,
"title": "Recommend",
"domain": "meta",
"quotes": [],
"primitive": "RECOMMEND",
"description": "45 clientes han declarado que recomiendan el servicio, con comentarios como 'Muy recomendable' y 'Totalmente recomendables'.",
"intensity_score": 154,
"marketing_angle": "Iniciar un programa de referidos donde los clientes actuales puedan obtener beneficios al recomendar a nuevos clientes."
},
{
"count": 47,
"title": "Competence",
"domain": "P",
"quotes": [],
"primitive": "COMPETENCE",
"description": "47 reseñas destacan la competencia del equipo, mencionando que ayudan con todos los trámites y dudas, y alabando el servicio de Padilla, Alex y Silvia.",
"intensity_score": 132,
"marketing_angle": "Destacar la experiencia y profesionalismo del equipo en publicaciones de blog y en la sección 'Conócenos' del sitio web."
},
{
"count": 38,
"title": "Price Fairness",
"domain": "V",
"quotes": [],
"primitive": "PRICE_FAIRNESS",
"description": "38 clientes han expresado satisfacción con la tasación inicial y el precio pactado. Comentarios como 'me respetaron la tasación inicial' son comunes.",
"intensity_score": 95,
"marketing_angle": "Desarrollar una campaña de marketing que enfatice la transparencia en las tasaciones y precios, utilizando infografías en redes sociales."
}
],
"conclusion": {
"takeaways": [
"El 98% de los comentarios sobre el trato y la actitud son positivos, pero 9 clientes mencionaron un trato nefasta de algunos tasadores.",
"El 89% de los clientes consideran que la relación calidad-precio es buena, aunque 5 mencionaron que la tasación fue excesivamente baja.",
"La velocidad del proceso es un punto fuerte, con 129 menciones positivas, pero 3 clientes reportaron fricción en la comunicación del proceso de tasación."
],
"review_cadence": "Recomiendo realizar este análisis cada tres meses para monitorear el progreso y ajustar estrategias según sea necesario.",
"cost_of_inaction": "Si no aborda las quejas sobre el trato y la tasación, podría perder entre el 5% y el 10% de clientes potenciales, lo que impactaría negativamente en las ventas y reputación. Además, la percepción de falta de profesionalidad podría dañar la confianza de los clientes existentes.",
"ninety_day_focus": "Enfóquese en mejorar la experiencia de los clientes durante la tasación. Aborde las quejas sobre el trato y la actitud de algunos tasadores para evitar que se repitan. Considere la posibilidad de capacitar a su equipo en habilidades de atención al cliente y claridad en la comunicación de precios y procesos."
},
"methodology": {
"data_source": "Google Maps Reviews",
"review_count": 596,
"newest_review": null,
"oldest_review": null,
"score_weights": {
"volume": 0.15,
"momentum": 0.15,
"intensity": 0.15,
"rating_quality": 0.3,
"sentiment_depth": 0.25
},
"classification_model": "gpt-4o"
},
"report_date": "2026-02-18T03:27:52.636987",
"sector_code": "GENERAL",
"key_findings": [
"El 98% de las menciones sobre el trato del personal son positivas, pero hay 9 comentarios negativos que destacan la falta de profesionalidad.",
"El 89% de los clientes valoran positivamente el precio, aunque 5 clientes mencionan que la tasación fue excesivamente baja.",
"El tiempo de respuesta propietario es alto, con un 97.4%, pero una mejora en la atención al cliente podría reducir las quejas."
],
"review_count": 596,
"business_name": "Bistro El Sol",
"category_label": "Restaurant",
"current_rating": 4.89,
"report_version": "2.2.0",
"revenue_impact": "Abordar las quejas sobre el trato y la valoración podría mejorar la satisfacción del cliente, lo que a su vez puede aumentar las recomendaciones y las ventas. Una experiencia más positiva podría traducirse en un incremento significativo de ingresos.",
"critical_issues": [
{
"count": 9,
"title": "Manner/Attitude",
"domain": "P",
"quotes": [],
"solution": "Realice una revisión de los procedimientos de atención al cliente y considere implementar sesiones de retroalimentación para el personal. Priorice la capacitación en habilidades interpersonales para asegurar que todos los empleados mantengan una actitud positiva y profesional en sus interacciones con los clientes.",
"primitive": "MANNER",
"complexity": "medium",
"score_cost": 1.2,
"description": "Nueve clientes mencionaron un trato deficiente, describiendo la actitud del personal como 'nefasta' y 'poco profesional'. Comentarios como 'el trato casi de que te están haciendo un favor' reflejan una percepción negativa sobre la atención al cliente.",
"intensity_score": 28
},
{
"count": 5,
"title": "Value for Money",
"domain": "V",
"quotes": [],
"solution": "Revise y ajuste sus criterios de tasación para alinearlos con el mercado actual. Considere ofrecer explicaciones más claras sobre cómo se determinan los valores y brindar ejemplos de tasaciones previas para mejorar la transparencia y la confianza del cliente.",
"primitive": "VALUE_FOR_MONEY",
"complexity": "medium",
"score_cost": 0.7,
"description": "Cinco clientes expresaron insatisfacción con la valoración de sus vehículos, indicando que las tasaciones son excesivamente bajas. Comentarios como 'infravaloración del vehículo' y 'bajón de 800€' demuestran una percepción de explotación de la necesidad de los clientes.",
"intensity_score": 13
},
{
"count": 3,
"title": "Friction",
"domain": "J",
"quotes": [],
"solution": "Mejore la comunicación en su sitio web sobre la documentación necesaria y considere implementar un mapa o instrucciones más claras sobre cómo llegar a las sucursales. Además, establezca un protocolo para minimizar las demoras y garantizar un proceso más ágil.",
"primitive": "FRICTION",
"complexity": "quick",
"score_cost": 0.2,
"description": "Tres clientes mencionaron fricciones en el proceso, destacando la falta de claridad en la documentación requerida y demoras, como '7 minutos de demora por no encontrar la ubicación'. Esto sugiere que la experiencia del cliente no es tan fluida como debería.",
"intensity_score": 9
},
{
"count": 3,
"title": "Price Fairness",
"domain": "V",
"quotes": [],
"solution": "Asegúrese de que todas las estimaciones sean claras y consistentes desde el principio. Considere establecer un sistema de verificación para que las estimaciones iniciales se respeten, y comunique a los clientes cómo se derivan los cambios en las ofertas.",
"primitive": "PRICE_FAIRNESS",
"complexity": "medium",
"score_cost": 0.3,
"description": "Tres clientes se sintieron engañados por la discrepancia entre las estimaciones iniciales y los precios finales, con comentarios como 'la central tira hacia la baja el presupuesto'. Esto genera desconfianza en el proceso de tasación.",
"intensity_score": 7
},
{
"count": 1,
"title": "Attentiveness",
"domain": "P",
"quotes": [],
"solution": "Refuerce la importancia de la atención al cliente en su cultura organizacional. Realice sesiones de capacitación centradas en la escucha activa y la asesoría efectiva, asegurando que el personal esté preparado para responder a las preguntas de los clientes.",
"primitive": "ATTENTIVENESS",
"complexity": "medium",
"score_cost": 0.2,
"description": "Un cliente mencionó la falta de interés del personal en explicar o asesorar durante el proceso. Esto puede indicar una desconexión entre las expectativas del cliente y la atención proporcionada.",
"intensity_score": 3
},
{
"count": 1,
"title": "Effectiveness",
"domain": "O",
"quotes": [],
"solution": "Realice un análisis de las diferencias en el servicio entre la tasación online y en la sucursal. Asegúrese de que los procesos estén estandarizados y que el personal reciba la misma capacitación y recursos para manejar las evaluaciones de manera eficaz.",
"primitive": "EFFECTIVENESS",
"complexity": "complex",
"score_cost": 0.2,
"description": "Un cliente reportó una experiencia mixta con la tasación online, calificando la atención en la sucursal de Leganés como 'catastrófica'. Esto sugiere una inconsistencia en la calidad del servicio.",
"intensity_score": 3
},
{
"count": 1,
"title": "Reliability",
"domain": "J",
"quotes": [],
"solution": "Establezca un protocolo claro para el manejo de pagos y asegúrese de que los clientes estén informados sobre los tiempos de procesamiento. Considere revisar su relación con las entidades bancarias para evitar futuros problemas y mejorar la experiencia del cliente.",
"primitive": "RELIABILITY",
"complexity": "medium",
"score_cost": 0.2,
"description": "Un cliente reportó un retraso en el pago, mencionando problemas con su banco en Alemania. Esto puede afectar la confianza en la fiabilidad de su servicio.",
"intensity_score": 3
}
],
"domain_overview": "El negocio muestra un sólido desempeño en la atención al cliente, con un 98% de satisfacción en el trato y el proceso. Sin embargo, el valor percibido y la equidad de precios presentan áreas de mejora, lo que sugiere una desconexión entre la experiencia del cliente y la percepción del valor ofrecido.",
"review_evidence": [
{
"review_id": "demo-rev-001",
"author": "María G.",
"rating": 5,
"date": "2025-11-14",
"full_text": "Excelente servicio desde el primer momento. Me atendieron con mucha amabilidad y rapidez. El proceso fue transparente y me dieron un precio justo por mi vehículo. Recomiendo totalmente esta empresa a cualquiera que busque un trato profesional y honesto.",
"classifications": [
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "mucha amabilidad", "anchor_start": 62, "anchor_end": 78 },
{ "primitive": "SPEED", "valence": "+", "anchor_text": "rapidez", "anchor_start": 81, "anchor_end": 88 },
{ "primitive": "TRANSPARENCY", "valence": "+", "anchor_text": "proceso fue transparente", "anchor_start": 93, "anchor_end": 117 },
{ "primitive": "VALUE_FOR_MONEY", "valence": "+", "anchor_text": "precio justo", "anchor_start": 132, "anchor_end": 144 }
]
},
{
"review_id": "demo-rev-002",
"author": "Carlos R.",
"rating": 4,
"date": "2025-10-22",
"full_text": "Buen servicio en general. El personal fue muy atento y el trámite fue bastante rápido. Lo único que me hubiera gustado es que la valoración fuera un poco más alta, pero entiendo que depende del mercado. Aún así, volveré a confiar en ellos.",
"classifications": [
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "personal fue muy atento", "anchor_start": 29, "anchor_end": 52 },
{ "primitive": "SPEED", "valence": "+", "anchor_text": "trámite fue bastante rápido", "anchor_start": 58, "anchor_end": 85 },
{ "primitive": "VALUE_FOR_MONEY", "valence": "-", "anchor_text": "valoración fuera un poco más alta", "anchor_start": 118, "anchor_end": 151 }
]
},
{
"review_id": "demo-rev-003",
"author": "Ana P.",
"rating": 5,
"date": "2025-09-05",
"full_text": "Me encantó la experiencia. Desde que entré me trataron genial. Todo fue súper rápido y profesional. El equipo realmente sabe lo que hace. Sin duda la mejor opción del mercado.",
"classifications": [
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "me trataron genial", "anchor_start": 42, "anchor_end": 61 },
{ "primitive": "SPEED", "valence": "+", "anchor_text": "súper rápido", "anchor_start": 72, "anchor_end": 84 },
{ "primitive": "COMPETENCE", "valence": "+", "anchor_text": "equipo realmente sabe lo que hace", "anchor_start": 102, "anchor_end": 135 }
]
},
{
"review_id": "demo-rev-004",
"author": "Javier M.",
"rating": 1,
"date": "2025-08-18",
"full_text": "Muy decepcionado. La tasación online prometía un precio mucho más alto del que luego ofrecieron en persona. Sentí que perdí el tiempo. La atención fue correcta pero el resultado final no me convenció nada.",
"classifications": [
{ "primitive": "VALUE_FOR_MONEY", "valence": "-", "anchor_text": "precio mucho más alto del que luego ofrecieron", "anchor_start": 47, "anchor_end": 94 },
{ "primitive": "RELIABILITY", "valence": "-", "anchor_text": "perdí el tiempo", "anchor_start": 107, "anchor_end": 122 },
{ "primitive": "STAFF_ATTITUDE", "valence": "±", "anchor_text": "atención fue correcta", "anchor_start": 127, "anchor_end": 148 }
]
},
{
"review_id": "demo-rev-005",
"author": "Laura S.",
"rating": 5,
"date": "2025-07-30",
"full_text": "Fantástico. Nos trataron de maravilla y nos explicaron todo paso a paso. El pago se realizó al momento, sin complicaciones. Gran experiencia de principio a fin.",
"classifications": [
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "trataron de maravilla", "anchor_start": 17, "anchor_end": 38 },
{ "primitive": "TRANSPARENCY", "valence": "+", "anchor_text": "explicaron todo paso a paso", "anchor_start": 45, "anchor_end": 72 },
{ "primitive": "SPEED", "valence": "+", "anchor_text": "pago se realizó al momento", "anchor_start": 77, "anchor_end": 103 }
]
},
{
"review_id": "demo-rev-006",
"author": "Pedro L.",
"rating": 5,
"date": "2025-06-12",
"full_text": "Un 10. Personal amable, proceso rápido y sin sorpresas. Me ofrecieron exactamente lo que habíamos acordado por teléfono. Muy profesionales en todo momento.",
"classifications": [
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "Personal amable", "anchor_start": 7, "anchor_end": 22 },
{ "primitive": "SPEED", "valence": "+", "anchor_text": "proceso rápido", "anchor_start": 24, "anchor_end": 38 },
{ "primitive": "RELIABILITY", "valence": "+", "anchor_text": "exactamente lo que habíamos acordado", "anchor_start": 68, "anchor_end": 104 },
{ "primitive": "COMPETENCE", "valence": "+", "anchor_text": "Muy profesionales", "anchor_start": 121, "anchor_end": 139 }
]
},
{
"review_id": "demo-rev-007",
"author": "Elena V.",
"rating": 5,
"date": "2025-05-20",
"full_text": "Vendí mi coche en menos de una hora. Increíble lo rápido y fácil que fue todo. El chico que me atendió fue encantador y muy transparente con las condiciones. Repetiría sin dudarlo.",
"classifications": [
{ "primitive": "SPEED", "valence": "+", "anchor_text": "menos de una hora", "anchor_start": 19, "anchor_end": 36 },
{ "primitive": "STAFF_ATTITUDE", "valence": "+", "anchor_text": "chico que me atendió fue encantador", "anchor_start": 80, "anchor_end": 115 },
{ "primitive": "TRANSPARENCY", "valence": "+", "anchor_text": "muy transparente con las condiciones", "anchor_start": 118, "anchor_end": 154 }
]
}
],
"score_breakdown": {
"volume": 15.0,
"momentum": 0.0,
"intensity": 14.6,
"rating_quality": 29.3,
"sentiment_depth": 24.3
},
"matrix_narrative": "El análisis muestra un cuadrante urgente con alta frecuencia y baja satisfacción en 'Valor por Dinero', que incluye 5 menciones negativas sobre tasaciones bajas. Las quejas sobre la actitud del personal también requieren atención, aunque presentan una alta satisfacción general. Las áreas de menor frecuencia, como 'Fiabilidad', indican puntos ciegos que podrían beneficiarse de una mayor atención, dado su bajo número de menciones.",
"potential_rating": 5.0,
"rating_narrative": "La puntuación de reputación de 83/100 refleja una fuerte satisfacción entre los clientes, con 581 de 596 reseñas positivas. Sin embargo, la polarización se evidencia en las menciones negativas sobre la actitud del personal y la valoración del vehículo, lo que sugiere una brecha entre la experiencia del cliente y las expectativas. La tasa de respuesta del propietario es alta, pero la falta de momentum indica que hay oportunidades para mejorar la percepción del valor y la atención al cliente.",
"reputation_score": 83.3,
"themes_narrative": "Los clientes mencionan con mayor frecuencia la actitud del personal, con 462 menciones positivas y 9 negativas. La velocidad del proceso también destaca, con 129 comentarios positivos, mientras que la percepción del valor por dinero muestra una división, con 5 menciones negativas. La competencia del equipo se aprecia en 47 comentarios positivos, pero hay un pequeño número de quejas sobre la falta de atención y efectividad. Los clientes valoran positivamente el trato, pero hay preocupaciones sobre las tasaciones y el proceso de valoración.",
"trends_narrative": "Las calificaciones han mostrado una ligera mejoría en general, con un aumento notable en Q3 2024 y Q4 2025. Sin embargo, Q1 2026 presenta una caída, lo que sugiere una posible inestabilidad. La satisfacción en el trato y la rapidez en el proceso son los principales impulsores de la mejora, mientras que la percepción del valor por el dinero ha mostrado variaciones. Es importante observar la tendencia en el valor, que ha fluctuado y podría requerir atención.",
"staff_leaderboard": [],
"seasonal_narrative": "El patrón estacional muestra un rendimiento constante a lo largo del año, con calificaciones más altas en Q3. Esto es típico en el sector, pero la ligera caída en Q1 podría merecer una revisión para asegurar que no se convierta en un patrón problemático.",
"rating_distribution": {
"1": 10,
"2": 3,
"3": 2,
"4": 12,
"5": 569
},
"domain_sentiment_narrative": "La tendencia en el sentimiento de los dominios muestra una alta satisfacción en el trato y el proceso, pero el valor ha tenido altibajos, cayendo a un 60% positivo en Q2 2024 antes de mejorar nuevamente. Esta variabilidad en el valor podría ser un foco de atención.",
"rating_evolution_narrative": "La evolución de las calificaciones indica un aumento general, alcanzando un pico en Q3 2024. Sin embargo, la caída en Q1 2026 con un promedio de 4.75 sugiere una posible preocupación que necesita ser investigada."
};