# Auditoría SEO + Plan de acción — sysfarma.pe

> Sitio de marketing público (no el ERP/app de tenant). Auditoría: **2026-06-21**.
> Fuentes: Google Search Console (token OAuth en `Documents/gsc-token.json`, propiedad `sc-domain:sysfarma.pe`) + crawl + análisis de código en este repo.
> El sitio de marketing **vive en este repo** (layout `system`, público), NO es un proyecto aparte.

---

## 0. TL;DR

- Sitio **nuevo**, explotó en visibilidad en **junio 2026** (impresiones de ~74/sem a ~1,500/sem). Está en **fase de evaluación de Google** (dominio sin autoridad/backlinks).
- **Gana tráfico informativo del blog** (FEFO/BPA/DIGEMID) — mucha impresión, casi 0 clic (atascado pos 6-10), y son **buscadores de definiciones, no compradores**.
- **Pierde las keywords comerciales** (las que traen clientes): `software para farmacia` pos ~40, `sistema para boticas` pos ~60 (página 4-6). `/sistema-para-boticas` y `/programa-para-farmacia` ni existen (404).
- **Técnico/on-page: muy bueno** (schema, sitemap, robots con bots IA, programático). El problema es **autoridad + arquitectura de enlaces + canibalización**, no contenido fino.

---

## 1. Estado real (Google Search Console)

**Totales (últ. 28 días):** 81 clics · 3,614 impresiones · CTR 2.2% · **posición promedio 7.4**.
(Casi todo el tráfico de 6 meses ocurrió en el último mes → sitio en despegue.)

**Tendencia semanal:** mayo ~1-6 clics/sem → junio 22, 31, 16 clics/sem (impresiones ~1,000-1,500/sem). Crecimiento fuerte.

**Top keywords por impresiones (visibilidad):** dominan informativas con **0 clics**:
`bpa digemid` (162 impr, pos 8.8, 0 clic), `que es fefo` (87, 0 clic), `fifo y fefo en farmacia`, `sistema fefo en farmacia`, muchas variantes FEFO/BPA en pos 6-10 con 0 clic. Marca `sysfarma` pos 2.9 (40% CTR). Comercial `sistema para boticas` pos ~60.

**Top páginas:** `/` (27 clic), `/blog/digemid-bpa-almacenamiento-farmacia` (**1,241 impr / 9 clic, pos 7.5**), `/blog/fefo-en-farmacias` (864 impr / 8 clic), `/blog/boletas-medicamentos-peru` (418/7, pos 4.5), `/precios` (pos 3.2), `/software-para-farmacias` (**pos 13.2, página 2** — la página de dinero principal).

**Dispositivos:** Mobile 44 clic / 2.9% CTR · Desktop 42 clic / 1.9% CTR.

**Diagnóstico de posicionamiento (4 causas):**
1. **Canibalización** de ~19 páginas-ciudad casi idénticas (85% plantilla) por "software para farmacia".
2. **Dominio nuevo sin backlinks** (sandbox/evaluación).
3. **Enlazado interno débil** — anchor "Software" genérico; el blog (pág. 1) NO enlaza a las comerciales.
4. **Keywords objetivo ausentes** del texto visible de la página estrella.

**Competencia (mercado saturado):** directorios (comparasoftware.pe, Capterra) + competidores establecidos (NEOPharm +500 clientes, Medisoft +15 años, Farmasystem, Farmasis, OKFAC, PANCA, Botikapp, Adiasoft) dominan las cabezas comerciales. **Sysfarma NO aparece** en "mejor software para farmacia Perú"; solo rankea **lateral** (vs-farmasystem, alternativas).

**AEO / IA:** robots permite GPTBot/Perplexity, hay schema SoftwareApplication + FAQPage. Pero la IA cita los listicles/competidores donde sysfarma no está → **hoy no es la respuesta por defecto**. Prueba social débil: schema declara **3 reviews 5/5** (incoherente con "1,200 farmacias", riesgo de penalización).

---

## 2. Arquitectura del código SEO (cómo está construido)

**Dos pipelines de renderizado distintos** (¡importante!):

| Página | Ruta | Pipeline |
|---|---|---|
| **Home `/`** | `routes/web.php:897` → `view('system.layouts.auth')` | **`resources/views/system/layouts/auth.blade.php`** — HTML 100% estático, `<head>` + JSON-LD propios. **NO usa config/seo.php** |
| **Landings / ciudades / vs-** | `routes/web.php:898-929` → `PublicSiteController::landing($slug)` | `app/Support/SeoMeta.php` (arma meta + JSON-LD) → `config/seo.php['pages'][$slug]` → **`landing_v2.blade.php`** |
| **Blog** | `routes/web.php` → `BlogController::show()` | `config/blog.php['posts']` → `BlogController` (arma meta+schema) → **`blog_post.blade.php`** extiende `public_layout.blade.php` |
| **Sitemap** | `routes/web.php:934` → `PublicSiteController@sitemap` | `SeoMeta::allPages()` (todo seo.php) + `/consultar-comprobante` + blog → `sitemap.blade.php` |
| **robots.txt** | estático | `public/robots.txt` (37 líneas) |

