> For the complete documentation index, see [llms.txt](https://docs.dapta.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dapta.ai/dapta-docs-es/dforms/developers/environment-flags.md).

# Flags de funcionalidad y entorno

Los ajustes de entorno que un despliegue autoalojado de dForms puede cambiar y que tu gente sí nota: el formulario de demo inicial, las funciones premium, la insignia Hecho con dForms, los IDs de segu

Un despliegue autoalojado se configura entero con variables de entorno. La mayoría son fontanería (base de datos, puertos y secretos) y se cubren en [Autoalojamiento](/dapta-docs-es/dforms/developers/self-hosting.md). Esta página lista las que cambian **lo que ve la gente**, para que sepas por qué tu instancia se comporta distinto a app.dforms.ai.

Ninguna de estas aplica al producto alojado: en app.dforms.ai estas decisiones ya están tomadas por ti.

> **⚠️ Nota:** Todo lo que empieza por `NEXT_PUBLIC_` es un valor de **construcción**, horneado en la imagen web al construirla. Cambiarlo significa reconstruir y redesplegar la imagen web, no reiniciar un contenedor.

***

## Workspaces nuevos

| Ajuste           | Por defecto | Qué ve tu gente                                                                                                                                                                                                                                                                                    |
| ---------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SEED_DEMO_FORM` | `true`      | Si un workspace recién creado arranca con un formulario de demo listo para trastear, o con una lista de **Formularios** vacía. Ponlo en `false` para entregar workspaces vacíos. Otros ajustes de primer arranque pueden tener precedencia sobre él: `.env.example` detalla la interacción exacta. |

***

## Funciones premium

dForms en sí es gratis y no tiene planes que desbloquear. La verja existe solo para que un despliegue pueda poner sus propios derechos delante de los extras opcionales.

| Ajuste                 | Por defecto | Qué ve tu gente                                                                                                                                            |
| ---------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PREMIUM_FEATURES`     | `open`      | `open` desbloquea todo, que es lo que recibe una bifurcación y casi seguro lo que quieres. `locked` comprueba cada función contra un servicio de derechos. |
| `ENTITLEMENTS_API_URL` | sin definir | Solo se necesita con `PREMIUM_FEATURES=locked`: el servicio que responde a la comprobación de derechos.                                                    |
| `ENTITLEMENTS_API_KEY` | sin definir | La credencial de ese servicio. Solo se necesita con `PREMIUM_FEATURES=locked`.                                                                             |

***

## Nombres y enlaces cruzados

| Ajuste                      | Por defecto | Qué ve tu gente                                                                                                                    |
| --------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `NEXT_PUBLIC_PRODUCT_NAME`  | `Forms`     | El nombre del producto que se muestra por la interfaz.                                                                             |
| `NEXT_PUBLIC_PLATFORM_URL`  | vacío       | Añade la fila de la plataforma al selector de apps. Sin definir no renderiza ni eso ni el elemento de navegación de la plataforma. |
| `NEXT_PUBLIC_CALENDARS_URL` | vacío       | Añade un enlace de calendarios al selector de apps.                                                                                |

***

## IDs de seguimiento de todo el despliegue

Estas son las etiquetas de marketing que se renderizan **solo en las páginas públicas de formulario**, nunca en el panel. Cada etiqueta se carga solo cuando su ID está definido, así que un despliegue con todas sin definir no carga ningún script de seguimiento. El único otro script de terceros que puede cargar un formulario público es la verificación de la [protección contra spam](#proteccion-contra-spam), y solo en un formulario que la active. Son valores por defecto para todo el despliegue, y los ajustes propios de un formulario en **Conectar** los anulan formulario por formulario. Mira [Seguimiento y píxeles](/dapta-docs-es/dforms/connect/tracking-and-pixels.md).

| Ajuste                            | Qué ve tu gente                                                                                                                    |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `NEXT_PUBLIC_GTM_ID`              | Carga un contenedor de Google Tag Manager en cada página pública de formulario.                                                    |
| `NEXT_PUBLIC_META_PIXEL_ID`       | Dispara un PageView del píxel de Meta por visita.                                                                                  |
| `NEXT_PUBLIC_POSTHOG_KEY`         | Captura una pageview de PostHog por visita.                                                                                        |
| `NEXT_PUBLIC_POSTHOG_HOST`        | La URL de ingesta de PostHog. Por defecto la nube de PostHog en EE. UU., así que defínela para un proyecto en la UE o autoalojado. |
| `NEXT_PUBLIC_HUBSPOT_TRACKING_ID` | Carga el código de seguimiento de HubSpot de tu portal en las páginas públicas de formulario.                                      |

> **⚠️ Nota:** Estas etiquetas pertenecen a **quien es dueño del formulario** y miden a quienes responden. No son la analítica de producto de tu propio despliegue, que es un conjunto de variables aparte con nombres deliberadamente distintos para que las dos nunca puedan apuntar a la misma clave.

***

## Correo

No se envía ningún correo hasta que eliges un proveedor. Hasta entonces, los avisos de respuesta se escriben en el log de la API, así que un despliegue nuevo funciona igual de punta a punta.

| Ajuste            | Por defecto         | Qué ve tu gente                                                                                                                                                                                                                                                |
| ----------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `EMAIL_PROVIDER`  | `log-only`          | `log-only` imprime los avisos en el log, `noop` los descarta en silencio, `smtp` envía por SMTP, `http` manda cada mensaje a una API de correo. Hasta que esto se defina, los [correos de respuesta](/dapta-docs-es/dforms/connect/emails.md) no llegan nunca. |
| `MAIL_FROM_EMAIL` | `forms@example.com` | La dirección del remitente en cada correo. Cámbiala antes de enviar nada real.                                                                                                                                                                                 |
| `MAIL_FROM_NAME`  | `Forms`             | El nombre del remitente que se ve en la bandeja.                                                                                                                                                                                                               |

***

## Límites de tasa y destinos

| Ajuste                      | Por defecto                                        | Qué ve tu gente                                                                                                                                                                                                                    |
| --------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RATE_LIMIT_ENABLED`        | `true`                                             | Si los endpoints públicos de formulario y de envío se limitan siquiera.                                                                                                                                                            |
| `RATE_LIMIT_CAPACITY`       | `60`                                               | El margen de ráfaga por dirección IP de cliente.                                                                                                                                                                                   |
| `RATE_LIMIT_REFILL_PER_SEC` | `1`                                                | Con qué rapidez se recupera ese margen. Mira [API pública y límites de tasa](/dapta-docs-es/dforms/developers/public-api.md).                                                                                                      |
| `TRUST_PROXY_HOPS`          | `1` cuando hay una URL pública definida, si no `0` | Cuántos proxies de confianza hay delante de la API. Ponlo mal y cada visitante comparte un solo cubo, así que quienes responden de verdad empiezan a ver errores de límite.                                                        |
| `HUBSPOT_PRIVATE_APP_TOKEN` | sin definir                                        | Ponlo y HubSpot funciona para todo el despliegue: la página de **Conexiones** muestra **La da el servidor** en lugar de pedirle a cada cuenta que conecte. Sin definir, la tarjeta de HubSpot reporta un estado desactivado claro. |

***

## Subida de archivos

La pregunta **Subir archivo** solo existe en un despliegue que tenga dónde poner los archivos. `STORAGE_BUCKET` es el interruptor: sin él, que es lo que trae un fork limpio, el tipo de pregunta no se puede publicar y el endpoint de subida responde `404`, así que un clon sin bucket funciona igual de principio a fin.

| Ajuste                                                | Por defecto | Qué ve la gente                                                                                                                                               |
| ----------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `STORAGE_BUCKET`                                      | sin valor   | El bucket donde se escriben las subidas. Ponerlo activa la pregunta **Subir archivo** en todo el despliegue.                                                  |
| `STORAGE_REGION`                                      | `us-east-2` | La región del bucket. Si no coincide, la petición falla en vez de escribir en otro lado.                                                                      |
| `STORAGE_PROVIDER`                                    | sin valor   | Ponlo en `none` para dejar el bucket configurado pero apagar la función. No es la forma de encenderla: eso lo hace el bucket.                                 |
| `STORAGE_ENDPOINT`                                    | sin valor   | Apúntalo a un servicio compatible con S3 como Cloudflare R2 o MinIO. La mayoría de servidores autoalojados también necesitan `STORAGE_FORCE_PATH_STYLE=true`. |
| `STORAGE_ACCESS_KEY_ID` / `STORAGE_SECRET_ACCESS_KEY` | sin valor   | Solo para un despliegue sin rol de instancia o de carga que adjuntar. En un pod con rol, déjalos vacíos y el SDK encuentra las credenciales solo.             |
| `UPLOAD_MAX_FILE_MB`                                  | `10`        | El tope duro por archivo. Quien construye el formulario puede pedir menos en su pregunta, nunca más.                                                          |
| `UPLOAD_PRESIGN_TTL_SEC`                              | `600`       | Cuánto vale una dirección de subida.                                                                                                                          |
| `UPLOAD_DOWNLOAD_TTL_SEC`                             | `300`       | Cuánto vale un enlace para volver a leer un archivo.                                                                                                          |

El navegador sube directo al bucket, así que las reglas CORS del bucket tienen que permitir el origen desde el que sirves los formularios. Permite `PUT` para la subida, y también `GET` si quieres que los documentos de Word se previsualicen en el panel, porque ese es el único tipo que el panel descarga en vez de apuntarle el navegador.

***

## Protección contra spam

El interruptor **Protección contra spam (captcha)** de la pestaña **Conectar** de un formulario solo funciona en un despliegue con claves de Cloudflare Turnstile. Las dos claves sin definir, que es lo que trae un fork limpio, significa que la función no existe: el interruptor muestra *Este despliegue no tiene configurada la protección contra spam.* y ningún formulario carga nada de Cloudflare. Mira [Protección contra spam (captcha)](/dapta-docs-es/dforms/connect/spam-protection.md) para ver qué hace la verificación.

| Ajuste                      | Por defecto | Qué ve tu gente                                                                                                                                                                                  |
| --------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CAPTCHA_SITE_KEY`          | sin definir | Junto con `CAPTCHA_SECRET_KEY`, enciende la función. Es pública a propósito: llega al navegador dentro de los datos del formulario publicado, nunca por un valor de construcción `NEXT_PUBLIC_`. |
| `CAPTCHA_SECRET_KEY`        | sin definir | El secreto con el que la API comprueba cada verificación. Nunca sale de la API.                                                                                                                  |
| `CAPTCHA_PROVIDER`          | sin definir | Ponlo en `none` para dejar las claves cargadas pero apagar la verificación en todas partes. No es la forma de encenderla: eso lo hacen las claves.                                               |
| `CAPTCHA_VERIFY_TIMEOUT_MS` | `2500`      | Cuánto espera la API a Cloudflare en cada intento, como máximo `4000`. Tras una caída sigue un reintento, dentro de un total de 4 segundos.                                                      |

Unas reglas que conviene cumplir:

* **Define las dos claves o ninguna.** Una clave sin la otra impide que la API arranque, y lo mismo pasa con `CAPTCHA_PROVIDER=turnstile` sin ellas. Solo la API las necesita; la app web no necesita nada.
* **Registra el host correcto.** Crea un widget **Managed** en Cloudflare para el host desde el que se sirven tus formularios, el host de `PUBLIC_APP_URL`. La API comprueba que cada token se emitió ahí. Los formularios insertados en otros sitios no necesitan nada más, porque la verificación corre dentro del marco propio del formulario.
* **Deja pasar el tráfico.** La API tiene que poder llegar a `https://challenges.cloudflare.com`. Si un proxy delante de la app web define una Content-Security-Policy, permite `https://challenges.cloudflare.com` en `script-src` y `frame-src`.
* **Deja las claves de prueba fuera de producción.** Las claves de prueba de Cloudflare son para ejecuciones locales y de CI. La API registra un aviso cuando arranca con un secreto de prueba, porque ese secreto acepta cualquier token.

***

## Dónde está la lista completa

Estas son las que ve la gente. La referencia completa, incluidos todos los secretos, puertos y ajustes de base de datos, vive en el repositorio:

* [`.env.example`](https://github.com/Dapta-Tech/dapta-forms/blob/develop/.env.example): cada variable con su valor por defecto y una explicación en línea de lo que hace.
* [`SELF-HOSTING.md`](https://github.com/Dapta-Tech/dapta-forms/blob/develop/SELF-HOSTING.md): las mismas variables agrupadas por tema, con las obligatorias para un despliegue real señaladas.

Los ajustes del servidor se validan al arrancar la API. Un valor incorrecto, como una clave de protección contra spam sin la otra, detiene el arranque con un mensaje que nombra la variable y el motivo, en lugar de levantarse en un estado roto.

***

## Qué sigue

* [Autoalojamiento](/dapta-docs-es/dforms/developers/self-hosting.md): el despliegue en sí.
* [API pública y límites de tasa](/dapta-docs-es/dforms/developers/public-api.md): qué hacen de verdad los ajustes de límite de arriba.
* [Seguimiento y píxeles](/dapta-docs-es/dforms/connect/tracking-and-pixels.md): la versión por formulario de los IDs de seguimiento.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.dapta.ai/dapta-docs-es/dforms/developers/environment-flags.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
