# Contenido pilar para SEO (`credifygo.com`) — Track 3

- **Fecha:** 2026-07-30
- **Rama:** `feat/seo-contenido`
- **Estado:** diseño aprobado en brainstorming (modelo *páginas pilar* + arquitectura *Approach A*), pendiente de plan.
- **Track:** 3º de SEO. Sigue al Track 1 (SEO técnico on-page — PR #218) y Track 2 (medición: GSC + GA4 — PR #219). Ver [[credify-seo-infra]].

## Motivación

El SEO técnico ya está (meta/OG/JSON-LD/sitemap/GA4), pero **el contenido es lo que de verdad posiciona** a mediano plazo. `credifygo.com` hoy tiene una sola URL indexable (la landing). Necesitamos páginas que capturen la demanda de búsqueda real de quien administra un negocio de préstamos/microcrédito y aún no nos conoce, y que canalicen ese tráfico al trial (`/registro`).

## Decisiones (del brainstorming)

- **Modelo: páginas pilar (cornerstone) en lote único.** 5 páginas evergreen de alta calidad, publicadas en un solo entregable, bajo mantenimiento. No blog, no CMS (diferidos).
- **Autoría:** las redacta Claude; el usuario aprueba.
- **Geo: Colombia-first, LatAm-friendly.** Keywords en español pan-hispano; el foco Colombia vive en el copy (ejemplos, COP, contexto local), sin modismos que excluyan a prestamistas de México/Perú/Ecuador. El producto hoy es COP/Colombia — no se apunta a LatAm amplio todavía.
- **Restricción de marca (dura):** en ninguna página ni tag aparecen **"pagadiario"** ni **"gota a gota"** (connotación ilegal en Colombia). Posicionamiento como software legítimo. Ver [[credify-seo-infra]].
- **Arquitectura: Approach A** — layout Blade compartido + páginas estáticas. Descartados Markdown (dependencia + limita SEO fino) y CMS/Filament (YAGNI para un lote fijo que redacto yo).

## Mapa keyword → página

Estructura *hub & spoke*: 2 comerciales "cabeza", 1 puente, 1 imán informacional, 1 de conversión.

| # | Página / H1 | Keyword primaria | Keywords secundarias | Intención | Slug |
|---|---|---|---|---|---|
| 1 | Software para préstamos y microcrédito | `software para préstamos`, `software para prestamistas` | programa para préstamos, software de créditos, sistema para prestamistas, software para casa de préstamos | Comercial (money page) | `/software-para-prestamos` |
| 2 | Software de cobranza y recaudo | `software de cobranza`, `app para cobros` | app para cobradores, programa de cobranza, control de recaudo, app para cobrar créditos | Comercial (workflow cobrador) | `/software-de-cobranza` |
| 3 | Gestión y control de cartera de créditos | `gestión de cartera de créditos`, `control de cartera` | cómo llevar la cartera, control de cartera vencida, indicadores de cartera, administración de cartera de préstamos | Puente | `/gestion-de-cartera` |
| 4 | Cómo administrar un negocio de préstamos | `cómo administrar un negocio de préstamos` | cómo organizar un negocio de préstamos, cómo llevar las cuentas de préstamos, cómo controlar los préstamos que hago | Informacional (imán top-funnel) | `/como-administrar-negocio-de-prestamos` |
| 5 | Del Excel a una app para tus préstamos | `control de préstamos en Excel`, `plantilla préstamos Excel` | cómo llevar préstamos en Excel, alternativa a Excel para créditos, app en vez de Excel | Comparación (alta conversión) | `/control-de-prestamos-excel` |

**Lógica del funnel:** #4 es el hub informacional (enlaza a #1/#2/#3/#5 y a `/registro`); #1 y #2 son las money pages; #5 captura el segmento que hoy lleva sus préstamos en Excel y posiciona la app como el upgrade. La landing `/` sigue siendo el hub comercial.

**Nota de volúmenes:** targets priorizados por **intención**, no por volúmenes de una herramienta (aún sin datos de GSC/Ahrefs). En 2-4 semanas GSC mostrará qué consultas ya traen impresiones → se refina (añadir/ajustar páginas con datos reales).

## Arquitectura

### Archivos

```
resources/views/
  layouts/public.blade.php                 NUEVO  <head> + GA + @vite + <style> + slots SEO + <body> + nav/footer
  components/
    public-nav.blade.php                   NUEVO  navbar extraído de welcome  (<x-public-nav/>)
    public-footer.blade.php                NUEVO  footer extraído + columna "Recursos"
  content/
    software-para-prestamos.blade.php      NUEVO  #1
    software-de-cobranza.blade.php         NUEVO  #2
    gestion-de-cartera.blade.php           NUEVO  #3
    como-administrar-negocio-de-prestamos.blade.php  NUEVO  #4
    control-de-prestamos-excel.blade.php   NUEVO  #5
  welcome.blade.php                        REFACTOR  pasa a @extends('layouts.public')
app/Http/Controllers/ContentController.php NUEVO  método(s) que renderizan cada pilar con su $schema JSON-LD
routes/web.php                             MODIFICAR  grupo de 5 rutas con slug limpio
public/sitemap.xml                         MODIFICAR  +5 URLs
tests/Feature/ContentPagesTest.php         NUEVO  smoke + guards SEO/marca
CHANGELOG.md                               MODIFICAR
```

### Layout compartido (`layouts/public.blade.php`)

Extrae el "chrome" hoy embebido en `welcome.blade.php`:
- `<head>`: charset, viewport, snippet GA (`gtag.js` `G-2S01G726KE`), `theme-color`, favicon, `@vite(['resources/css/app.css'])`, el bloque `<style>` inline (animaciones, `.glass`, `.bento`, etc.).
- Slots SEO **por página**: `@yield('title')`, `@yield('meta')` (description + canonical + OG + Twitter), y `@stack('jsonld')` para el bloque JSON-LD.
- `<body class="bg-[#04130e] text-slate-100 ...">` con `<x-public-nav/>`, `@yield('content')`, `<x-public-footer/>`.

El **sales-bot** (`partials.sales-bot`) queda **solo en la landing** (se incluye dentro del `@section('content')` de welcome), no en las páginas de contenido — éstas usan bloques CTA inline a `/registro`.

### Refactor de la landing

`welcome.blade.php` deja de ser standalone: su head/style/nav/footer salen al layout; conserva sus secciones SEO propias (title/description/canonical/OG + los 3 JSON-LD Org/SoftwareApp/FAQ, que **siguen envueltos en `@verbatim`** como están hoy) y su cuerpo (hero → … → CTA + sales-bot) dentro de `@section('content')`. Beneficio: una sola fuente de verdad para nav/footer.

**Riesgo:** es un archivo de 877 líneas con tema oscuro y animaciones. Se verifica que renderiza **idéntica** (screenshot antes/después + `ExampleTest` 200) antes de dar por buena la extracción.

### Rutas

Grupo nuevo en `routes/web.php` (antes del catch-all de `/pwa`):

```php
Route::controller(ContentController::class)->group(function () {
    Route::get('/software-para-prestamos', 'softwarePrestamos')->name('content.software-prestamos');
    Route::get('/software-de-cobranza', 'softwareCobranza')->name('content.software-cobranza');
    Route::get('/gestion-de-cartera', 'gestionCartera')->name('content.gestion-cartera');
    Route::get('/como-administrar-negocio-de-prestamos', 'comoAdministrar')->name('content.como-administrar');
    Route::get('/control-de-prestamos-excel', 'excel')->name('content.excel');
});
```

## SEO por página

Cada pilar define:
- `<title>` propio (keyword-forward, < 60 car.), `meta description` (< 155 car., con keyword + gancho + Colombia).
- **`canonical` self** (`https://credifygo.com/<slug>`).
- **OG + Twitter**: title/description propios, `og:url` self, `og:image` = `og-image.png` compartido (v1), `og:type=article`.
- **JSON-LD**: `Article` (o `TechArticle`) + `BreadcrumbList` (+ `FAQPage` donde la página tenga FAQ).

**Construcción del JSON-LD (mejora vs. landing):** se arma como **array PHP en el `ContentController` → `{!! json_encode($schema, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE) !!}`** en la vista/layout. Así `@context`/`@type` viven en strings PHP y **no** tocan el parser de Blade → **no requiere `@verbatim`** y no puede romper el build. (Evita el bug documentado en [[credify-blade-verbatim-gotcha]].)

## Enlazado interno y descubribilidad

- **Hub & spoke:** #4 enlaza a #1/#2/#3/#5; las money pages cruzan entre sí; **todas incluyen un bloque CTA a `/registro`**.
- **Breadcrumb** visible por página (`Inicio › <página>`) + su `BreadcrumbList` en JSON-LD.
- **Nav "Recursos"** (dropdown) en el navbar compartido + **columna "Recursos" en el footer** con las 5 páginas → mejora crawl y reparte autoridad. Como el nav es compartido, aparece también en la landing.
- **`sitemap.xml`:** añadir las 5 URLs (`priority` 0.8, `changefreq` monthly, `lastmod` 2026-07-30).

## Contenido (lo redacta Claude)

Por página: **~1.000–1.800 palabras**, estructura escaneable (H2/H3), patrón: intro → problema del lector → cómo el software lo resuelve → features mapeadas a la keyword → **FAQ de 3-5 preguntas** (habilita rich snippet vía `FAQPage`) → CTA a `/registro`. Ejemplos **Colombia-first** (montos en COP, contexto local) sin modismos que excluyan LatAm. Tono: claro, práctico, sin jerga; alineado con el copy de la landing. **Cero "pagadiario"/"gota a gota".**

## Verificación

- **Test automatizado nuevo `tests/Feature/ContentPagesTest.php`:** para cada una de las 5 rutas → assert **200**, presencia de `<title>`, `rel="canonical"` self, y un bloque `application/ld+json`; y un **assert de marca**: el HTML **no** contiene "pagadiario" ni "gota a gota" (guard permanente, case-insensitive). Incluir también `/` en el guard de marca.
- `ExampleTest` sigue verde (landing renderiza tras el refactor).
- **PHPStan** `analyse --level=5 app/` limpio (el `ContentController` es código nuevo) — preflight antes de push. Ver [[credify-ci-phpstan-preflight]].
- Render + **screenshots** de las 5 páginas + landing (idéntica) en 375/768/1280, claro/oscuro (el sitio es dark fijo).
- Post-deploy: JSON-LD de cada página validado en Rich Results Test; `curl` confirma title/canonical/JSON-LD y 0 ocurrencias de marca prohibida en prod.

## Deploy

**Full (Blade + assets)** — a diferencia de Track 1/2 (Blade-only). Las páginas nuevas pueden introducir **utilidades Tailwind** ausentes en el bundle actual; el content-scan de Tailwind v4 las purga si no se rebuildea. Por tanto:
1. `npm run build` en WSL → `public/build` + `public/pwa-sw.js`.
2. scp de `build` + `pwa-sw.js` a prod `/tmp/*.new`, **swap atómico** (build.staging → build, chown www-data). Ver [[credify-prod-vm]].
3. `git pull --ff-only origin main` + `php artisan optimize:clear && optimize` + `sudo -n systemctl reload php8.3-fpm`.
4. Verificación en prod (curls + Rich Results).

## No-objetivos / límites

- **No** blog / CMS / Markdown (diferido; si llega, se monta sobre este mismo layout).
- **No** 6ª página (cooperativas/fondos de empleados) — otro ICP; fuera salvo pedido explícito.
- **No** OG image por página (v1 reusa `og-image.png` compartida).
- **No** sitemap dinámico (estático basta para 7 URLs).
- **No** lead magnet (plantilla Excel gratis para #5) — se decide aparte.
- **No** tocar backend de negocio, PWA, ni Filament. Solo capa pública web + rutas + un controlador de contenido.

## Riesgos / gotchas

- **Regresión de la landing** por el refactor a layout: mitigar con screenshot antes/después + `ExampleTest`.
- **Tailwind v4 content-scan (CLAUDE.md):** confirmar que el glob de contenido cubre `resources/views/**/*.blade.php` (incluye `layouts/`, `components/`, `content/`) para que las utilidades nuevas no se purguen; verificar tras `npm run build`.
- **Blade parser:** el JSON-LD por `json_encode` evita el problema de `@context`; **no** meter `@`/`{{ }}` crudos en el copy sin escapar. Ver [[credify-blade-verbatim-gotcha]].
- **Canonical/duplicados:** cada página con canonical self; sin parámetros ni variantes que generen duplicados.
- **Rendimiento (LCP):** las páginas de contenido heredan el `<style>` pesado de la landing pero no necesitan sus animaciones; mantenerlas ligeras.

## Fuera de alcance (próximos tracks)

- **Track 4 — off-page/ads:** Google Ads (cuenta GA4 lista para enlazar), backlinks, Perfil de Empresa de Google.
- **Contenido continuo (blog):** si se decide, su propio spec sobre este layout.
- **Refinamiento por datos de GSC** (2-4 semanas): ajustar/añadir páginas según consultas reales.
