> For the complete documentation index, see [llms.txt](https://docs.notionapps.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.notionapps.com/guides/prefill-create-forms-from-a-url.md).

# Prefill Create Forms from a URL

Share a link that opens an **Add New Item** form and fills selected fields automatically — no custom JavaScript.

This guide walks through builder configuration with screenshots from a real Create Form (`Submit Service Request`), then shows how to share and test the published link.

{% hint style="info" %}
**Scope (current release)**\
Works on **Create Form** screens only (not Update Form). Supported field types: **Text**, **Long text**, **Number**, **Toggle**, **Single-select (Dropdown)**, **Date**, **Multi-select** (including **People**), and **Relation (Page Selector)**.
{% endhint %}

***

### What you get

After you map fields to URL parameter names and publish, a link like this:

```
https://your-app.notionapps.com/submit-service-request?name=Alvin&impact=Major&priority=High
```

will:

1. Open the Create Form whose screen name slugifies to `submit-service-request`
2. Prefill **Request summary** with `Alvin`, **Impact** with `Major`, and **Priority** with `High`

Users can still edit any unlocked field after the form loads.

***

### Before you start

You need:

* A **Create Form** (Add Item) screen in the builder
* At least one supported field on that form (text, long text, number, toggle, single-select, date, multi-select/people, or relation)
* Permission to **Publish** the app so end users see the mapping

{% hint style="warning" %}
**Slug tip**\
The path segment comes from the screen’s **navigation / screen name** (for example, `Submit Service Request` → `submit-service-request`). Keep Create Form names unique. If two forms would share the same slug, use `?form=<screenId>` instead (see [Disambiguate with form=](#disambiguate-with-form)).
{% endhint %}

***

### Step 1 — Open the Create Form in the builder

1. Open your application in the NotionApps builder.
2. Select the Create Form screen you want to share (for example, **Submit Service Request**).
3. Confirm the right panel shows **Form (Add Item)** / Create Form behaviour settings.

![Create Form open in the builder with mobile preview](https://iili.io/Cw1nY4p.png)

![Create Form overview — fields listed in Logic and Behaviour](https://iili.io/Cw1nY4p.png)

***

### Step 2 — Map a field to a URL parameter

For each field you want to fill from the link:

1. In the **Logic** list (right panel), select the field (or click it in the preview).
2. Turn **Default Value** **On**.
3. Set **Default value source** to **From URL parameter**.
4. Enter the **URL parameter name** (for example, `name` for `?name=Alvin`).
5. Optionally leave a **Static value** as a fallback when that query param is missing.
6. Optionally turn on **Disable Changes** if the prefilled value should be locked.

{% hint style="success" %}
**Naming recommendation**\
Use short, lowercase names without spaces: `name`, `impact`, `priority`, `source`. These become the keys in your shareable URL.
{% endhint %}

#### Example mappings for this form

| Form field      | Field type | URL parameter | Example in link |
| --------------- | ---------- | ------------- | --------------- |
| Request summary | Text       | `name`        | `name=Alvin`    |
| Impact          | Dropdown   | `impact`      | `impact=Major`  |
| Priority        | Dropdown   | `priority`    | `priority=High` |

Select the field in the preview or Logic list:

![Select Request summary (or the matching Logic row) to edit defaults](https://iili.io/Cw1n0vt.png)

Map additional dropdown fields the same way:

![Map Impact to a URL parameter such as impact](https://iili.io/Cw1nGun.png)

![Map Priority to a URL parameter such as priority](https://iili.io/Cw1nMjs.png)

#### How values are interpreted

| Field type               | Accepted query values                                                           | If the value is invalid                    |
| ------------------------ | ------------------------------------------------------------------------------- | ------------------------------------------ |
| Text / Long text         | Any string                                                                      | Used as-is                                 |
| Number                   | A finite number (for example `42`, `3.5`)                                       | Field keeps static fallback or stays blank |
| Toggle                   | `true` / `1` / `yes` / `on` (and false equivalents) — case-insensitive          | Field keeps static fallback or stays blank |
| Single-select            | Option **label** (case-insensitive), or option index                            | Field keeps static fallback or stays blank |
| Date                     | `YYYY-MM-DD`, or ISO / `YYYY-MM-DDTHH:mm` (time used when the field shows time) | Field keeps static fallback or stays blank |
| Multi-select / People    | Comma-separated option **labels** or **values** (emails for People)             | Unmatched tokens skipped                   |
| Relation (Page Selector) | Comma-separated related **record ids**                                          | Invalid ids skipped                        |

{% hint style="info" %}
**Priority**\
If the URL contains the mapped parameter → that value wins on first load.\
If the parameter is omitted → static default (if any) is used.\
After load, user edits are not overwritten.
{% endhint %}

***

### Step 3 — Copy the form link from Behaviour

With the Create Form screen selected (not a single field):

1. Scroll the right panel to the **Behaviour** section.
2. Click **Copy form link**.
3. Paste the link somewhere temporary (notes, browser address bar).

The copied link uses your published app origin, the screen-name slug, and empty placeholders for every mapped parameter — ready for you to fill in.

![Copy form link button on Create Form Behaviour settings](https://iili.io/Cw1nc3N.png)

Example shape after copying (parameters empty until you fill them):

```
https://your-app.notionapps.com/submit-service-request?name=&impact=&priority=
```

Fill in values:

```
https://your-app.notionapps.com/submit-service-request?name=Alvin&impact=Major&priority=High
```

{% hint style="warning" %}
**Publish required**\
Mappings are saved with the app. End users only see them after you **Publish**. Builder preview alone is not enough for shareable Path B links.
{% endhint %}

***

### Step 4 — Publish and test in the live app

1. Click **Publish** in the builder top bar.
2. Open the filled link in a private/incognito window (or a different browser).
3. Sign in if the app is private.
4. Confirm the Create Form opens with the expected fields filled.

![Published app: Create Form opened from the URL with fields prefilled](https://iili.io/Cw1nVZG.png)

In this example:

* Request summary → **Alvin**
* Impact → **Major**
* Priority → **High**
* Other fields stay empty (or use their static defaults) because they were not in the URL

***

### URL reference

#### Path (open the form)

| Style            | Example                                                    | When to use                                     |
| ---------------- | ---------------------------------------------------------- | ----------------------------------------------- |
| Screen-name slug | `/submit-service-request?...`                              | Default; friendly shareable links               |
| Explicit form id | `/?form=<screenId>&...` or `/anything?form=<screenId>&...` | Two Create Forms would collide on the same slug |

#### Query parameters (prefill)

Only parameters you mapped in the builder are applied. These reserved keys are **never** used as field values:

* `form`
* `screenId`
* `recordId`
* `title`, `showTitle`, `selectionMode`
* Live-demo auth keys (`live_demo_email`, `live_demo_code`)
* Other navigation keys (`primary`, `referenceAutoLinkInfo`)

#### Disambiguate with `form=`

If slug matching is ambiguous or you prefer IDs:

```
https://your-app.notionapps.com/?form=64f1a2b3c4d5e6f7a8b9c0d1&name=Alvin&impact=Major
```

You can also pass the slug in `form` when it uniquely matches:

```
https://your-app.notionapps.com/?form=submit-service-request&name=Alvin
```

***

### End-to-end example (makers)

**Goal:** Email a vendor a link that opens “Submit Service Request” with summary and impact already set.

1. Open the **Submit Service Request** Create Form.
2. Map **Request summary** → URL parameter `name`.
3. Map **Impact** → URL parameter `impact`.
4. Click **Copy form link**, then fill values:

```
https://acme.notionapps.com/submit-service-request?name=HVAC%20inspection&impact=Major
```

5. **Publish**.
6. Send the link. Recipients land on the Add form with those fields filled; they complete the rest and submit.

***

### Checklist

* [ ] Fields use **From URL parameter** with clear param names
* [ ] Optional static fallbacks set where useful
* [ ] **Disable Changes** set only when the value must stay locked
* [ ] Create Form screen name is unique (or you use `?form=`)
* [ ] App is **Published** after mapping
* [ ] Tested on desktop and mobile published shells
* [ ] Invalid select/toggle/number values fall back safely (spot-check once)

***

### Troubleshooting

| Symptom                             | Likely cause                                                   | What to do                                                     |
| ----------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- |
| Link opens the app but not the form | Slug does not match any Create Form, or collision              | Check screen name slug; use `?form=<screenId>`                 |
| Form opens but fields are empty     | Mapping not published, wrong param names, or reserved key used | Re-check param names; publish again; avoid reserved keys       |
| Select stays blank                  | Label in URL does not match an option                          | Use the exact option label (case-insensitive) or a valid index |
| Private app shows login first       | Expected                                                       | User signs in, then the same URL should open and prefill       |
| Update Form / list not affected     | Out of scope for this release                                  | Use Create Form only                                           |

***

### Related notes for makers

* Prefill counts like a normal user input for visibility / personalization rules that depend on user input.
* Works on **desktop and mobile** published apps.
* No custom code is required; do not paste query parsing into Custom JavaScript for this use case.

***

### Related

* [Organize Create Forms with Sections and an Optional Stepper](https://docs.notionapps.com/guides/organize-create-forms-with-sections-and-an-optional-stepper)
* [20 Jul 2026 Release](https://docs.notionapps.com/release-notes/20-jul-2026-release)
