# Pre-Populate Forms

You can pre-populate hidden fields from URL parameters for free on every plan to save known data with each submission. In the builder’s form settings, add a **Hidden Field** and pass a matching parameter in the form URL.

Makeform is a free AI form builder: describe what you want to collect and it builds the form for you, with unlimited forms and submissions on the free plan.

![Add a hidden field for URL parameters](https://fs.pagegun.com/p/BtaPkTIL/media/7014f0de.webp)

:::callout{type="info"}
Pre-population is best for values you already know before the respondent opens the form, such as `email`, `utm_source`, `customer_id`, `referral_code`, or `plan`.
:::

## How pre-population works

Create a hidden field, save the form, then pass a matching query parameter in the form URL. Makeform reads that parameter and saves it with the response.

Example:

```text
https://makeform.ai/f/customer-intake?email=maya@example.com&plan=pro
```

In this example:

- `email` fills a hidden field named `email`.
- `plan` fills a hidden field named `plan`.

You can also use that hidden value inside form copy. Click or type **@** and choose the parameter from the variable menu.

## Create a hidden parameter

1. Open your form in the builder.
2. Go to the form settings.
3. Add a **Hidden Field**.
4. Give it a stable field name, such as `email`, `utm_source`, `customer_id`, `referral_code`, `plan`, or `company`.
5. Save or update the form after adding the hidden field.
6. Publish or preview the form.
7. Add a matching query parameter to the form URL.

## Build a pre-populated link

Start with the form URL, then add a question mark and key-value pairs:

```text
?email=maya@example.com&plan=pro&utm_source=newsletter
```

Use `&` between each value.

If a value contains spaces or special characters, encode it:

```text
company=Acme%20Studio
```

## Use the parameter in form copy

Hidden parameters are not shown as editable fields, but you can reference them in questions, descriptions, text blocks, or ending pages.

For example, if your hidden field is named `email`, you can insert it into copy as:

```text
We will send the receipt to {{email}}.
```

Use the **@** menu in the builder to insert the parameter instead of typing the variable manually.

![Select a hidden field from the variable menu](https://fs.pagegun.com/p/BtaPkTIL/media/5a7a2b01.webp)

## Respondent experience

The respondent does not see or edit the hidden field. Makeform stores the parameter with the response, and any visible copy that references the parameter updates when the form loads.

## Common use cases

| Use case            | Values to pass                              |
| ------------------- | ------------------------------------------- |
| Newsletter campaign | `utm_source`, `campaign`, `segment`         |
| CRM lead routing    | `company`, `owner`, `lead_id`               |
| Customer support    | `account_id`, `issue_type`, `customer_tier` |
| Event registration  | `ticket_type`, `referrer`, `discount_code`  |

## Testing checklist

- Open the link in a private browser window.
- Confirm hidden tracking fields appear in the submission data.
- Confirm any copy that references the parameter renders correctly.
- Test values with spaces and special characters.
- Submit a test response and review the saved values.

## Troubleshooting

### A hidden field does not receive a value

Check that the query parameter name matches the field name exactly.

### Spaces appear incorrectly

Encode spaces as `%20` or use a URL builder before sending the link.

### The value is visible but should be hidden

Move that value to a hidden field so respondents cannot edit it.

### A variable does not render in copy

Confirm the hidden field exists before you insert it, then use the **@** menu to select the parameter again.