**Datos:** `config/seo.php` (1,752 líneas, key `pages`) y `config/blog.php` (4 posts). **Helper:** `app/Support/SeoMeta.php` (meta + JSON-LD de landings). **Controladores:** `app/Http/Controllers/System/PublicSiteController.php` (landings+sitemap), `BlogController.php` (blog).

**Generación de JSON-LD (landings):** `SeoMeta.php` → SoftwareApplication `:43-58`, keywords `:60-62`, aggregateRating `:64-73` (inactivo, ninguna página lo declara), BreadcrumbList `:78-96`, LocalBusiness/geo `:98-120`, FAQPage `:122-145`, `@graph` `:147-152`. Se imprime en `landing_v2.blade.php:24`.

### ⚠️ Gotchas (leer antes de tocar)
- **Código muerto:** la entrada `'home'` de `config/seo.php:13-74` y el branch `@if($seo['key']==='home')` de `landing_v2.blade.php:299-418` **no los invoca ninguna ruta** (la home real es `auth.blade.php`).
- **`/software-para-farmacias` tiene el body HARDCODEADO** en `landing_v2.blade.php:419-603` (branch `@elseif`). **Ignora** `benefits/features/faqs` de config para esa página. Para editar su texto se toca el blade, no el config.
- **Inconsistencia de FAQ (riesgo schema):** en `/software-para-farmacias` las FAQs **visibles** son 5 (hardcoded `landing_v2.blade.php:572-591`) pero el **FAQPage del schema** tiene 2 (`config/seo.php:103-112`) con texto distinto. Google exige que el FAQ del schema esté visible → sincronizar.
- **El blog escapa el HTML** (`blog_post.blade.php:175-224` usa `{{ }}`): no se pueden inyectar `<a>` en el cuerpo sin cambiar el blade o agregar un campo tipado. (Las ciudades SÍ usan `{!! !!}` en `landing_v2.blade.php:692`, por eso ya embeben links.)
- **Sitemap incluye TODO** `config/seo.php` automáticamente; **no filtra noindex** → una ciudad con `robots:noindex` igual aparecería en el sitemap (señal contradictoria).

---

## 3. Plan de acción priorizado → mapeado a código

### 🟢 QUICK WINS (esta semana — alto ROI, palanca = autoridad que ya existe)

**Q1. Enlazar el blog → páginas comerciales** (transfiere la autoridad del blog, que ya rankea pág. 1).
- Hoy el post solo tiene CTA a WhatsApp (`blog_post.blade.php:247-249`) y NINGÚN enlace contextual a producto.
- **Cómo:** opción recomendada = agregar campo tipado por sección en `config/blog.php` (ej. `'cta_box' => ['text','url'=>'/software-para-farmacias','label']`) + renderizarlo con `<a>` real en `blog_post.blade.php` (~después de `:224`, modelado como `.post-callout`/`.post-cta-box`). Alternativa rápida = cambiar `blog_post.blade.php:176` `{{ $p }}`→`{!! $p !!}` y meter `<a>` en los strings de config/blog.php.
- Sumar botón secundario a `/software-para-farmacias` junto al CTA WhatsApp (`blog_post.blade.php:243-251`).

**Q2. Anchor interno "Software" → "Software para farmacias".**
- `resources/views/system/partials/public_header.blade.php:4` → cambiar `'label' => 'Software'`. Un solo cambio cubre nav desktop+móvil.

**Q3. Meter keywords faltantes en el body de `/software-para-farmacias`** ("programa para farmacia" ×2, "sistema para boticas").
- Editar texto visible en `landing_v2.blade.php` (body hardcoded): candidatos `:426` (hero lead), `:466`/`:471`, `:486`, `:550-561` (segmentos), `:574` (FAQ).

### 🟡 MEDIANO (2-4 semanas)

