An open dataset of real web project quotes in Spain: columns, collection method, VAT treatment, n per cell, and a downloadable CSV with a license.
The Observatory is an open dataset of real web development quotes in Spain, published in CSV format along with its methodological sheet: number of cases, collection window, VAT treatment, and normalization rules. It is not an article with invented ranges: it is a table you can download, audit, and cite.
This is not an article. It is a table.
Search for "how much does a website cost in Spain" and you will find dozens of pages with ranges. Almost none state how many quotes they analyzed. None publish the months during which they were collected. Almost none clarify if the amounts include VAT. And none explain what they did with the 40,000 € quote that would have skewed the average.
We publish the data, not the conclusion. If our method is flawed, we want you to be able to prove it using our own file.
Standard industry practice: The industry publishes a round range ("between 1,500 € and 6,000 €") without an n, without a date, and without stating whether it includes VAT. It is unverifiable: no one can reproduce it, no one can refute it, and it serves only to justify any price.
Our criteria: We publish the complete CSV, the column schema, the normalization rules, and the count per cell. If a cell has fewer than 5 records, we mark it as insufficient rather than filling it with placeholder figures.
Exactly what the asset delivers
The download consists of four files:
| File | Format | Content |
|---|---|---|
observatorio-precios-web-es-2026-v1.csv | CSV, UTF-8, separator ;, decimal , | One record per normalized quote |
observatorio-precios-web-es-2026-v1.json | JSON | The same content, one object per record |
observatorio-esquema-v1.md | Markdown | Dictionary of columns and controlled values |
observatorio-metodo-v1.md | Markdown | Signed and dated methodological sheet |
Status: v1.0 being collected. All four files are already published with the final schema and 0 records; they will be filled when the sample closes.
The separator is a semicolon and the decimal is a comma because the file opens in Excel with Spanish regional settings without breaking a single column. It is a professional detail, not an aesthetic preference.
The six steps used for construction
| # | Phase | What we do | Deliverables |
|---|---|---|---|
| 01 | Listen | We start by asking, not proposing: what questions are on the mind of someone looking for a price. | Founder interviews · Review of the 20 currently ranking pages · Gap analysis |
| 02 | Define | We agree on what it means to win before touching a single column: that a freelancer can compare their quote with equivalent cases. | Unit of observation · Inclusion criteria · Minimum n threshold per cell |
| 03 | Map | We set the column schema and controlled values before collecting a single data point. | Versioned schema · Dictionary · Normalization rules |
| 04 | Design | The table must be readable on mobile. Grid, typographic rhythm, and filter hierarchy. | Views by project type · Insufficient cell states · Record sheet |
| 05 | Build | Collection, anonymization, validation, and calculation. All via script, nothing manual. | Schema validator · Percentile calculation · Outlier tagging |
| 06 | Launch and maintain | Publication with license, versioning, and changelog. Each revision preserves the previous ones. | CSV · JSON-LD · Version log |
Methodological Sheet v1.0
Sheet corresponding to version 1.0 of the dataset. Public figures verified on 27-08-2026. Our own v1.0 figures are still being collected: they will be published when the sample closes and frozen in the changelog.
Unit of observation
A record is a quote issued by a provider to a Spanish client for a web project, not a project or a client. If the same client requested three quotes for the same project, all three are included, linked by id_peticion. We measure what is requested in the market, not what is eventually signed.
n for version 1.0: being collected; to be published when the sample closes.
Collection window: being collected; to be published when the sample closes.
How it is collected
Four sources, and each record has its source declared in the fuente_dato column:
- Quotes shared by founders who consult us or respond to the public form. They are anonymized before entry.
- Public prices published by providers on their own websites. Captured with date and URL.
- Quotes declared by the provider in direct response to the form.
- Our own projects, marked as such. We do not hide them nor dilute them: they can be filtered out with a single click.
If we enter the table, we enter with our numbers upfront. Our public rates, including VAT: brand website (showcase or corporate), from 3,000 €; website with interactive experiences and automations, from 4,500 €; complete branding with proprietary CRM, AI, sales funnels, nurturing, and automations, from 9,000 €. Within the CSV, our records go through the same normalization rules as the others; on this page, we publish them as we charge them, with VAT included.
The industry advertises without VAT and the invoice arrives 21% higher; we state the final number. No surprise hours and no surprise VAT. And a clarification the table needs: our floor is 3,000 €, so the segments below that figure you see in the dataset are market data, not Aura offers.
A data point without a document is marked as verificado = declaracion, not as fact. The difference is in the table, not in a footnote.
Normalization rules
Without these seven rules, the table is just a list of anecdotes.
- All amounts are stored without VAT. If the original quote included VAT, it is divided by 1.21 and marked
iva_declarado_en_presupuesto = no. - The VAT applied is the general rate. Web design and development services are taxed at the general rate.
- Quotes in other currencies are converted at the exchange rate on the date of issuance, with the reference saved in
notas. - Setup is separated from recurring costs.
importe_sin_iva_euris the project;mantenimiento_mensual_sin_iva_euris the monthly fee. - Scope is counted by templates, not "pages". A 40-product page website using a single template counts as one template.
- Commercial discounts are noted separately and the registered amount is the final one.
- Outliers are not deleted: they are marked.
atipico = siwhen the value falls outside 1.5 times the interquartile range of its cell. You will see them and decide for yourself.
What is excluded
- Quotes prior to 01-01-2025, so the window does not carry prices from another cycle.
- Quotes from providers outside the EU invoicing a Spanish client, because fiscal treatment distorts comparison.
- Pure maintenance quotes with no associated project.
- Quotes that do not allow identification of minimum scope: project type, number of templates, and languages.
Each exclusion is counted in observatorio-metodo-v1.md. You will know how many records were entered and how many were dropped for each reason.
Which statistics are published
We publish median, P25, and P75, not mean. A mean with four corporate projects included does not describe anyone. The median does describe the central case, and the quartiles show the dispersion, which is exactly the information a quote needs to defend itself.
Publication threshold: no cell with fewer than 5 records displays a figure. It shows n insuficiente. We prefer an honest gap to a fragile number.
The column schema
This is the file contract. Version 1.0 freezes these names: if they change, the major version changes.
| Column | Type | Values | Note |
|---|---|---|---|
id_registro | text | OBS-2026-00001 | Stable across versions |
id_peticion | text | PET-0001 | Groups quotes for the same project |
fecha_presupuesto | date | AAAA-MM-DD | Date of issue, not collection |
ccaa | controlled | 17 autonomous communities + Ceuta + Melilla + no_consta | Client's, not provider's |
tipo_proveedor | controlled | estudio · agencia · freelance · plataforma · equipo_interno | |
tamano_proveedor | controlled | 1 · 2-5 · 6-15 · 16-50 · >50 | Headcount |
tipo_cliente | controlled | autonomo · micropyme · pyme · startup · corporativo · sector_publico | |
sector_cliente | controlled | 14 values (hosteleria, salud, industria, servicios_profesionales…) | |
tipo_proyecto | controlled | landing · web_corporativa · ecommerce · producto_digital · rediseno · marca_y_web | Main aggregation axis |
plataforma | controlled | wordpress · constructor · headless · a_medida · shopify · no_code · no_consta | |
num_plantillas | integer | ≥ 1 | Page templates, not URLs |
idiomas | integer | ≥ 1 | |
incluye_branding | boolean | si · no | |
incluye_copy | boolean | si · no | Text drafting |
incluye_fotografia | boolean | si · no | |
incluye_migracion_seo | boolean | si · no | Redirects and migration plan |
nivel_accesibilidad | controlled | no_consta · sin_compromiso · wcag_aa_parcial · wcag_aa | |
importe_sin_iva_eur | decimal | ≥ 0 | Normalized to ex-VAT |
iva_declarado_en_presupuesto | boolean | si · no | If the original document stated it |
mantenimiento_mensual_sin_iva_eur | decimal | ≥ 0, null if not stated | |
hosting_incluido_meses | integer | ≥ 0 | |
coste_36m_sin_iva_eur | decimal | calculated | Setup + 36 monthly fees + declared recurring |
plazo_semanas | integer | ≥ 1, null if not stated | Committed in document |
soporte_incluido_dias | integer | ≥ 0 | Post-launch |
cesion_derechos_codigo | controlled | total · parcial · licencia_uso · no_consta | |
entrega_codigo_fuente | boolean | si · no · no_consta | |
fuente_dato | controlled | presupuesto_recibido · precio_publico · declarado_proveedor · proyecto_aura | |
verificado | controlled | documento · declaracion | |
atipico | boolean | si · no | Outside 1.5 × IQR of its cell |
version_dataset | text | 1.0 | |
notas | free text | ≤ 240 chars | Anonymized |
The columns cesion_derechos_codigo and entrega_codigo_fuente are not there for completeness. They are the two that come back to bite us most often during rescues, and none of the pages publishing ranges cross-reference them with the price.
Results of v1.0
v1.0 results are still being collected: we will publish medians by line item when we close the sample, with each cell's n and the date window in plain view.
The same release will include the dispersion by segment, the differential by rights assignment, the proportion of quotes that do not mention VAT, the committed deadline and the 36-month cost.
If this version is released with fewer cases than expected, it will be released anyway, with the n clearly visible. A small, honest dataset is worth more than a large, invented one.
Public figures framing the table
Price cannot be read in isolation. These references, all verified today, travel within observatorio-metodo-v1.md so that anyone can place a quote against the real framework of the Spanish market.
The deadline for Kit Digital applications for segment III (companies with 0 to fewer than 3 employees) is marked as finalized on 31-10-2025 at 11:00 at the Red.es headquarters, consulted on 27-08-2026. If a provider quotes you today "with Kit Digital" without checking a previously granted voucher, that is a red flag, not an offer. The notas column captures the quotes in the dataset that mention it.
And a contradiction we do state aloud: price aggregators that cite payment gateway commissions often give a single figure, while Stripe's published rate distinguishes at least three tiers depending on the card origin. When two sources do not match, the dataset stores both with their URL and date. We do not average discrepancies.
How to contribute
The public form asks for eleven fields, none of which identify anyone:
- Project type and platform
- Number of page templates and languages
- Quote amount and whether the document stated "plus VAT"
- Monthly maintenance fee, if any
- Committed deadline in weeks
- What was included: branding, writing, photography, migration
- What the quote said regarding source code and files
- Provider type and size
- Client's autonomous community
- Month and year of issue
- Optional quote attachment, which is destroyed after extraction
We never publish the provider's or client's name. We do not compare companies: we compare conditions. If someone asks us to withdraw their contribution, it is removed and noted in the changelog without identifying it.
License, version, and how to cite
- License: CC BY 4.0. You can reuse, transform, and publish, citing the source.
- Versioning:
major.minor. Minor when records are added; major when the schema changes. - Suggested citation: Aura Design (Cosmolabs OÜ), "Observatorio de Precios Web España 2026", v1.0. Available at https://auradesign.pro/en/blog/observatorio-de-precios-web-espana-2026
- Permanence: each version retains its own CSV at a fixed URL. Nothing is overwritten.
Machine-readable markup
The page publishes JSON-LD of type Dataset. Google requires only name and description, and recommends license, temporalCoverage, spatialCoverage, variableMeasured, measurementTechnique, version, and distribution (developers.google.com, consulted 27-08-2026). We include them all, because the recommended ones are exactly what an answer engine needs to cite the data without getting the year wrong.
{
"@context": "https://schema.org",
"@type": "Dataset",
"name": "Observatorio de Precios Web España 2026",
"description": "Dataset abierto de presupuestos reales de proyectos web en España, normalizados sin IVA, con esquema de columnas, criterios de exclusión y recuento por celda.",
"url": "https://auradesign.pro/en/blog/observatorio-de-precios-web-espana-2026",
"license": "https://creativecommons.org/licenses/by/4.0/",
"isAccessibleForFree": true,
"version": "1.0",
"spatialCoverage": "ES",
"temporalCoverage": "2025-01-01/..",
"measurementTechnique": "Recogida de presupuestos aportados y precios públicos, normalización a importe sin IVA, mediana y cuartiles por celda con umbral mínimo de 5 registros",
"variableMeasured": [
"importe_sin_iva_eur",
"mantenimiento_mensual_sin_iva_eur",
"coste_36m_sin_iva_eur",
"plazo_semanas",
"cesion_derechos_codigo"
],
"creator": {
"@type": "Organization",
"name": "Aura Design",
"url": "https://auradesign.pro/"
},
"distribution": [
{
"@type": "DataDownload",
"encodingFormat": "text/csv",
"contentUrl": "https://auradesign.pro/data/observatorio-precios-web-es-2026-v1.csv"
}
]
}
What this dataset cannot do
We promise less than the table seems to promise.
- It is not a random sample. Those who send us a quote are usually comparing, and those who compare usually received something expensive. This bias is declared, not corrected.
- It does not say what price is fair. It says what prices are circulating.
- It does not measure quality. Two quotes with the same amount may deliver incomparable things. That is why there are scope columns next to the price column.
- It ages. Each version is dated so you know when to stop relying on it.
A dataset that writes its limits serves to make decisions; a dataset that hides them serves to sell.
A quote is not defended with opinions: it is defended with comparable cases and a method that someone can break. That is why we publish the file before the conclusion.
Do you want to contribute your quote or compare the one on your desk? Tell us what you have in front of you in an initial 30-minute call at no cost. If your case does not fit with what we do, we will tell you in that same call. You can send us your quote from the contact page.
Frequently asked questions
Do the Observatory amounts include VAT?
No: all amounts are stored and published without VAT, and those that arrived with VAT included are divided by 1.21 before entry. If you need the final price a freelancer or SME without deduction rights will pay, multiply by 1.21 yourself: we do not do it for you to avoid mixing two different figures in the same column.
And are your own rates also ex-VAT?
In the dataset yes, because the rule applies to all records. Outside the dataset no: our rates are published with VAT included (from 3,000 € for a brand website, from 4,500 € for a website with interactive experiences and automations, from 9,000 € for complete branding with proprietary CRM, AI, and funnels). The industry advertises the number without VAT; we advertise the one that appears on the invoice.
How many quotes are in version 1.0?
Version 1.0 is still being collected: we will publish the exact n and the date window when the sample closes, on this page and in observatorio-metodo-v1.md, and they will travel with each download. If a specific cell does not reach 5 records, you will not see a figure in it: you will see the n insufficient mark.
Can I use the dataset in my own article or report?
Yes, with CC BY 4.0 license: reuse it, filter as you wish, and publish your own cuts, citing the source and version. We ask that you cite the version and not just the name, because figures change between versions and a citation without a version ages poorly.
Do agency and studio names appear?
No, and they will not. We publish provider type and size, never their identity: the goal is to compare conditions, not to single out companies.
Are your own projects included in the table?
Yes, marked with fuente_dato = proyecto_aura so you can exclude them with a filter and see if the rest of the table changes. If the medians shift significantly upon removing them, that movement is also data and we point it out in the changelog.
Keep reading
- How much does a website cost in Spain in 2026: breakdown by line items, with VAT and 3-year cost
- How to read a web quote as a freelancer or SME: what happens with VAT
- Why one agency asks for 1,200 € and another for 12,000 € for the same website
- 36-month total web cost calculator
- How to audit a web quote: 14 signs they are selling you smoke
Sources
- https://sede.agenciatributaria.gob.es/static_files/Sede/Tema/IVA/IVA_reperc/Tipos_IVA_2026_26_02_2026.pdf — AEAT, "Tipos impositivos en el IVA 2026"
- https://web.dev/articles/vitals — Google/web.dev
- https://stripe.com/es/pricing — Stripe Spain
- https://www.shopify.com/es/precios — Shopify Spain
- https://sede.red.gob.es/es/procedimientos/convocatoria-de-ayudas-destinadas-la-digitalizacion-de-empresas-del-segmento-iii — Red.es HQ
- https://www.boe.es/buscar/act.php?id=BOE-A-2023-11022 — Law 11/2023, of May 8 (BOE-A-2023-11022)
- https://developers.google.com/search/docs/appearance/structured-data/dataset — Google Search Central
Want to see this thinking applied to a real project?
