diff --git a/src/components/OrganicoDashboard.tsx b/src/components/OrganicoDashboard.tsx
index 86e651d..9d6da40 100644
--- a/src/components/OrganicoDashboard.tsx
+++ b/src/components/OrganicoDashboard.tsx
@@ -171,7 +171,9 @@ export default function OrganicoDashboard({
}, [load]);
useEffect(() => {
- const first = ORGANICO_SECTIONS.find((s) => s.pillar === pillar);
+ const first = ORGANICO_SECTIONS.find(
+ (s) => s.pillar === pillar && !s.soon
+ );
if (first) setSectionId(first.id);
}, [pillar]);
@@ -214,7 +216,9 @@ export default function OrganicoDashboard({
const maxSessions = Math.max(1, ...seoDaily.map((d) => d.sessions));
const section = useMemo(
- () => ORGANICO_SECTIONS.find((s) => s.id === sectionId)!,
+ () =>
+ ORGANICO_SECTIONS.find((s) => s.id === sectionId) ||
+ ORGANICO_SECTIONS.find((s) => s.pillar === 'seo' && !s.soon)!,
[sectionId]
);
const navGroups = useMemo(() => groupsForPillar(pillar), [pillar]);
@@ -406,11 +410,11 @@ export default function OrganicoDashboard({
}
/>
- Selecciona un cliente para abrir su suite SEO / GEO.
+ Selecciona un cliente para ver su SEO.
);
@@ -429,7 +433,7 @@ export default function OrganicoDashboard({
@@ -438,20 +442,10 @@ export default function OrganicoDashboard({
onChange={(p) => setPillar(p)}
size="sm"
options={[
- { id: 'geo', label: 'GEO · IA' },
{ id: 'seo', label: 'SEO' },
+ { id: 'geo', label: 'GEO · IA' },
]}
/>
- {isAgency ? (
- setShowCapture((v) => !v)}
- className="inline-flex items-center gap-1.5 text-xs font-semibold px-3 py-1.5 rounded-lg bg-brand-500 text-white hover:bg-brand-600"
- >
-
- {pillar === 'geo' ? 'Medición GEO' : 'Cargar día SEO'}
-
- ) : null}
}
/>
@@ -473,15 +467,6 @@ export default function OrganicoDashboard({
{[
{ title: 'Search Console', row: gsc },
{ title: 'GA4', row: ga4 },
- {
- title: 'GEO / IA',
- row: latestGeo
- ? {
- status: 'connected',
- external_account_id: latestGeo.label || 'Medición activa',
- }
- : { status: 'disconnected', external_account_id: null },
- },
].map((c) => (
{c.row?.external_account_id || 'Sin vincular'}
- {isAgency && tenantId && c.title !== 'GEO / IA' ? (
+ {isAgency && tenantId ? (
))}
+
+
+
GEO / IA
+
+ Próximamente
+
+
+
+ Visibilidad de marca en ChatGPT, Gemini y AI Overviews.
+
+
- {/* Capture forms */}
- {isAgency && showCapture && pillar === 'seo' && (
+ {pillar === 'geo' ? (
+
+
+ Próximamente disponible
+
+
GEO · visibilidad en IA
+
+ Aquí mediremos cómo aparece la marca en respuestas de ChatGPT,
+ Gemini y AI Overviews (Share of Model, citas, competidores). SEO
+ (Google) sigue en la pestaña SEO, con datos de Search Console y
+ Analytics.
+
+
+ ) : (
+ <>
+ {isAgency && showCapture && (
void saveOrganicDay()}
/>
)}
- {isAgency && showCapture && pillar === 'geo' && (
- void saveGeo()}
- />
- )}
{/* Shell: nav + content */}
- {pillar === 'geo' ? (
- <>
- Análisis de IA
- >
- ) : (
- <>
- Suite SEO
- >
- )}
+ Suite SEO
{navGroups.map((g) => (
@@ -948,7 +942,7 @@ export default function OrganicoDashboard({
- Prioridades claras · {pillar === 'geo' ? 'GEO' : 'SEO'}
+ Prioridades claras · SEO
Una por línea. Lo que hay que mejorar primero.
@@ -989,10 +983,7 @@ export default function OrganicoDashboard({
type="button"
disabled={saving}
onClick={() => {
- const def =
- pillar === 'geo'
- ? DEFAULT_EXPERT_PRIORITIES.geo
- : DEFAULT_EXPERT_PRIORITIES.seo;
+ const def = DEFAULT_EXPERT_PRIORITIES.seo;
setPrioritiesText(def.join('\n'));
}}
className="ml-2 inline-flex items-center gap-1.5 text-xs font-semibold px-3 py-1.5 rounded-lg border border-gray-200 text-gray-700 hover:bg-gray-50"
@@ -1059,9 +1050,9 @@ export default function OrganicoDashboard({
Competencia de dominio, keyword gap y backlinks no salen de
- GSC/GA4. Hay que conectar Ahrefs/Semrush (o importar CSV) para
- alimentar este panel. Mientras tanto usa las secciones con datos
- reales: visión general, rankings, keywords y páginas.
+ Search Console ni GA4. Cuando conectemos Ahrefs o Semrush, esta
+ vista se activará. El SEO con datos reales está en Visión
+ general, Keywords y Páginas.
{section.actions.map((a) => (
@@ -1100,6 +1091,8 @@ export default function OrganicoDashboard({
)}
+ >
+ )}
);
}
diff --git a/src/lib/organic.ts b/src/lib/organic.ts
index 80457a7..908fbb7 100644
--- a/src/lib/organic.ts
+++ b/src/lib/organic.ts
@@ -439,13 +439,10 @@ export const ORGANICO_SECTIONS: OrganicoSection[] = [
group: 'Rendimiento del sitio',
label: 'Rastreo de posición',
blurb:
- 'Sí: posición media diaria en organic_daily (histórico nuestro) + ranking actual de queries GSC. No es un rank tracker de 10k KW tipo Semrush; es lo que GSC reporta para tus impresiones reales.',
- actions: [
- 'Mirar tendencia de posición media',
- 'Atacar queries en pos. 4–15 (quick wins)',
- 'Ampliar cartera vía contenido',
- ],
+ 'Cubierto en Palabras clave (posición GSC) y Visión general (tendencia diaria).',
+ actions: [],
live: 'seo-rankings',
+ soon: true,
},
{
id: 'seo-organic',
@@ -453,13 +450,10 @@ export const ORGANICO_SECTIONS: OrganicoSection[] = [
group: 'Tráfico y páginas',
label: 'Posicionamiento orgánico',
blurb:
- 'Evolución de clics e impresiones (visibilidad). Distinto de «Páginas principales».',
- actions: [
- 'Leer tendencia MoM de clics',
- 'Cruzar con campañas de contenido',
- 'Alertar caídas bruscas',
- ],
+ 'Misma serie de clics/impresiones que Visión general. Se unifica ahí.',
+ actions: [],
live: 'seo-trend',
+ soon: true,
},
{
id: 'seo-pages',
@@ -495,13 +489,10 @@ export const ORGANICO_SECTIONS: OrganicoSection[] = [
group: 'Keywords',
label: 'Organic Traffic Insights',
blurb:
- 'Cruce GSC (páginas) + GA4 (sesiones orgánicas / landings) para ver qué rankea y qué convierte.',
- actions: [
- 'Comparar top pages GSC vs landings GA4',
- 'Detectar páginas con clics y poca conversión',
- 'Informar ROI orgánico',
- ],
+ 'El cruce GSC + GA4 ya está en Visión general (top queries, páginas y landings).',
+ actions: [],
live: 'seo-cross',
+ soon: true,
},
{
id: 'seo-competition',
@@ -540,7 +531,10 @@ export function sectionsForPillar(pillar: OrganicoPillar): OrganicoSection[] {
export function groupsForPillar(
pillar: OrganicoPillar
): { group: string; items: OrganicoSection[] }[] {
- const list = sectionsForPillar(pillar);
+ if (pillar === 'geo') return [];
+ const list = sectionsForPillar('seo').filter(
+ (s) => !s.soon || s.id === 'seo-competition'
+ );
const order: string[] = [];
const map = new Map();
for (const s of list) {
diff --git a/src/lib/tenant-modules.ts b/src/lib/tenant-modules.ts
index 67c752d..e5f2b4f 100644
--- a/src/lib/tenant-modules.ts
+++ b/src/lib/tenant-modules.ts
@@ -77,7 +77,7 @@ export const DASHBOARD_MODULES: DashboardModuleDef[] = [
href: '/dashboard/organico',
label: 'Orgánico',
providers: ['ga4', 'search_console'],
- hint: 'SEO (GSC/GA4) + GEO (visibilidad IA)',
+ hint: 'SEO (Search Console y GA4)',
},
{
id: 'activos',