**M1. Crear `/sistema-para-boticas`** (keyword comercial sin página, hoy 404).
- (a) Ruta en `routes/web.php` junto a `:898-902`.
- (b) Entrada en `config/seo.php['pages']['sistema-para-boticas']` (title/description/h1/hero/benefits/features/faqs/keywords/robots/priority). Título sugerido: `Sistema para Boticas en Perú: POS, SUNAT y FEFO desde S/69 | Sysfarma`.
- (c) Para que renderice con diseño completo: agregar `'sistema-para-boticas'` al `in_array([...])` de `landing_v2.blade.php:604`, **o** darle flag `comparison`/`geo`, **o** su propio `@elseif`. Si no, cae al branch minimalista `:737-887`.
- (d) Sitemap: **automático** (entra vía `SeoMeta::allPages()`). No tocar el controlador.
- Contenido único (no clonar la estrella): enfocar "botica" (regente, libro recetario, psicotrópicos).

**M2. Páginas-ciudad (canibalización + thin content).**
- Las 19 están en `config/seo.php` keys `farmacia-{ciudad}` (Arequipa `:393`, Lima `:1082`, etc.). ~70-80% boilerplate, ~20-30% local (los `extra_sections` de "contexto regional" sí varían).
- **Profundizar top 5** (Lima/Arequipa/Trujillo/Cusco/Chiclayo): ampliar `extra_sections[].paragraphs/items` con datos locales reales (distritos, DIRESA local, caso de cliente). Admiten HTML (`landing_v2.blade.php:692`).
- **Schema LocalBusiness ya existe** (`SeoMeta.php:98-120`, gated por `geo`); enriquecer `geo` con lat/long/postalCode si se quiere (hoy no se mapean `:107-112`).
- **Noindex selectivo de la cola** (Tumbes, Moquegua, etc.): `'robots' => 'noindex,follow'` en su entrada de config/seo.php (leído `SeoMeta.php:31`, impreso `landing_v2.blade.php:8`).
- **Si se noindexan, filtrarlas del sitemap**: agregar filtro en `PublicSiteController::sitemap()` (`:39-40`) — hoy NO existe; sin él, noindex + sitemap se contradicen.

**M3. Replicar "alternativa a [competidor]"** (activo probado — ya rankeás vs-farmasystem).
- Crear vs-Medisoft, vs-Botikapp, vs-Farmasis, vs-OKFAC, vs-NEOPharm. Mismo patrón que `/sysfarma-vs-farmasystem` (`routes/web.php:926`).

### 🔴 CONTINUO (el cuello de botella real)

**C1. Backlinks + alta en directorios** (comparasoftware.pe, Capterra/GetApp) — lo que la IA y los compradores citan. Sin esto, lo demás mejora pero no rompe el techo de dominio nuevo.

**C2. Arreglar la prueba social.** El `aggregateRating` 5/5 con 3 reviews está **hardcoded en `auth.blade.php:48-54`** (sin nodos Review ni testimonios visibles asociados → riesgo). Migrar a reviews verificables de terceros (Google Business, Capterra) coherentes con "1,200 farmacias".

### Pulido (impacto menor)
- **FAQ schema de software-para-farmacias:** sincronizar las 5 FAQs visibles con el schema (hoy 2). `config/seo.php:103-112` vs `landing_v2.blade.php:572-591`.
- **BreadcrumbList en el blog (gap):** el blog no lo emite (las landings sí). Agregar nodo en `BlogController.php:87-103`.
- **HowTo schema** en `/blog/boletas-medicamentos-peru` (es paso-a-paso → rich result).
- **Schema Product/Offer** en `/precios` con priceSpecification.
- Títulos del blog más afilados (números/dolor) para CTR — los posts SÍ tienen meta+schema (verificado; el CTR bajo es por posición 6-10, no por meta faltante).

---

## 4. Cómo medir / reconectar GSC

- Token OAuth: `C:/Users/Sistemax/Documents/gsc-token.json` (cliente en `gsc-oauth-client.json`). MCP: `mcp-gsc` (config en `.mcp.json`). Propiedad: `sc-domain:sysfarma.pe`.
- **Vence cada 7 días** porque la app OAuth está en modo **"Testing"** en Google Cloud → para que no pase: publicar la app a **"Production"** en Google Cloud Console → OAuth consent screen.
- Reconectar = re-correr el consent OAuth (regenera el token); reconectar el MCP en la UI no basta (recarga el server, no el token de Google).

---

## 5. Orden de ejecución sugerido
1. Q1 (blog→comercial) + Q2 (anchor) + Q3 (keywords) — esta semana.
2. M1 (`/sistema-para-boticas`) + M2 (top-5 ciudades + noindex cola + filtro sitemap).
3. M3 (páginas vs-competidores).
4. C1 (backlinks/directorios) + C2 (reviews) — continuo, es lo que destraba el techo.

> Todos los `file:line` son del estado al 2026-06-21; verificar si el código cambió.
