# Esquema de columnas · v1.0

> Observatorio de Precios Web España 2026 · v1.0 · Licencia CC BY 4.0 · Aura Design (Cosmolabs OÜ)

Este es el contrato del fichero. La versión 1.0 congela estos nombres: si cambian, cambia la versión mayor.

| Columna | Tipo | Valores | Nota |
|---|---|---|---|
| `id_registro` | texto | `OBS-2026-00001` | Estable entre versiones |
| `id_peticion` | texto | `PET-0001` | Agrupa presupuestos del mismo proyecto |
| `fecha_presupuesto` | fecha | `AAAA-MM-DD` | Fecha de emisión, no de recogida |
| `ccaa` | controlado | 17 comunidades + Ceuta + Melilla + `no_consta` | Del cliente, no del proveedor |
| `tipo_proveedor` | controlado | `estudio` · `agencia` · `freelance` · `plataforma` · `equipo_interno` | |
| `tamano_proveedor` | controlado | `1` · `2-5` · `6-15` · `16-50` · `>50` | Personas |
| `tipo_cliente` | controlado | `autonomo` · `micropyme` · `pyme` · `startup` · `corporativo` · `sector_publico` | |
| `sector_cliente` | controlado | 14 valores (`hosteleria`, `salud`, `industria`, `servicios_profesionales`…) | |
| `tipo_proyecto` | controlado | `landing` · `web_corporativa` · `ecommerce` · `producto_digital` · `rediseno` · `marca_y_web` | Eje principal de agregación |
| `plataforma` | controlado | `wordpress` · `constructor` · `headless` · `a_medida` · `shopify` · `no_code` · `no_consta` | |
| `num_plantillas` | entero | ≥ 1 | Plantillas de página, no URLs |
| `idiomas` | entero | ≥ 1 | |
| `incluye_branding` | booleano | `si` · `no` | |
| `incluye_copy` | booleano | `si` · `no` | Redacción de textos |
| `incluye_fotografia` | booleano | `si` · `no` | |
| `incluye_migracion_seo` | booleano | `si` · `no` | Redirecciones y plan de migración |
| `nivel_accesibilidad` | controlado | `no_consta` · `sin_compromiso` · `wcag_aa_parcial` · `wcag_aa` | |
| `importe_sin_iva_eur` | decimal | ≥ 0 | Normalizado a sin IVA |
| `iva_declarado_en_presupuesto` | booleano | `si` · `no` | Si el documento original lo decía |
| `mantenimiento_mensual_sin_iva_eur` | decimal | ≥ 0, `null` si no consta | |
| `hosting_incluido_meses` | entero | ≥ 0 | |
| `coste_36m_sin_iva_eur` | decimal | calculado | Alta + 36 cuotas + recurrentes declarados |
| `plazo_semanas` | entero | ≥ 1, `null` si no consta | Comprometido en el documento |
| `soporte_incluido_dias` | entero | ≥ 0 | Tras el lanzamiento |
| `cesion_derechos_codigo` | controlado | `total` · `parcial` · `licencia_uso` · `no_consta` | |
| `entrega_codigo_fuente` | booleano | `si` · `no` · `no_consta` | |
| `fuente_dato` | controlado | `presupuesto_recibido` · `precio_publico` · `declarado_proveedor` · `proyecto_aura` | |
| `verificado` | controlado | `documento` · `declaracion` | |
| `atipico` | booleano | `si` · `no` | Fuera de 1,5 × RIC de su celda |
| `version_dataset` | texto | `1.0` | |
| `notas` | texto libre | ≤ 240 caracteres | Anonimizadas |

Las columnas `cesion_derechos_codigo` y `entrega_codigo_fuente` no están ahí por completismo. Son las dos que más veces vuelven a mordernos en un rescate, y ninguna de las páginas que publican rangos las cruza con el precio.
