---
title: "Hidden"
description: "Store source or account context without rendering a question."
group: "Build forms"
order: 17
type: "reference"
parent: "fields"
keywords:
  - "hidden"
  - "paramName"
  - "defaultValue"
  - "attribution"
updated: "2026-07-14"
---

The hidden field stores a string from a URL parameter or configured default without rendering a control.

## Options

| Option | Type | Default | Behavior |
| --- | --- | --- | --- |
| `paramName` | `string` | the field ID | Selects the query-string key |
| `defaultValue` | `string` | none | Supplies a value when the parameter is absent |

Hidden-field parameter names are case-sensitive. A URL value wins over `defaultValue`, while explicit SDK `initialData` and a respondent's typed state win over URL prefill.

## Add a hidden field

In the dashboard, select **Add block**, choose **Hidden**, and set the parameter name and optional default.

```ts
const sourceField = {
  id: "campaign_source",
  kind: "hidden",
  label: "Campaign source",
  paramName: "utm_source",
  defaultValue: "direct",
} as const;
```

Opening `/f/contact?utm_source=newsletter` stores `newsletter` under the stable response key `campaign_source`.

<Callout variant="warning" title="Hidden doesn't mean trusted">
  Respondents can edit query parameters and any form data the browser can see. Never use a hidden answer as authorization or proof of identity.
</Callout>

## Related

- [Prefill and hidden fields](/docs/prefill): See the full precedence and coercion rules.
- [Capture UTM and attribution data](/guides/capture-utm-attribution): Record campaign parameters with stable response keys.
- [Prefill from your app session](/guides/prefill-from-app-session): Pass known account context directly from the host app.
