User guide

HolmesPortfolio Forms

Build a form, put it on a page, and deal with what people send in. Start with the quick start. Keep the rest as a reference for when a question comes up.

Overview #

A form is fields laid out over one or more pages. You build it in the visual editor and drop it onto any page or post with a shortcode or a block. When someone submits, the plugin emails the answers to whoever needs them, shows the person a message back, and, if you want, keeps a copy in Entries.

Out of the box, forms use the GOV.UK Design System. It’s made by the Government Digital Service (GDS), and the UK government uses it for its own online services. We recommend it, and people already know how it works from GOV.UK. GOV.UK says: “Using the GOV.UK Design System in a service does not immediately make that service accessible.” Test each published form. Making your forms accessible is your responsibility. Which questions follow GOV.UK shows what to check. Wherever a setting has a choice that matches GOV.UK’s guidance, that choice is the default and is marked recommended.

Most questions use GOV.UK Design System components, without the GOV.UK crown, header, footer or GDS Transport typeface, which only services on GOV.UK may use. Text is set in Helvetica or Arial instead. Your own site supplies the header, logo and colours around the form. If your forms are on a gov.uk address, your theme adds the GOV.UK header and font.

Prefer Bootstrap, a plain self-contained look, or nothing but your own theme? Switch it in Settings.

Pro and Casework are paid add-ons, and they’re coming soon. They aren’t for sale yet. Anything marked Pro, coming soon in this guide is part of them.

You also get 13 ready-made forms to learn from, in six groups. The setup wizard lets you pick the ones you want:

Open them, take them apart, and copy what fits. Each one is an example, written in good faith. It is not legal advice. Check it and set your own before you publish. See The forms you start with.

The short version
  1. Forms → Add New. Drag fields from the left onto the page.
  2. Click a field to set its label, whether it's required, and the wording when it fails.
  3. Add an Email action so the answers reach you, and a Submit message for the person.
  4. Save. Copy the shortcode and paste it into a page, or press Add to a new page.
New to it The Form tutorial button on the Forms screen opens a full-screen list of short topics, grouped by what you want to do: start here, make questions clear, make the form respond to answers, say it back, and publish and manage. Pick one and it takes you into a practice form. It walks you through, pointing at each part as it goes. Nothing is saved unless you press Save. Save asks you first, because it makes a real form. To build a real form while you follow along, use Open a second window on the list. Closing the tutorial does not touch that window. In the builder, the ? beside a setting always links back here.

Quick start #

Activating the plugin opens a short setup wizard. It asks a few site-wide questions:

You can change any answer later in Settings. Skipped the wizard, or want to check your choices? The Run the setup wizard button on Settings → Help & support brings it back. Pro adds its own steps to the same wizard for the licence key and your workflow. On the Casework plan it also asks about team access and team members.

When you finish, choose Build a form or Go to Forms. The Forms screen has a Form tutorial button with short walkthroughs for each part of the builder. On the Plugins list, the row has Forms and Settings links.

Build a simple enquiry form

  1. Go to Forms → Add New and give the form a title at the top. Drag a Group from Layouts onto the page, then drag a Text input from Inputs into it.
  2. Click that first field. In the panel on the right, set the label to Full name and tick Required.
  3. Drag another Text input from Inputs into the same group. Label it Email address, set Input mode to Email, and tick Required.
  4. Drag a Text area into the group too. Label it Your message and tick Required. Give the group an optional Title such as Your details. It becomes a heading on the “Check your answers” page and in the emails.
  5. From Actions, drag a Button below the group. Set Does to Submit the form. It can sit on the page outside the group.
  6. Drag an Email action. In To, type the address that should receive enquiries. The body already lists every answer, and you can add a line of your own above it. If you clear the body, All fields below the editor puts the list back.
  7. Drag a Submit message. Write something like “Thanks [name], we’ll be in touch.”
  8. Look at Form check, at the bottom, and fix anything it lists. Then click Save and continue. Nice work: your form is saved. Copy its shortcode from the builder screen or the Forms list.

Stuck on what a setting does? Click the ? next to it, and see The ? help dots. There’s more on grouping in Groups (containers).

Put a form on a page #

Every form has a shortcode. Find it on the Forms list, or on the builder screen after the first save.

[holmesforms_form id="123"]

In the block editor you can instead add the HolmesPortfolio Form block and pick the form from a dropdown, with no id to copy. The form looks the same either way.

Want a page of its own for the form? Press Add to a new page, next to the shortcode on the Forms list or in the builder. It makes a draft page with the form already in it and opens that page in the editor. The page takes the form’s title, which you can change. Check it over, then publish. The button only shows for people who can edit pages.

Tip You can put the same form on more than one page. Each submission still gets its own unique reference.

Page caches and security plugins. Forms keep working when:

A few things to know:

Cookies. The plugin sets no cookies of its own. Customers who sign in on the Pro Casework plan use WordPress’s own login cookie. If you turn on Turnstile or reCAPTCHA, Cloudflare or Google reads information from the visitor’s browser and can set cookies. UK cookie rules cover reading from a visitor’s browser as well as setting cookies.

Visitors without JavaScript. By default a form is hidden from anyone with JavaScript turned off. They see a short message asking them to turn JavaScript on and reload the page, or to contact you another way. You choose this under Visitors without JavaScript on Settings, General.

Why the default differs from GOV.UK GOV.UK’s Service Manual says government services must use progressive enhancement, so they still work when JavaScript doesn’t. The plugin hides forms by default on purpose. Without JavaScript, several features stop working. Letting people in can cause more problems than it solves.

If you choose Let them fill it in without JavaScript, every page shows at once and the form is sent in one go. The thank-you page still shows the reference number. Here’s what stops working for those visitors:

These still work without JavaScript: file uploads, sliders and star ratings, plus the Pro booking calendars, holiday stays and payments.

Once you let people in, a list appears under the setting. It shows each of your forms and what won’t work on it, with a pointer back to the option that hides the form.

The builder warns you too. When a saved form gains something that won’t work without JavaScript, the builder shows a warning. You see each kind of warning once per form. Admins also get a link to the setting.

Taking a form down. A form stops taking answers as soon as you unpublish it, switch it to draft or move it to the bin. That includes visitors who already had the page open.

Sent twice by mistake. If a visitor double-clicks the send button, the form is saved once. The second send tells them it was already sent.

The builder screen #

PartWhat it's for
Palette (left)

The field types, in five groups:

  • Inputs: anything the visitor fills in
  • Layouts: groups
  • Displays: notices, the answers summary, the thank-you message
  • Actions: buttons, email actions, hidden fields
  • Pro: the fields that come with the Pro add-on (coming soon)

Drag a field onto the page, or click it to drop it at the end. Pro items carry a Pro tag. Without Pro they show a padlock, and clicking one tells you what it does. Repeatable group sits under Layouts with the other groups, and it’s a Pro item too.

Need more room? ‹ Hide components tucks the palette away, and ▸ Components brings it back. A link to this guide sits at the foot of the palette.

Page tabs (top)One tab per page, with a + to add another. Drag a field onto a tab to move it to that page.
Find a field (bottom)

A Find a field bar next to Form check. Click it to open a panel, then choose one of two searches:

  • A word: type any part of a field’s label, hint, Data Name or option text. It also searches the text inside an email action, submit message, alert or hidden field, token names included. Capitals are ignored unless you untick Ignore capitals.
  • Fields never named: lists every field still on a builder default. That means its automatic Data Name (text_1, radio_2) or, for an input, no label yet.

A word finds your computed variables too. Search for a key such as [age] and the result reads “Computed variable · [age]”. Click it to open the Setup tab with that variable highlighted.

Each result shows where it sits. Click it to open that field. The panel remembers your last search while the form is open.

Canvas (middle)

The fields on the current page. Each row has a small live preview of what you’re building, for example:

  • the real choices you’ve added, stacked or side by side to match the option layout
  • a text box in its chosen mode, or a slider showing its range
  • the button’s or alert’s actual wording
  • a group with its own fields nested inside

Drag to reorder, or use the ▲▼ buttons on the row. Click a field to edit it, and click again to close.

Options panel (right)

Everything about the selected field, in titled sections: The basics, How the answer works (Settings on things that aren’t questions), Starting value, Error messages and Where it shows.

The Field type dropdown at the top swaps this field for another type, keeping the name, label, hint and anything the new type also uses. See common options and each field type below.

Setup tabEverything form-wide: computed variables and page show/hide rules, plus a Form settings block with:
  • The front-end debugger switch. Turn it on and the published form shows a panel to logged-in editors only. It lists every page as a section you can open, with its fields and their current values, hidden fields and computed variables included. For each conditional group, it says whether the group is showing or hidden right now.

    A System variables section lists the built-in tokens too, so you can see what [page-title] and [case-reference] come out as on this form. They stay blank until something fills them. The panel updates live as the visitor types, and Refresh works everything out again. Importing a form always leaves the debugger off, so turn it back on if you want it.

  • A Group inbox: a shared team mailbox, for staff only and never shown on the form. Replies to the notification emails come back to it, and so do replies to Message the submitter on Pro. To send an email action there, press its Group inbox chip. That puts [group-inbox] in the recipient list.
  • A Reference prefix for this form's own reference numbers (see Settings). The starter forms come with their own. For example, Freedom of Information uses FOI, Subject Access Request uses SAR and the complaints form uses COM.
  • Bank holidays for working days: which bank holidays this form skips when it counts working days. Leave it on the Settings choice unless a law sets its own rule. For example, we read the Freedom of Information Act 2000 as leaving out bank holidays in every part of the UK. That’s why the Freedom of Information starter form uses All UK bank holidays. See Bank holidays to leave out.
  • Name entries by: pick one or two short answers to use as the entry title on the Entries screen. Text areas and other long answers aren’t offered. Left blank, it uses the contact details: the name, then the email. It falls back to the first few answers only when the form has neither.
  • A Case view box, which sets how staff see the answers on an entry. It uses the same editor as an email action, with HTML, tokens and <if> blocks. All fields fills it with an <if> line for each field, hidden field and variable. Leave it empty for the plain list.
  • Response-time targets aren’t set here. On the Casework plan they’re in Settings → Workflow → Response times.
Form check (bottom)A running count of problems in the form. Click it for the list. See Form check.
Save bar (bottom)Save and continue stays in the builder. Save returns to the list. Both ask for a short note that goes into the form's history. Undo / Redo and History are beside them.

Describe your form #

Forms → Describe your form is a quick way to start:

Build a draft opens the result in the builder. Nothing is saved until you press Save. If you pick the Customer contact block, the name, email and phone ticks are skipped, so the same question never appears twice.

Naming, grouping and copying forms #

Above the builder sits the Form title, which you and your visitors see. Next to it is an optional Group box for tagging related forms, like Contact forms, Highways or Licensing.

Duplicate, on a form’s row in the Forms list, copies the form and opens the copy in the builder. The copy has the original’s title with “(copy)” on the end, so give it a new one.

Open one of the starter forms and the builder shows a note. Restore starter content can reset a starter form to its built-in version. So if you plan to make one your own, rename it first. A restore then leaves your renamed copy alone and adds a fresh copy of the original. A duplicate has its own title, so a restore leaves that alone too.

Saved blocks #

Tick the fields you want and press Save selected as a block to keep them as a named saved block for other forms.

To bring the three built-in blocks (Privacy notice, Terms and conditions, Customer contact) back, or to download them as a backup file, use Settings → General → Restore starter content. Restoring never touches a block you have locked. If you have an unlocked block of your own with one of those names, it lists it and asks you to confirm before replacing it.

Saved blocks travel between sites, locks included, in a backup. Blocks are matched by name. Importing adds any block with a new name. If the site already has a block with that name, the site’s own block is kept, unless you tick Replace… and confirm.

Right-click any field in the field list for a menu: Edit, Move up, Move down, Duplicate, Copy field, Cut field, Paste field after and Delete. On a group, the menu also has Save as a block.

Copy and Cut move a single field. The clipboard holds one field (a group brings its contents) and survives opening a different form, so you can copy a field from one form and paste it into another. A pasted field gets a fresh data name if its own would clash.

The ? help dots #

Every field and every setting in the builder carries a small ?. Click it for a plain-English line, and a Read more in the guide link that jumps this page to exactly that setting. The one-liner shows even with no internet. Only the link needs a connection.

The Form tutorial button on the Forms screen takes you into a practice form with a list of hands-on topics. They include your first form, kinds of question, groups, labels and hints, lists of choices, dates and times, addresses and files, show and hide rules, pages, calculations, hidden fields, emails, thank-you messages, HTML and tokens, publishing, entries, settings, backups and saved blocks.

Two topics walk through every calculation on a starter form: Every calculation, step by step uses the Calculation examples form, and Costs, pay and dates, step by step uses the Costs and pay examples form. If the form isn’t on your site yet, you’re asked first. You can add it, and it stays after the tutorial until you delete it. Or you can look through a practice copy, which isn’t saved unless you press Save.

Fields #

Every field shares the options in Every field's common options. The tables below cover only the settings specific to each type.

Text input #

A single-line box. Use the input mode to collect an email, phone number, web address, number or amount of money.

OptionWhat it does
Input modeText, Email, Telephone, Web address, Number or Money. Number can show a unit after the box (cm, kg, %), limit the decimal places, and set a lowest and highest answer, for example a height between 50 and 250 cm. Highest allowed depends on another answer gives each choice of a dropdown or radio question its own highest number, like 12 people for Meeting room A and 6 for Meeting room B. Money shows a currency sign (£, € or $) in front of the box, accepts 12.5, £12.50 or 1,250, saves the amount with 2 decimal places and shows it as £1,250.00 in emails and entries. The mode sets the keyboard shown on phones and the check made when the form is sent. The mode is the check, so you don’t need a “Must match” pattern as well. Email accepts any correctly formed address, whatever the domain ending. Choosing Email also sets Browser auto-fill to Email for you.
Minimum / maximum characters

Length limits. Leave both at 0 for no limit of your own.

  • With a maximum set, a live count shows under the box, like GOV.UK’s character count.
  • People can type or paste past the maximum. The count then says how many characters too many, and the form asks them to shorten the answer when they continue or send.
  • A line break counts as one character.
Must match (regular expression, no slashes)A regular expression (no slashes) the answer has to match, for example ^[A-Z]{2}[0-9]{6}$. Give it a clear “pattern” error message.
Must match another fieldBlocks submit unless this box is typed identically to another field you pick. The usual use is a “confirm email” box. See the tutorial in Confirm a field.
Contact role

Optional. Mark a text field as the submitter’s name, email or phone. On a form with several such fields, it tells the plugin which one identifies the person. It’s used for:

  • the title of each row on the Entries screen, when Name entries by is blank (name, then email)
  • what the Personal Data tools search on
  • with Pro, the case title (Customer name (Form name)), the Customer contact details on the Send emails tab, and Message the submitter

A text field in Email or Telephone mode counts as that role without setting this. When two fields share a role, the first one on the form is used. Leave it blank if the form has only one obvious contact field.

Text area #

A multi-line box for longer answers.

OptionWhat it does
RowsHow tall the box starts. The visitor can drag it larger.
Minimum / maximum charactersLength limits.
Word limitShows a live “words remaining” counter and rejects anything longer.

Radio buttons #

Pick one from a short list. The list is a group, so the Label becomes its legend. Always fill it in.

OptionWhat it does
Options

Edit options… opens a box with two tabs.

  • The Table tab has one row per choice: Name (shown to the visitor) and Data (the stored value). Leave Data blank to store the Name as it is. Enter adds the next row, and so does + Add option. The ▲▼ buttons reorder, and the × button or a right-click deletes.
  • The Data tab shows every option as text, one per line: Name , data (or Name | data), or one word for both. To keep a comma in a name, put the name in quotes, for example "Bins, recycling and waste" , bins. Edit a line, add lines at the end, or paste in a whole list. Changes carry over to the Table tab, and they’re kept when you press Save options.
Filter these options by another answerNarrow this field's choices by the answer to another dropdown / radio / checkbox on the same page. See Relational fields for how the Group tagging works.
Option layoutStacked, or side by side when there's room.
Describe this box with an alertPer choice, links that choice to an alert field, so screen readers read out the extra note.
Pre-select from the query stringThe form checks the page’s query string. If an option’s query string match text (or its stored value) appears in it as a whole word, that option is chosen. The query string is kept for the whole form, so it still works on later pages. See Pre-fill from the query string.
Watch out More than about a dozen radio buttons is hard to move through with a keyboard. Use a Dropdown instead.

Checkboxes #

With no options, it's a single yes/no tick (good for “I agree”). Add options and it becomes a “choose any” list.

OptionWhat it does
OptionsAdd choices to make it multi-select. Remove them all for a single box.
Minimum / maximum selectionsHow many the visitor must / may tick.
Option layoutStacked or side by side.
Pre-select from the query stringWorks the same as on radio buttons. See Pre-fill from the query string.

Dropdown #

Pick one from a longer list. Options work the same as radio buttons, including Pre-select from the query string. Set a field width to stop a long list stretching the box.

OptionWhat it does
Let visitors search by typing

Off by default. Turn it on for a long list, like a hundred council services or every UK police force. The box becomes a search that narrows the list as people type.

  • It’s worth it once scrolling a plain dropdown gets tedious, but not for a handful of options.
  • GOV.UK had no component for this when we checked in October 2026. It’s built on the combobox pattern from the World Wide Web Consortium (W3C) Accessible Rich Internet Applications guidance. See Our own design.
  • With JavaScript off, or while the page is still loading, the visitor gets the plain dropdown. How the answer is sent and stored doesn’t change either way.

Slider #

A number chosen on a track. The current value shows beside it, and arrow keys move it exactly, so it works without a mouse. A slider always has a value, so “required” does nothing for it.

OptionWhat it does
Minimum / MaximumThe ends of the track.
StepHow far each nudge moves.
Unit labelShown after the value, and added to the value screen readers are given. Set one so the number makes sense on its own.
Show a number box beside the sliderOff by default. Turn it on to add a text box for typing an exact figure, useful on a long range. The value already shows next to the slider without it.

Star rating #

A row of stars for a quick score. The visitor picks a whole number of stars. There are no half stars. It’s a normal radio group underneath, so arrow keys work. Each star is named for screen readers, such as “5 stars out of 5”. The answer is stored as the number and shown as “3 out of 5 stars” on the summary, in emails and in the spreadsheet export.

OptionWhat it does
Number of starsBetween 2 and 10. Five is the usual choice.
RequiredWhen on, the visitor must pick a rating before the page will submit.

Date #

Three boxes in the order day, month, year, following the GOV.UK date input component. Answers are written DD-MM-YYYY on the summary, in emails and in the spreadsheet export. There is no month-first option.

OptionWhat it does
Allowed datesAny date, past only, past or today, future only, or future or today. Use past only for a date of birth.
This is a date of birthLets a browser offer to fill it from a saved profile.
Use the browser’s native date picker instead of separate day / month / year boxes

Off by default. For dates people already know, GOV.UK’s guidance, and this plugin’s default, is three separate boxes for day, month and year. See the GOV.UK date input component (opens in new tab). The three boxes also look the same in every browser.

Only turn this on if your organisation has a specific reason to want one date box with the browser’s own calendar. Keep the three boxes for dates of birth too. In our tests with NVDA in Chrome, the browser’s date box wasn’t read as “required”. Whichever you choose, the stored answer and every token, rule and export look exactly the same. See Has known limits.

Default valueFills the boxes when the form opens. The visitor can still change it, unless Read only is ticked. It understands today, an offset such as today + 7 days / today + 20 workdays (also weeks, months), or a plain date like 15-01-2026.
Check against another dateCompare this date to another date field: on or after it, on or before it, at least N days after it, or within N days of it. Give it a “compare” error message. See Working with dates.
Block UK bank holidays Pro, coming soon

With Pro, tick Also block UK bank holidays to turn away any date that falls on one.

  • Pick the region: England & Wales, Scotland, Northern Ireland, or all of them.
  • This region choice belongs to the date field. The form’s Bank holidays for working days setting doesn’t change it.
  • Write your own “bank holiday” error message if you like.
  • It uses the GOV.UK list of bank holidays, and a copy of that list comes with the plugin. Each plugin update brings a newer copy.
  • To fetch the latest list from gov.uk once a week as well, turn on Keep the list up to date in Settings, General.

Every date field, with or without Pro, also has Days that can be picked. Untick Saturday and Sunday to allow weekdays only, or tick any mix of days. Leaving all seven ticked allows any day.

Time #

A short box for a time of day, like 09:30. GOV.UK had no time component when we checked in October 2026, so this follows its guidance for an answer of a known length: a text box sized to fit (five characters wide for 24-hour times), with the number keypad on a phone when no letters are needed. The visitor can always type the time.

OptionWhat it does
Time format24-hour only (the default, like 14:30), 12-hour only (needs am or pm, like 2:30pm), or Either. It sets what the visitor may type and how the answer is shown back to them on the summary, in emails and in the PDF. Either shows 24-hour.
Also offer a clock to pick fromOff by default. Adds the browser's own time picker under the box. Choosing a time fills the box in the field's format, and the visitor can still type instead.
Earliest and latest time allowedOptional, in 24-hour, like 09:00 and 17:00. A time outside them shows the “outside the earliest and latest you set” message.
Must be later thanOptional. Pick another Time question, and this answer must be later than it, like an end time after a start time. Leave it as None when the time can fall on the next day, like the end of a night shift.

What people may type: 09:30, 9:30, 09.30, 0930 and 930 for 24-hour, and 9:30am, 9.30 pm, 9am and 9:30 a.m. for 12-hour. Whatever they type, the answer is stored as 24-hour HH:MM, so exports and comparisons see one shape. The error messages you can reword are left empty, wrong type, outside the range and not later than the other time.

Measurement #

A height, distance, weight, volume, area or temperature that people can give in their own units. When you allow more than one unit, a Unit dropdown shows. Feet and inches, and stone and pounds, show two boxes.

OptionWhat it does
What is measuredHeight, length or distance (centimetres, metres, millimetres, kilometres, feet and inches, feet, inches, yards, miles), Weight (kilograms, grams, stone and pounds, stone, pounds, ounces, tonnes), Volume (litres, millilitres, UK pints, UK gallons, UK fluid ounces, cubic metres), Area (square metres, square centimetres, square feet, hectares, acres, square kilometres) or Temperature (Celsius, Fahrenheit).
Units the visitor can choose fromTick each unit people may use. The first ticked unit is picked to start with.
Formulas and rules useThe unit every answer is converted to. Formulas, show and hide rules, and the lowest and highest limits all use it, whatever unit the visitor chose.
Your own unitsOptional. Units that are not in the list, one per line: a name, an equals sign, and how many of the “Formulas and rules use” unit one of it is. With centimetres, hands = 10.16 lets people give a horse’s height in hands.
Round the converted answer toWhole number, or 1, 2 or 3 decimal places.
Lowest and highest allowedOptional limits, in the unit above. For people, leave room for everyone: the tallest person on record was 272 cm and the heaviest about 635 kg, and a premature baby can be 25 cm and 0.3 kg. The example form allows 20 to 300 cm and 0.2 to 700 kg.

Emails, entries and the summary show what the visitor typed and the converted value, like 5 ft 10 in (177.8 cm). In a formula, [height] is the converted number, so a body mass index (BMI) from answers in any units is [weight] / ([height] / 100 * [height] / 100) with height in centimetres and weight in kilograms.

Address #

Line 1, town and postcode, plus an optional line 2, and county and country you can switch on.

OptionWhat it does
Include address line 2 (always optional)Show or hide the second line.
Include countyShow or hide the county box. When shown, it is required or optional in step with the field's own Required setting.
Include countryShow or hide a country box (a plain text box, after the postcode). Off by default. When shown, it follows the field's Required setting, the same as county.
This address isThe person's own, a billing address, a delivery address, a business address (kept in its own autofill group), or “don't offer autofill”.

Find address: postcode lookup

Turn this on at Settings → Connections and a Find address box appears above every address field. The visitor types their postcode and presses the button, and the town, county and country fill in.

A form can have as many address fields as it needs. Each one gets its own Find address box and fills only its own boxes.

That gets you the postcode area, not the exact house. For a proper “pick your address from a list” with house and flat numbers, you need the Pro add-on and an address provider. You sign up to a provider yourself. HolmesPortfolio doesn’t supply one, and the provider may charge. Then connect it on the same Settings tab:

  1. Choose getAddress.io, Ideal Postcodes or Ordnance Survey Places, or a custom endpoint.
  2. Paste your API key.
  3. Press Test a postcode to check it.

File attachments #

Drag-and-drop or browse for files. Files are attached to the email. They aren’t kept in Entries. The site holds them only until their emails have gone, then deletes them. The first time you add this field, the builder shows a short note about handling uploads safely. Once you’ve read it, tick Don’t show this again on this computer.

Showing an uploaded image in the email. By default the email lists only the file name and size. To show the picture in the message, put [img:data-name] in the email body. For example, use [img:photo] for a field whose Data Name is photo. The Insert bar in the email editor has a “… image” button for each upload field that adds this for you.

OptionWhat it does
Accepted file typesAny combination of PDF, JPEG, PNG and BMP.
Maximum size in MB (per file and total)

Caps each file and the total of all the files in this one field, from 1 to 50 MB.

Separately, the whole submission (every upload field added together) is capped at 20 MB, so the notification email can be sent. Going over gives the visitor a clear “Your uploaded files add up to more than 20 MB, which is too large to email” error instead of a silent mail failure.

Maximum files (1–5)Up to five.
Watch out The total also has to fit within your mail server's attachment limit, which is usually 10–25 MB.

Handling uploads safely

An accepted file type isn’t the same as safe contents. A genuine PDF or image can still carry something harmful. Checking and handling what people send is your responsibility as the site owner. To help with that:

Content & controls #

Alert / notice #

A block of text on the page: guidance, a warning, or something to agree to. It’s part of the page, so screen readers reach it along with the fields. In the text you can use:

OptionWhat it does
Label (internal)A name used only in the builder and in entries. The visitor never sees it.
Style

Notification banner, Inset text, Warning text or Error message.

  • Notification banner, inset text and warning text follow the GOV.UK components of the same names, with the differences listed in Which questions follow GOV.UK.
  • The banner’s “Important” title is a heading, at a level that fits where the notice sits.
  • Warning text starts with a hidden word “Warning”, and an error message starts with a hidden “Error:”. That’s true in every style, so the meaning doesn’t rest on colour alone. In GOV.UK style, warning text also shows GOV.UK’s “!” icon.
  • Error message is our own style. When we checked in October 2026, GOV.UK’s only page-level error component was the error summary, which lists answers that need fixing.

See Which questions follow GOV.UK.

Add a “confirm you have read this” checkboxTurns the notice into something the visitor must accept before continuing. On warning text, the tick box sits just after the warning. Give it a “not confirmed” error message.

Three blocks come with the plugin. They start locked, so they can’t be deleted. Unlock one from the field-list bar to hide it or clear it out.

Pick one in the Find a block box under the field list and press Insert.

Hidden field #

A value the visitor never sees. It’s included in the entry and the emails. It’s left out of the answers summary, unless you type its [data-name] token there yourself. Use it to record where an enquiry came from, to copy an answer, or to calculate something.

A hidden field that records something about the signed-in user, or a value from the page address, gets a note in Form check. People can’t see what it collects, so say in your privacy notice what it records and why.

Value comes fromWhat it does
A fixed valueA value you type. It’s saved with every submission.
Another field on this formMirrors that field's answer.
A calculation from other fieldsA one-line formula, or a list of steps for anything that needs a condition. See Variables & calculations.
A URL query parameterReads a value from the page's web address by name, such as ?ref=spring → the value spring. See the tutorial below.
The logged-in userTheir display name, email, ID or username, when they are signed in.

Record where an enquiry came from

  1. Add a Hidden field. Set its Data Name to source.
  2. Set Value comes from to A URL query parameter and type ref as the parameter name.
  3. Link to the form as /contact/?ref=spring-mailer. That submission stores source = spring-mailer. A plain visit stores nothing.
  4. Put [source] in the internal email, or use [all-data] to include every hidden field at once.

Button #

One button that does a different job depending on Does: Go to next page, which shows as Continue, or Submit the form. A new button starts on Go to next page. A Back button appears by itself whenever there’s a previous page, and on any page a visitor opens from Check your answers. Back keeps what was typed on the page without checking it. Only Continue checks a page and saves its answers. Leave the label blank to use the usual wording for the button’s job.

A Submit the form button also has a Hide the Back button on this page tick box. It’s useful on the automatic Check your answers page, where each answer already has its own Change button. An Answers summary has a Go to button for each page instead.

What staff see as the Answers section on an entry is set per form, by the Case view box on the Setup tab.

Email action #

Sends an email when the form is submitted. Add as many as you need.

Walk through it Forms → Form tutorial → “Send an email when the form is sent” shows who it goes to, the subject and body with [all-fields], and how to test it.
OptionWhat it does
Name (admin only)A label for this action in the builder and logs. Not shown to the visitor.
To / CC / BCC

Type real addresses, one per line. Or press a chip under the box:

  • Each email question has its own chip. It adds the question’s name in square brackets, like [email], and the email goes to the address the visitor typed there.
  • The Group inbox chip adds [group-inbox]. It shows when the form has a team mailbox set on the Setup tab.

Only this box decides who gets the email. A visitor can’t add other recipients.

From nameThe sender name. Falls back to the form's title, then the site name.
SubjectPlain text. Tokens like [name], [page-title] and [case-reference] are filled in. See the full list of built-in tokens. Left blank, the subject is the form title and the reference.
Attach files uploaded through the formOn by default. Turn it off for emails that do not need them, such as a confirmation to the visitor. When it is on and the submission included files, the email ends with a short safe-handling line for the recipient.
Attach a PDF of the answers Pro, coming soonOnly shown with the Pro add-on. Attaches a tagged PDF of the whole submission to this email. It’s good on the team notification. Leave it off on the copy sent back to the person who filled in the form.
Body formatHTML or plain text.
BodyWritten in a line-numbered editor. It checks the markup and the tokens before it lets you save. Insert tokens from the bar above it, which always offers Case reference and Page title alongside your own fields. See the full list of built-in tokens.

Submit message #

What the visitor sees after a successful submit, in place of the form. It can be HTML or plain text.

Answers summary #

Let people check their answers before they send the form. Adding an Answers summary replaces the automatic “Check your answers” page.

It starts with the answers already written out as HTML you can edit:

The answer lines sit in a list (<dl>), which keeps each answer with its question in the page’s code. You can edit, move or delete any line. The All fields button under the editor puts the full list back in.

A question you add to the form later doesn’t appear in the summary until it has a line. The editor names any missing question under Not in this summary. Add its line yourself, or press Update from the form to rebuild the whole summary. That replaces your edits, so you press it twice to be sure.

When the summary shows on the form:

Watch out The parts of a line that start with data-hpf- tell the plugin which page or question the line belongs to. An example is data-hpf-field="your_name". When you edit a line, leave that part in place. Without it, the line still shows when a rule hides the question. A blank answer won’t say Not answered either. On a Go to button, keep the hpf-cya__goto class as well. It gives the button the form’s button style.

You can type [all-fields] instead, as a shortcut. It shows the full list, but you can’t edit its lines.

Answers show in words people can read:

The Pro PDF groups answers the same way. So does [all-fields] in an email. The summary’s editor offers the same built-in tokens as an email action, so [page-title] and [case-reference] work here too.

The plugin builds the summary on the server, from the same answers the emails use. File names are the one exception. The visitor’s browser fills those in.

Visitors can’t change answers in the summary itself. The Go to button takes them back to that page, with their answers still filled in. The summary doesn’t save anything, so it doesn’t need a Data Name.

A page opened this way has a Back button, even if it’s the first page. Back returns the visitor to the summary and drops any edit on the page. The answers they had already confirmed stand. Continue saves the edit and returns them to the summary, without taking them through every page again.

A declaration tick box such as “I confirm my answers are true” can be set to clear when another answer changes, so the visitor ticks it again for the answers they now have.

The button at the bottom of the summary sends the answers it showed. If they’ve changed in the meantime, for example in another browser tab, the summary shows again with the message “Your answers have changed since this page was last shown. Check them, then use the button below.” If the server refuses a send because an answer needs fixing, the visitor goes to that page. From there, Continue moves to the next page with a problem, or back to the summary once there are none left.

The automatic Check your answers page works the same way. It has a Change button for each answer, where the summary has a Go to button for each page.

Groups (containers) #

A group (container) is a box you drag questions into. You don’t have to use one. Questions work the same in or out of a group.

What a group adds is a name. Give it a Title and that becomes a heading over its questions. The heading shows on the form, the check-your-answers page, the emails and the PDF. Leave the title blank and the group adds no heading. The heading levels around it still run in order, with none skipped.

The first time a page has a question outside a group, the builder shows a tip. Group them puts those questions in a group for you. Don’t show again hides the tip. Either button hides it for good, for you only.

Under Layouts in the component palette there are three kinds:

To move a question into a group or out of one, pick from the Group list in the question’s settings. You don’t need to drag it.

A repeatable group needs the Pro add-on. It has a few rules worth knowing:

Walk through it Forms → Pro tutorials → “Let people fill in a Repeatable group more than once” shows how: add a Repeatable group, put questions in it, and set how many entries.

Each container takes an optional Title. A titled group is a real <fieldset>, with a heading at the right level in the page outline. The title and its questions stay together in the “Check your answers” step, the emails and the Pro PDF. Leave the title blank for an invisible wrapper.

Show a whole group of questions together, not one at a time

  1. Drag a Conditional group onto the page. It opens its own Show / hide rules straight away.
  2. + Add condition: pick “How would you like us to respond?”, operator is, value By phone.
  3. Save, then drag in the questions that only make sense for a phone reply, such as the best time to call.

The difference from a field's own rule (above): every question inside a conditional group appears or disappears as one block, so related questions never end up half-shown.

Every field's common options #

OptionWhat it does
Data Name

The short key for the answer. Write it in square brackets, like [name], to use the answer in formulas, text, emails and default values. The panel shows this under the box. It also names the column in the spreadsheet export. Lower-case letters, numbers, - and _. Must be unique on the form. A few names, such as reference, belong to built-in tokens and can’t be used. If a Data Name is one of those, or another question already has it, saving the form renames it with a number on the end, like reference_2. Form check warns you before you save, and a notice after saving says what changed. An imported form gets the same treatment.

A new question takes its Data Name from the label as you type it, so “Your name” becomes your_name. If that name is already taken, a number goes on the end, like your_name_2. It works the other way too. Type the Data Name first and it fills in the label, so your_name or your-name gives the label “Your name”. If you type capitals, the label keeps them. The Data Name itself is saved in lower case, so NAME gives the label “NAME” and the Data Name name. The Data Name box shows the lower-case version once you leave it. Once you type in a box yourself, the other box stops filling it in, so your own wording stays as you wrote it. You can change the label at any time. A saved question keeps its Data Name when you change its label, so its stored answers and tokens keep working. Its label stays the same when you change its Data Name, too.

Change it and leave the box, and the builder updates every place in this form that used the old name. That includes show/hide rules, formulas and email recipients, plus tokens and <if> blocks in text and emails. It also updates the entry title and any setting that points at this field, such as Must match another field or a filtered dropdown. A note under the box says how many places it updated.

  • Entries already saved keep the old name. The note says so when the form has entries.
  • A rename doesn’t change links that pre-fill the form. They use an option’s own text or a hidden field’s parameter name, not the Data Name. See Pre-fill choices from the query string.
  • With Pro, the form’s mailing-list settings follow the new name once you save the form.
LabelThe question. Shown above the field, or as the legend for a group. Screen readers need it, and Form check flags a missing one. It can include a token to read back an earlier answer, for example Tell us about [pet_name].
Hint

Help under the label, read out with it.

  • It can run to several lines. Wrap a paragraph in <p>…</p> for spacing. There’s no need for <br>.
  • You can add a link (<a href>), plus <strong> and <em> for emphasis. That’s enough to point at a privacy or terms page right under the question.
  • It takes a token too, for example We'll use [pet_name] throughout this form.

Left blank, some fields show the example hint GOV.UK uses:

  • “Select one option” on radio buttons
  • “Select all that apply” on a list of tick boxes
  • “For example, 27 3 2007” on a date, in the order of your boxes and with a date the field would accept
  • “For international numbers include the country code” on a phone number

Write your own hint to replace it. These hints only show in GOV.UK style mode.

A Time question left without a hint gets one that matches its format, such as “Use the 24-hour clock, like 13:00”. That one shows in every style mode.

RequiredWhen on, an empty answer is turned away with your “required” message. On the form, questions that aren’t required are labelled “(optional)”, as GOV.UK does. In the builder, a required field shows a *.
Field widthHow wide the box is: full width, or about 5, 10, 20 or 30 characters. Narrow widths suit postcodes, reference numbers and the like. Match the width to the length of a real answer. Form check flags a text field set to about 5 or 10 characters when nothing limits the answer to that length. A longer answer would scroll out of sight inside the box. Number and money boxes aren’t flagged, because a short box suits a number.
Error messagesYour own wording for each way the answer can be wrong: missing, wrong format, too long, out of range, not matching and so on. Leave one blank to use the built-in text shown in brackets. It can include a token too, for example Please double-check [pet_name] before continuing.
Browser auto-fill

Off, or a purpose, so a phone or laptop can offer a saved value. Some assistive tools also use it to show what the box is for. Setting it on any field that asks for the visitor’s own information is what the Web Content Accessibility Guidelines (WCAG) ask for, in success criterion 1.3.5.

  • The list is the full WCAG 2.1 set of input purposes, grouped: Name, Contact, Address, Work & account, Payment card, Dates & personal, and Other.
  • If yours isn’t listed, pick Something else… and type the raw value, for example shipping address-line1.
  • Choosing Email as the input mode fills this in for you.
Show / hide rulesShow or hide the field when other answers meet a condition. See Show / hide rules below.
Clear this field's answer when it is hiddenWhen on, an answer given before the field was hidden is wiped, so the box is empty if the field shows again. When off, it is kept in case the field comes back. Either way, a field that is hidden when the form is sent never has its answer saved, emailed or sent to a webhook.
Clear this field's answer when any other answer changesWhen on, this answer is emptied whenever the visitor changes an answer on another page and presses Continue. Back doesn’t count, and nor does Continue with nothing changed. Use it on a declaration tick box such as “I confirm my answers are true” on the Check your answers page, so the tick only ever stands for the answers the visitor saw when they ticked it.
Read only

A checkbox on text, text area, dropdown, radio, checkbox and date fields, in the Starting value section. On text, text area and date it sits under Default value.

  • The field shows its value (a default value, or an option picked by the query string) in a greyed box the visitor can’t change.
  • The value is still submitted and stored.
Default value

On text, text area and date, in the Starting value section. It fills the box when the form opens, and the visitor can still change it unless Read only is on. A date understands its own shapes, such as today + 7 days (see Date). Dropdown, radio and checkbox have no default value. To choose one of their options in advance, use Pre-select from the query string.

  • It can include a [data-name] token to pull in an answer from an earlier page, or a variable’s value. For example, a default of [full_name] fills this box with the name from page 1, and Reference [your_ref], complaint builds a line from an answer.
  • A token for a field not answered yet (on a later page, or this one) shows nothing.
PageMoves the field to the end of another page. Choosing a page also takes it out of any container.

Only ask a question when it's relevant

  1. Add a Radio buttons field, Do you have a reference number?, with Yes and No.
  2. Add a Text input field for the reference number below it.
  3. With the text field selected, go to Where it shows in the options panel and press Add show/hide rules…
  4. Add a rule: Do you have a reference number? is yes.
  5. Tick Clear this field's answer when it is hidden if a visitor who changes back to “Yes” should start with an empty box. A hidden field's answer is never saved or emailed either way.

The rule only uses a radio button answer on the same page, so the reference box is already in the page, hidden. It appears the moment the visitor picks “Yes”. While it’s hidden, nobody can see it or reach it with the keyboard or a screen reader. A hidden field isn’t checked.

Confirm a field #

The Must match another field setting on a Text input field blocks submit unless it’s typed exactly the same as another field. Spaces at the end are ignored. It works for any pair, such as a reference number typed twice, not only email.

Add a “confirm email” box

  1. Add a Text input field, Data Name email, Input mode Email, Required.
  2. Add another Text input field below it, label Confirm email address, Input mode Email, Required.
  3. In the second field, set Must match another field to Email address.
  4. Fill in its “If it does not match the other field” error message, for example “This does not match the email address above.”

Pre-fill choices from the query string #

Turn on Pre-select from the query string on a radio, checkbox or dropdown field, and each option gets a small query string match box.

Send people to the form with a team already chosen

  1. Add a Dropdown, Which team is this for?, with options Housing, Benefits, Council tax.
  2. Turn on Pre-select from the query string. In each option's query string match box put a short unique code, HOUS, BEN, CTAX.
  3. On the benefits landing page, link to the form as /contact/?team=BEN.
  4. Anyone arriving from that link sees Benefits already chosen. They can still change it.

Keep the codes distinctive so one can't accidentally appear inside another part of the URL.

Multi-page & conditional pages #

Add pages with the + tab. Each gets a Continue button automatically, and a Back button whenever there is a previous page. Give every page a title. It becomes the page heading, which screen readers can announce, and it names the step in the progress text.

The title on the browser tab changes with each step, too. It reads the page heading, the step and then the page’s usual title, such as “The fault – Step 1 of 3 – Report a repair – Example Housing Ltd”.

Back shows the previous page as the visitor last saw it. Anything typed on the page they leave is kept, and it’s there again when they return. Nothing on it is checked. Only Continue checks a page and saves its answers. The browser’s own Back and Forward buttons work the same way as the form’s Back for the page being left.

Split a long form into pages

  1. Press the + tab next to the page names to add a page. Click a page name to switch to it, and type a Page title at the top.
  2. Move a field between pages by dragging its row onto a page tab, or with the Page selector in the field's settings.
  3. Reorder pages with ← Move / Move → on the page header row.
  4. Remove a page with Delete page on that row. It deletes the page’s fields too, so move anything you want to keep first. The button is hidden when there’s only one page.

A single-page form needs no Continue step. It shows only a submit button. Pages are worth it once a form runs past a screen or two, or when a whole section only applies to some people (see below).

A page can have its own show/hide rule, set on the Setup tab. Choose whether the page is shown only when or is hidden when the condition passes, whichever reads more naturally. A page that ends up hidden is skipped entirely:

Base a page’s rule on a question from an earlier page. The rule is checked when the visitor reaches the page, so an answer on that page or a later one isn’t known yet. Going forward the page is skipped, and it only appears if they come back to it. The Setup tab warns you when a page rule uses a question like that.

Only ask for a postal address when they want one

  1. Add a page for the postal address, with an Address field on it.
  2. On the Setup tab, under Show or hide pages, find that page and set This page to is shown only when…
  3. + Add condition: pick the earlier “How would you like us to respond?” field, operator is, value By letter.

Anyone who picked email or phone never sees the address page at all. It isn’t skipped after the fact. It was never in their route through the form.

Show / hide rules on a field or group #

Any field, and any group, can carry the same rule:

  1. Press Add show/hide rules… under Where it shows in the field’s panel.
  2. Pick is shown only when or is hidden when.
  3. Build the condition. Each row has a subject (another answer or a variable), a test (is / is not / contains / greater than / empty…) and a value. When the subject is a multiple-choice field, you pick the value from that field’s own options instead of typing it.

A plain-English line under the rule shows how it reads. A few things to know:

Watch out Show and hide doesn’t keep anything private. A question or notice hidden by a same-page rule is already in the page, so anyone can read its wording in the page’s source. A notice with an answer in its text is the exception. That text only reaches the page once it’s shown. Keep private details, such as a discount code or a private phone number, out of a question’s wording.

Show one field only when another answer needs it

  1. Add the follow-up field, say a Text area called “Tell us more”.
  2. Select it. Under Where it shows, at the bottom of its settings, press Add show/hide rules…
  3. Keep is shown only when… selected. Then + Add condition: subject “How did we do?”, test is, value Not happy.
  4. Tick Clear this field's answer when it is hidden so the box starts empty if it shows again. While it’s hidden, the note never lands in the entry either way.

It works the same on a whole group (to hide a section) and on a page (Setup tab → Show or hide pages). A hidden field can’t be reached with the keyboard or found by a screen reader. It isn’t checked or required. Every rule is checked again on the server when the form is sent.

Walk through it Forms → Form tutorial → “Show or hide a question” walks through this rule, then shows the same editor for whole pages.

Relational fields: one dropdown filtered by another #

A dropdown, radio or checkbox can have its choices narrowed by another choice field on the same page.

  1. In the dependent field’s settings, set Filter these options by another answer to the controlling field. Its options become groups.
  2. In Edit options, each row now has a Group column. Tag each option with the group it belongs to.

On the form, choosing a value in the controlling field shows only the options tagged with that group. Options left as “Any” always show. Until the controlling field is answered, every option shows.

Variables & calculations #

Both a computed variable (on the Setup tab) and a hidden field set to “a calculation” work from other answers. They never appear on the form by themselves. Use them in rules, text and emails. Reach for a variable when you want the value in more than one place. A hidden field’s calculation is a one-off.

Walk through it Forms → Form tutorial → “Work things out” sets up a variable, writes a formula, works out an age or a number of days, and shows where to use the result. “Every calculation, step by step” and “Costs, pay and dates, step by step” then read through every calculation on two starter forms.

Each variable is a titled card. It has a Name and an optional Note for you and your team. Its Key is suggested from the name, and you can change it. Change the key and leave the box, and the builder updates every place in this form that used the old one. It works the same as renaming a Data Name. Write the key in square brackets, like [key], in formulas, text, emails and default values. Formulas also accept {key}. The formula box checks the names as you type. It warns if one names nothing on the form, or if a [ or ] is missing.

What to use one for

GoalHow
A statutory or service-level deadlineA variable due = [date_received] + 20 workdays, shown in the acknowledgement email as [due] and used in a page rule for a “we are overdue” message.
Route to the right teamA variable dept set by Advanced steps (“set to Housing only when topic is rent”…), then put each email action in a conditional group whose rule checks the dept variable. Only the matching notification sends.
A priority scoreAdd points from several answers (set to 0, then add 3 only when vulnerable is yes…) into score. Show [score] in the staff email, or use it in a rule to show an “urgent” alert.
A tidy email subject"Enquiry from " & [first_name] & " " & [last_name] in a variable, used as the subject so every notification is easy to spot in an inbox.
An eligibility flagA variable may_qualify = set to Yes only when [income] < 30000. Show it to staff, or use it in a page rule to reveal a follow-up section.
An amount to pay[quantity] * [unit_price] in a variable, then set the Pro Payment field’s amount from it.

The formula box #

Type a calculation as you would on a calculator: multiply and divide happen before add and subtract, and brackets go first. Build it from the buttons below the box, or type it in. The buttons are grouped by what they do: Maths (add, subtract, multiply, divide, brackets), Text (join), Dates (days, weeks, months, working days), Functions, Answers and Other variables. They write answers and variables in square brackets. How the formula works under the box spells out the rules.

[quantity] * [price] + 5
"Ref " & [order_no]
[start_date] + 7 workdays

Functions works out a number from dates or times. Choose what to Work out:

Press Insert to add it to the formula. The formula names each answer in square brackets, so you can change it by typing.

Open Try it with sample values under the box to check the formula: type a value for each answer or variable it uses and press Preview. The result is worked out by the same engine the live form uses, so what you see is what a submission would get.

In a formulaMeans
[name]A field's answer, or a variable's value, like [score]. {name} also works in a formula.
+   -   *   /Add, subtract, multiply, divide numbers. x also multiplies. Multiply and divide happen first, as in normal maths.
(   )Brackets work out first. A BMI from weight in kg and height in cm: [weight] / ([height] / 100 * [height] / 100).
&Join as text: "Order " & [ref].
+ N daysMove a date on. Also weeks, months, workdays and workweeks. Working days skip the days outside your working week and the bank holidays you leave out. Both are set in Settings, General. A form can pick its own bank holidays on its Setup tab. A negative number goes back.
age([dob])Whole years from a date to today, for example an age from a date of birth. age([dob], [on_date]) works out the age on another date.
days_between([from], [to])The number of days from one date to another. Use today for either date.
hours_between([start], [finish])The hours from one Time answer to another, like 7.5. A finish earlier than the start counts as the next day, so a night shift from 22:00 to 06:00 is 8 hours.
min([a], [b]) / max([a], [b])The lowest or highest of the amounts, ignoring any left blank. For example, a refund capped at £50 is min([refund], 50).
convert([weight], kg, lb)Changes a number from one unit to another of the same kind. Units: mm cm m km in ft yd mi, g kg st lb oz t, ml l pt gal floz m3, cm2 m2 ft2 ha ac km2, and c f for temperature. Use Round the result to to tidy the answer.
"text"A literal piece of text.
todayThe current date, as DD-MM-YYYY.
25-12-2026A date, written day-month-year. 25/12/2026 works too.

Round the result to picks the decimal places: Whole number, or 1, 2 or 3 decimal places. Show before the number and Show after the number add a unit wherever the value is shown, such as £, cm, kg, % or kg/m². So 22.857 rounded to 1 decimal place with kg/m² after it shows as 22.9 kg/m², and the Money shortcut shows 37.5 as £37.50. Rules compare the rounded number without the unit.

For anything that needs a condition, such as “add 2 only when urgency is high”, use the step list under Advanced. Each step has an operator (set to, add, append text, add working days to the date…), a value, and an optional only when condition.

Operators, conditions

OperatorTrue when
is / is notThe value matches, or doesn't.
contains / does not containThe text (or a ticked choice) includes the value.
is greater than / is less thanNumber and money comparisons. £1,250.50 and 1250.5 count as the same amount.
is before / is afterDate comparisons. Compare with a date such as 25-12-2026, with today, or with today + 14 days.
is empty / is not emptyThe field has no answer, or has one.

Three worked examples #

A formula does three kinds of work: sums with numbers, joining text together, and moving a date. Here’s one example of each. The date example is further down, in Working with dates. Check any of them with Try it with sample values under the formula box.

Maths: work out an amount from two answers

  1. Add two Text input fields with Input mode set to Number: Quantity (qty) and Unit price (price).
  2. Add a variable, Name Order total, Formula [qty] * [price] + 5. The + 5 is a flat delivery charge.
  3. Show [order_total] in the confirmation email, or use it as the amount in the Pro Payment field.

Text: build a line of text from answers

  1. Add a variable, Name Email subject line, Formula "Enquiry from " & [name]. Click the Full name button under Answers rather than typing the key by hand. A field’s key isn’t always the same as its label.
  2. Use [email_subject_line] as the subject of the internal notification, so every enquiry reads clearly in an inbox without opening it.

Working with dates #

The date maths in a formula, a date default, and the check against another date all read the same shapes: a date field's answer, today, a date like 10-06-2026, or an expression like today + 20 workdays. Write dates day-month-year. Results come back as DD-MM-YYYY, which is what a token such as [date_due] prints. A month-first date like 12/25/2026 is not read as a date.

Log the date received and work out a deadline

  1. Add a Hidden field, Data Name date_received. Set Value comes from to A calculation from other fields and put today in the formula.
  2. Add a second Hidden field, date_due, formula [date_received] + 20 workdays.
  3. In the acknowledgement email: “We received your request on [date_received] and will reply by [date_due].”

Stop a “to” date being before the “from” date

  1. Add two Date fields, date_from and date_to.
  2. On date_to, set Check against another date to date_from, and The rule to On or after that date.
  3. Fill in its “If it fails the check against another date” message: “The end date must be on or after the start date.”

Tokens #

Tokens are placeholders in square brackets that are replaced with real values. They work in:

For example, a hint of “We'll use [pet_name] throughout this form” reads back the name from an earlier question. A token for an answer not given yet shows nothing.

Built-in tokens and your own field names #

A handful of tokens are always available on every form, with nothing to switch on. Most have a distinctive two-part name, so you can still give a field or variable a plain Data Name like title.

A few names belong to built-in tokens, so a field or variable can’t use them:

Type one of these as a Data Name and the builder adds a number, such as reference_2, and tells you. That way your answer doesn’t clash with the built-in value. The same happens when you save: a reserved Data Name, or one already used by another question, gets a number on the end. Form check warns you first, and a notice after saving says which names changed. Imported forms are checked the same way. Then update any rule, email or message that used the old name.

TokenBecomes
[page-title]The form's own title. See below for the automatic heading it adds to HTML emails.
[working-days-note]A sentence saying what a working-day deadline leaves out, for example “Working days are Monday to Friday and leave out bank holidays in England and Wales.” The working week and region are set in Settings, General. If a form picks its own bank holidays on its Setup tab, the note names those instead.
[case-reference]The submission's unique reference, for example ENQ-000042. See below.
[all-fields]Every visible answer as a tidy list, grouped by page. In an email, a tick-box question lists only the options that were ticked. On the check-your-answers page, every option is listed with Yes or No, and any files added are named. Computed variables aren’t in it. Add each one with its own token, or use [all-data].
[all-data]Like [all-fields], but it also includes hidden fields and variables.
[img:data-name]A picture from the form, such as an uploaded image, shown inside the email. See below.
[html:data-name]An alert field's own text, dropped into an email. See below.

Turn on the front-end debugger for a form and these built-in tokens are listed on the published page too, under System variables. They sit alongside your fields and computed variables, so you can see what’s on offer while you check a form works.

TokenBecomes
[data-name]The visitor's answer to that field, using its Data Name.
[variable-name]A computed variable's value.
[case-reference]

The submission’s unique reference, for example ENQ-000042. Emails and the submit message only.

  • The number only ever counts up, so a reference is never reused, even after an entry is deleted.
  • [reference] works the same way.
  • “reference” is kept for this token, so a field or variable can’t use it as a Data Name.
[page-title]

The form’s own title.

  • In an HTML email with no <h1> of its own, one is added using the form title. That way an [all-fields] block’s <h2> group headings always sit under a real top-level heading.
  • Write your own <h1> anywhere in the body (your own wording, or <h1>[page-title]</h1>) and the automatic one is skipped.
  • Plain-text emails have no headings, so this only applies to HTML email actions.
  • A field or variable named “title” works like any other field.
[img:data-name]

Shows a picture from the form inside the email. Use the field’s Data Name, for example [img:photo]. It works for three kinds of question:

  • File attachments: the images the visitor uploaded.
  • Signature Pro, coming soon: the signature.
  • Location on a map Pro, coming soon: a picture of the map as the visitor saw it, with their pin.

How it shows:

  • In an HTML email it’s a small picture. In a plain-text email it’s the file name.
  • The picture buttons on the editor’s Insert bar add the token inside an <if>, so nothing shows when there’s no picture.
  • A new email action’s starting body already has one for each picture question.
  • A signature or map picture you place with the token shows in an HTML email. If you don’t place it, or the email is plain text, the picture is attached instead.
  • Without the token, an upload only appears as its name and size, in [all-fields] or a plain [photo] token.
  • Files that aren’t images are named, never shown.
[html:data-name]

Puts an Alert / notice field’s own text into an email. Use the alert’s Data Name, for example [html:notice1].

  • In an HTML email it’s real HTML. In a plain-text email, the tags are stripped.
  • An alert isn’t an answer, so [all-fields] or a plain [key] token never includes it. This token is how you bring one into an email.
  • It shows nothing if the alert has no text.
[data-name.street], [data-name.town], [data-name.postcode], [data-name.lat], [data-name.lng]

The separate parts of a Location on a map Pro, coming soon answer, where data-name is that field’s Data Name, for example [location.postcode].

  • The plain [location] token still gives the full readable line. Use these when you want one part on its own.
  • If the site uses the plain UK postcode lookup instead of a full address service, [data-name.street] is blank. A postcode alone doesn’t carry a street name.

The Insert bar above each editor (email body, submit message, alert text, Case view) has a button for:

Pressing one adds an editable line like <if email><dt>Email</dt><dd>[email]</dd></if>. The lines sit in a list (<dl>), which keeps each answer with its question in the page’s code. A line you add outside a list gets its own <dl>. The <if> wrapper takes the whole line out when the answer is blank. Delete the two <if> parts to always show it.

Below the editor, All fields adds an <if>-wrapped line for every field, hidden field and computed variable, all inside one <dl>. It’s the same block a new email action starts with, ready to trim. Each line only shows when its value is set.

Editable lines let you choose which answers go in, and in what order. But a question you add to the form later isn’t added to them by itself. The builder helps you catch it:

This only applies to an email with three or more answer lines, the kind the buttons above add. An email that mentions answers in its sentences is left alone, however many it mentions. An example is “Dear [name], we’ll call on [preferred_date]”. If you’d rather not keep track, use [all-fields]. It always sends every answer, including questions added later.

A small Find in this text box above the editor searches only that editor. Press Enter, or ‹ / ›, to step through the matches. Tick Aa to match capitals.

WrapperKeeps the enclosed text…
<if key> … </if>…only when [key] has a value.
<if not key> … </if>…only when [key] is blank.

key is any field's Data Name or a variable name. The blocks can be nested, and any [token] inside is still filled in. This works in email bodies, the submit message and alert text.

In the HTML email and on the check-your-answers page, an answer from a field in Email or Telephone mode becomes a link people can click to email or phone.

Emails #

Use one Email action per recipient group. A common pattern is one email to the visitor and one to your team.

One email to the customer, one to your team

  1. Add an Email action. In To, click the chip for your Email address field so it goes to whoever filled the form in. Add your own address in CC.
  2. Write a short confirmation: thank them, include [reference], don't dump every answer.
  3. Add a second Email action. Put your team inbox in To.
  4. Write the internal version: [all-fields] for the full picture, plus [reference] in the subject.
  5. If the form takes file uploads and your team needs them by email, keep Attach files uploaded through the form on for the team action only. It’s on by default, so untick it on the customer copy.

On Settings → Email, the Email appearance section lets you add a block of CSS, a header and a footer. They wrap every email the plugin sends, for example a logo at the top and an address or unsubscribe note at the bottom. Leave the CSS box empty and a plain built-in style is used.

The same screen has a Default from address. Set it to a no-reply address on your own domain, so the WordPress admin address (often a personal inbox) isn’t shown as the sender.

An email leaves out any question with no answer, so the body only ever shows what was filled in. The check-your-answers page is the opposite: it keeps blank questions so the visitor can see what they skipped.

When a question’s label appears as the label of an answer, its closing question mark is dropped. “What is your name?” shows as “What is your name” above the answer. That happens in emails, on the check-your-answers page, in the entry view and in the PDF. The question on the form itself keeps its question mark.

Add as many email actions as you need. There’s no limit in the plugin, and every one on a page that’s shown sends when the form is sent. Delivery, though, depends on your site’s mail setup, not the plugin. Mail is sent with WordPress’s own wp_mail(). On its own, that uses the web server’s mail program. Its mail often lands in spam, because the sending domain isn’t properly authenticated.

Watch out For any form that matters, and every statutory one, route wp_mail() through an authenticated mailbox with a free mail plugin that uses the Simple Mail Transfer Protocol (SMTP), such as WP Mail SMTP or FluentSMTP. It takes about five minutes to set up. The best choice is usually your own organisation's mail host: a shared mailbox on your Microsoft 365 or Google Workspace, where the domain’s email authentication records are already correct and there is no extra cost. A transactional service (Amazon SES, Postmark, Mailgun, Brevo) is an alternative for high volume or if you would rather not send through a real mailbox. Nothing needs setting up in this plugin: an SMTP plugin changes how wp_mail() sends for the whole site, so every email action follows it automatically. Test with your own address first.

When an email fails. A send that fails is tried 3 times, a few minutes apart. If it still hasn’t gone, it’s stuck, and it joins the Issues tab under Entries. Admins see a red banner on every admin page with the count and an Open Issues button. Staff who can view entries but aren’t admins are asked to tell a site admin instead. The tab’s Sending issues section shows what failed and why. That’s where you try again or remove a send. The banner stays until every stuck send has gone or been removed.

You can also ask internal recipients to add the site's From address to their safe-senders list. That helps their inbox, but it does nothing for the person who filled in the form, and it cannot rescue mail a receiving server rejects outright.

Version history & edit lock #

Every time you save a form, the builder keeps a copy. It keeps the last 30, each with who saved it, when, and the note you gave. The History button on the save bar opens the list. From there you can:

While a form is open in the builder, it’s locked to one editor. Anyone else who opens it sees “This form is being edited by …”, with the time and a Take over editing button. Taking over removes the first person from the builder, and any changes they hadn’t saved are lost. Only the person holding the lock can save.

Catch problems as you build: Form check #

Form check, at the bottom of the builder, shows a running count of problems in the form. It checks how the form is built. It isn’t an accessibility audit. Click it for the list, grouped as Errors, Warnings and Notes. It’s about one form as you build it. Problems with the whole site, such as emails that won’t send, go on the Issues tab under Entries instead. The two have different names so you can tell them apart.

It reads the structure only: labels, legends, choices, keys, error messages, autofill purposes, and a field set narrower than its answer needs.

Tidy up after you remove something #

When you remove a question, a computed variable, a notice or a page, other parts of the form can still point to it. These are leftovers. They include:

Form check lists each leftover under Leftovers from things you removed, and the badge counts them. You can’t save the form until they’re all fixed. Fix each one by hand, or press Remove all leftovers.

The button takes out every leftover apart from those in formulas. A show or hide condition that checks a removed question goes too. So does a calculation step that checks one. Formulas are left for you to fix.

With Pro: mailing lists If your form adds people to a Mailchimp or Brevo list, removing a question that list uses shows as a warning. It doesn’t stop you saving. Saving the form clears that question from the mailing list settings. Then go to Settings → Connections and choose another question under Per-form sync. See Add people to your Mailchimp or Brevo list.
Watch out A clean result is not proof that the form meets the Web Content Accessibility Guidelines (WCAG), and it is not an accessibility statement. Before you rely on a form, especially on a public-sector site, test the published page with a keyboard and a screen reader, or have it audited.

Which questions follow GOV.UK #

This section shows how each kind of question is built, so you know what to check before you publish. Making your forms accessible is your responsibility, as the site owner. The plugin is there to help, and it doesn’t guarantee that any form is accessible.

The questions fall into three groups:

Any question can still cause problems if it’s set up badly, whichever group it’s in. A vague label or a missing hint makes a question harder for everyone.

Only in GOV.UK style The GOV.UK look only shows in the GOV.UK Design System style mode. Bootstrap, Plain and None give the same structure underneath, with labels, groups, hints and error messages. Only the standard GOV.UK hints are left out. They don’t look like GOV.UK.

We tested our own test forms with NVDA 2026.2, a free screen reader, in Chrome for Testing on Windows 11 in October 2026. Where this guide quotes what a screen reader says, it’s what NVDA said in those tests. Other screen readers and browsers can say it differently. We haven’t tested with other screen readers, such as JAWS, VoiceOver or TalkBack. These results are for the setup we tested, not your site. Your forms, theme and settings can give different results.

GOV.UK pattern #

These follow a GOV.UK Design System component or pattern. Where ours differs, the row says how. Two differences apply to all of them: required questions are also marked as required in the page’s code, and a group of radio buttons is also marked as a radio group.

QuestionWhat to check or do
Text inputFollows the GOV.UK text input component (opens in new tab). Write the label as the question. Pick a width that fits a real answer. Set Browser auto-fill when the box asks about the person.
Text input, Email modeFollows the GOV.UK email addresses pattern (opens in new tab). The box turns off the browser’s spelling check, as the pattern asks. Add a “type it again” box only if a mistyped address would cause a real problem.
Text input, Telephone modeFollows the GOV.UK phone numbers pattern (opens in new tab). Say in the hint if you need an international number.
Text input, Number and Money modesFollow the GOV.UK text input component (opens in new tab) for numbers, with the unit or currency sign beside the box. Put the unit in the Unit label, not only in the question. Set a lowest and highest answer.
Text areaFollows the GOV.UK textarea component (opens in new tab). Set the rows to fit a typical answer.
Text area with a word limit, or any box with a character limitWorks like the GOV.UK character count component (opens in new tab), with its “You have 12 words remaining” wording, but with our own markup. People can type or paste past the limit. The count then says how many too many, and the form asks them to shorten the answer when they continue. On a long answer, a word limit is usually easier for people than a character limit.
Radio buttonsFollow the GOV.UK radios component (opens in new tab). Keep the list short. Form check warns you past 12 options.
Checkboxes, with options or a single tick boxFollow the GOV.UK checkboxes component (opens in new tab). If people can tick more than one, say “Select all that apply” in the hint. There’s no built-in “None of these” option. Write a single tick box’s label as a full statement, such as “I confirm the details are correct”.
DropdownFollows the GOV.UK select component (opens in new tab). Use a dropdown only for a long list. GOV.UK says to use one only as a last resort, and to consider radio buttons instead. The searchable version is our own design.
Date, three boxesFollows the GOV.UK date input component (opens in new tab) and the GOV.UK dates pattern (opens in new tab). Each box’s name also includes the question, as well as “Day”, “Month” or “Year”. Tick This is a date of birth for birth dates, so browsers can fill it in. Keep the example hint.
AddressFollows the GOV.UK addresses pattern (opens in new tab), with two differences. On a required address, the county is required too, where GOV.UK leaves it optional. And a Save address button shows the address back as a summary, with a Change address button. Leave county off unless you need it. Pick what the address is for, so auto-fill offers the right one.
Notice, Inset text styleFollows the GOV.UK inset text component (opens in new tab). Use it for ordinary guidance.
Notice, Notification banner styleFollows the GOV.UK notification banner component (opens in new tab). Its “Important” title is a heading, at a level that fits where the notice sits, where GOV.UK always uses level 2. GOV.UK puts a banner at the top of the page. Ours sits where you put it in the form. It’s the style a new notice starts on. Use one banner on a page at most, and inset text for the rest.
Notice, Warning text styleFollows the GOV.UK warning text component (opens in new tab), with its “!” icon in GOV.UK style. In every style it starts with a hidden word “Warning”, so the meaning doesn’t rest on colour alone. GOV.UK marks the text as bold in the page’s code. Ours shows it bold but doesn’t mark it that way. A “confirm you have read this” tick box sits just after the warning. Keep it for things that matter, such as a legal duty.
Notice with a “confirm you have read this” tick boxThe tick box follows the GOV.UK checkboxes component (opens in new tab), and the notice is linked to it. Write a confirm label that says what people are agreeing to.
Error summaryFollows the GOV.UK error summary component (opens in new tab). Write error messages that say how to fix the answer.
Submit messageUses the look of the GOV.UK confirmation panel (opens in new tab). Unlike GOV.UK’s panel, it has no heading of its own. The message is marked as a status, and focus moves to it.
Voting poll Pro, coming soon, the voting partFollows the GOV.UK radios component (opens in new tab), or checkboxes when one vote can cover several options. The results are our own design.
Booking calendar Pro, coming soon, one dropdown of timesFollows the GOV.UK select component (opens in new tab), with the times grouped by day.

Our own design #

When we checked in October 2026, GOV.UK had nothing for these, or we built our own version. Each row says what it’s built on.

QuestionWhat to check or do
Text input, Web address modeA plain web address box. GOV.UK had no pattern for asking for one when we checked in October 2026. Give an example in the hint, such as www.example.com.
TimeA text box sized for a time, with a hint that shows the format. GOV.UK had no time component when we checked in October 2026. Keep the default hint, or write your own with an example. Also offer a clock to pick from adds the browser’s own clock under the box. It looks different in each browser, but people can always type the time instead.
MeasurementBoxes laid out like the GOV.UK date input, with a dropdown for the unit. GOV.UK had no measurement component when we checked in October 2026. If changing the unit shows or hides a box, the form tells screen readers. Offer only the units people really use.
Searchable dropdownBuilt on the W3C combobox pattern (opens in new tab). GOV.UK had no component for this when we checked in October 2026. With JavaScript off, people get the plain dropdown. Turn it on only for a long list.
File attachmentsA browser file box with our own Choose files button, and drag and drop as an extra. It doesn’t use the GOV.UK file upload markup. A hint listing the file types, count and size is always added. Keep the types and sizes as small as the job allows.
SliderThe browser’s own slider. GOV.UK had no slider component when we checked in October 2026. Set a Unit label, such as “out of 10”. On a wide range, turn on Show a number box beside the slider. It’s off by default.
Star ratingA radio button group drawn as stars. GOV.UK had no rating component when we checked in October 2026. Say in the label what the stars mean, for example “1 is very hard, 5 is very easy”. In Windows contrast themes, chosen stars fill with the system highlight colour and empty ones show as outlines.
Notice, Error message styleOur own style. When we checked in October 2026, GOV.UK’s only page-level error component was the error summary, which lists answers that need fixing. In every style it starts with a hidden “Error:”, so the meaning doesn’t rest on colour alone. Use it only for a real problem. For “please note” content, use inset text.
Several pages and the Back buttonEach page’s title is its heading. When the page changes, the form moves to that heading. Back is a button beside Continue, not the GOV.UK back link (opens in new tab) at the top. Like the back link, it shows the previous page as the visitor last saw it, with what they typed still there and nothing checked. The browser’s own Back and Forward buttons do the same. The browser tab’s title stays the same from page to page, because the whole form lives on one web address. Give every page a short title, and put one main question on a page where you can.
The automatic Check your answers pageOur own design, laid out like GOV.UK’s check answers pattern (opens in new tab). As on GOV.UK, each Change has the question’s name after it in hidden text, and it opens that page with the answer filled in. Continue returns the visitor to this page, after any new question the change needs. Back returns them without saving the change. Ours are buttons, not links.
Answers summaryOur own editable list of answers. It has one Go to button for each page, not a link for each answer. Back and Continue on the opened page work as they do from the automatic page. Keep the data-hpf- parts when you edit a line.
Booking calendar Pro, coming soon, a list of days and timesBuilt from GOV.UK parts: each day is a GOV.UK details section (opens in new tab) with radio buttons inside. GOV.UK had no booking pattern when we checked in October 2026. It works without JavaScript. Give the question a clear label, such as “Choose a time”.
Booking calendar Pro, coming soon, a month calendarBuilt on the W3C date picker example (opens in new tab). Its keyboard keys are listed in the booking section. With JavaScript off, people get a plain dropdown of times. Choose the list instead unless people really need to see a month at a glance.
Holiday stays Pro, coming soonThe same keyboard calendar. With JavaScript off, people get two of the browser’s own date boxes, which work differently in each browser. Set the fewest and most nights.
Voting poll Pro, coming soon, the resultsOur own bars, columns or table. Each bar shows its share in words. Choose the table if the results matter to screen reader users.
Repeatable group Pro, coming soonOur own design. Each entry is its own group with a heading, such as “Child 1”, and an Add another button comes after the entries. Set Name for each entry so the headings and remove buttons read clearly. With JavaScript off, people can fill in only one entry.
Signature Pro, coming soon, Both or Type onlyOur own design. Both has a drawing area and a box to type a full name instead. Type only is a plain text box. Leave it on Both unless you have a reason to change it.
Payment Pro, coming soon, the question itselfOur own design: a heading, the amount, your instructions and an optional reference box. The payment page that follows is covered under Has known limits.
Customer sign-in CaseworkOrdinary forms in your style mode. The boxes are set up so password managers can fill them in. There’s no “Show password” button. Only add sign-in where people need to come back to a case.

Has known limits #

Some people can’t use these, or part of them is run by someone else. Each row says what the limit is and what you can do.

QuestionWhat to check or do
Date, with the browser’s date picker

The box and its calendar belong to the browser. They look, work and read out differently in each browser and screen reader. For dates people already know, such as a date of birth, GOV.UK recommends the three boxes.

Leave the picker off, so people get the three boxes. That’s the default. If you turn it on, people have no other way to answer that question. Form check adds a note when it’s on.

Find address postcode lookup

It depends on an outside service, which can be slow, down, or not find the postcode. It needs JavaScript, and your daily limit can switch it off for the rest of the day.

The typed address boxes are always there, so people can always type the address instead. Check the boxes make sense without the lookup. Mention the postcode service in your privacy notice.

Turnstile or reCAPTCHA

The challenge belongs to Cloudflare or Google, and we can’t change how it works. Some people can’t pass it. With a challenge on, the form can’t be sent without JavaScript.

Both are off by default, and the built-in spam checks run without them. Leave the challenge off unless spam gets past those checks. If you turn one on, give people another way to contact you.

Location on a map Pro, coming soon

Many people can’t use a map, including blind people and some people with low vision, motor or cognitive difficulties. The map itself is our own design, with keyboard controls.

Two other ways are always there, and you can’t turn them off:

  • a postcode or place search box, which needs JavaScript and the lookup service
  • boxes to type a latitude and longitude, folded under Enter coordinates manually

Most people don’t know their latitude and longitude, so those boxes don’t help much. Add an ordinary question such as “Describe where it is”. Form check suggests one when the map’s page has no text question. If the map is required, think about making it optional.

Signature Pro, coming soon, Draw only

Drawing needs a mouse, a finger or a stylus. People who use only a keyboard, a switch or a screen reader can’t sign. If the signature is required, they can’t send the form. GOV.UK had no signature component when we checked in October 2026.

Choose Both or Type only, so people can type their name. Use Draw only where you really need a handwritten mark, and offer another way to sign. Form check warns you about it.

Signature Pro, coming soon, Both with Require a drawn signature and a typed name

This asks for a drawing as well as a typed name. People who can’t draw can type, but they still can’t sign. If the signature is required, they can’t send the form.

Leave that box unticked, so either way of signing is enough. Form check flags it when it’s ticked on a required signature.

Payment Pro, coming soon, Stripe or PayPal

After sending the form, the person goes to Stripe’s or PayPal’s own payment page. We don’t control how that page works.

Say in your instructions how else people can pay, such as by phone or bank transfer.

Watch out Following a GOV.UK pattern doesn’t make a form accessible. Your wording, theme and CSS all affect it. Test each form before you publish. Making your forms accessible is your responsibility.

The forms you start with #

There are 13 starter forms in six groups: Customer contact, Complaints & reports, Bookings & appointments, Data & information requests, Council services and Worked examples. Council services holds three forms with council choices, such as council tax and housing. Worked examples holds the two calculation forms.

The setup wizard’s Starter forms step shows them as a tick-list by group. Each form says who it suits. Tick as many or as few as you want, or none. Each form you pick is tagged with its group under the same Form group used on the Forms list, so they show up together there too.

Watch out The Freedom of Information form is for public bodies only. Freedom of Information law doesn’t cover private businesses. For requests about someone’s own personal information, use the Subject Access Request form. That one suits almost every organisation.
FormGroupSuitsWhat it shows
Simple enquiry formCustomer contactAny business, charity or public body.Three pages. Your enquiry asks for the message. Your details asks for name, email with a confirm-email box, and phone. The last page is Check your answers. One email to the team.
Feedback, compliment or complaintCustomer contactAny business or charity that wants to hear from its customers.An informal “tell us what you think”, separate from the formal complaint form. What is it about? offers everyday choices: customer service, products or services, delivery or collection, prices or billing, the website, or something else. Would you like a reply? drives a show/hide rule: the contact details group only appears when the answer is yes, and the thank-you message uses an <if> block the same way.
Make a complaintComplaints & reportsAny business, charity or public body with a complaints process.What happened, when, and the outcome wanted. Variables work out an Acknowledge by and a Full response by date. Both are examples, so change them to match your own procedure (see Complaints to an ombudsman). Shows a show/hide rule in action: an extra note appears only when the complaint is about a delay. What is your complaint about? includes How we use your personal information, so the form can also take data protection complaints. See Notes on the request forms.
Report a faultComplaints & reportsLandlords, housing associations, schools, offices, shops and venues.Heating, leaks, broken equipment, cleaning, safety and the rest. The “Which best describes it?” dropdown is a relational field, like the one in Report a problem. Its choices change with the answer to What is the fault with? Both dropdowns can take their starting value from the query string. There’s a photo upload. A name and email address are needed. One email goes to the team, and an acknowledgement goes to the person.
Book an appointment or callbackBookings & appointmentsAny business or charity that books calls or meetings, such as advice services, estate agents and accountants.Asks what it’s about and how you’d like to meet. Then it asks for a preferred date (today onwards) and time of day. The What is it about? choices are a general question, sales or a quote, help with an order or account, or something else. It uses plain fields throughout, so no Pro booking calendar is needed. One email goes to the team, and an acknowledgement goes to the person.
Event or room bookingBookings & appointmentsVillage and community halls, churches, schools, venues and coworking spaces.Space, event name, date and times, number of people, and a tick-list of extras such as a projector or microphone. The most people allowed depends on the room chosen. Both emails make clear the booking is a request, not confirmed until the team replies.
Freedom of Information requestData & information requestsPublic bodies only, such as councils, the NHS, state schools, universities and the police.Two computed variables, Date received (today) and Response deadline (example) ([date_received] + 20 workdays). The acknowledgement email quotes [date_due] and points to an internal review, then the Information Commission’s Office (ICO). The email is written for the Freedom of Information Act 2000. A Scottish public authority needs to change it. See Notes on the request forms. A worked example of date logic. Under the Freedom of Information Act 2000, working days leave out bank holidays in any part of the UK. The form counts them that way. The setting is on its Setup tab, under Bank holidays for working days. Under the Freedom of Information (Scotland) Act 2002, only Scottish bank holidays are left out. A Scottish public authority picks Scotland there instead.
Request your personal information (Subject Access Request)Data & information requestsAny organisation that holds personal information. That’s almost every business, charity and public body.The data-protection counterpart. The first page opens with a note that people don’t have to use the form, and can also ask by email, by letter or in person. The Response deadline variable is [date_received] + 1 months. The acknowledgement email covers identity checks, extra time for complex requests and how to complain. The team email reminds staff what moves the deadline and what the reply must say. See Notes on the request forms.
Report a problemCouncil servicesCouncils and anyone else who looks after streets, parks or public spaces.Pothole, streetlight, fly-tipping and the rest. The “Which best describes it?” dropdown is a relational field. Its choices are filtered by the kind of problem picked above it. Both dropdowns can take their starting value from the query string, so a “report a pothole” link can point straight at ?category=roads&problem_type=pothole. It has a photo upload. An email address is needed to send the reference, but the name can be left blank.
Book a council appointmentCouncil servicesCouncils and other public bodies.The appointment form with council choices. What is it about? offers council tax, housing and homelessness, benefits, planning and building control, or something else.
Council feedback, compliment or complaintCouncil servicesCouncils and other public bodies.The feedback form with council choices. Which service is it about? offers waste and recycling, council tax and benefits, housing, planning, parks and leisure, the website, or something else.
Calculation examplesWorked examplesAnyone learning how to set up calculations.Asks for a weight and height in any units, a date of birth and some costs. Six variables work out a body mass index (BMI), an age, a total, value added tax (VAT), the total with VAT and the cost for each person. The results page shows each one in a read-only box. A notice appears only when the age is under 18. The Every calculation, step by step tutorial reads through it.
Costs and pay examplesWorked examplesAnyone learning how to work out costs, pay and dates in a form.Asks about mileage, a holiday stay, an order and pay. Variables work out a mileage claim, the number of nights and the cost of the stay. Others work out a 10% discount on orders over £100, a deposit and the balance left to pay. The rest work out weekly, monthly and yearly pay, and the hours and pay for one shift. The Costs, pay and dates, step by step tutorial reads through it.

The starter wording in these forms is an example, written in good faith. It is not legal advice. Check it and set your own before you publish. We wrote it to the best of our knowledge of UK law on 4 October 2026. It may be wrong, or go out of date when the law changes. Check it with whoever advises you.

The regulator

From 30 September 2026 the Information Commission replaces the Information Commissioner as the regulator. It’s still called the ICO, short for the Information Commission’s Office. Its website is ico.org.uk.

Freedom of Information

Subject Access Requests

Data protection complaints

Complaints to an ombudsman

The Make a complaint form doesn’t name an ombudsman. Which one applies depends on the kind of organisation you are and where you work. Many public bodies must tell people about their ombudsman. That usually goes in your final response, with the time limit for going to the ombudsman. The acknowledgement email doesn’t need it.

The form’s Acknowledge by and Full response by variables are examples, set to 3 and 20 working days. Change them on the form’s Setup tab to match your own procedure.

Wording for a Scottish public body’s final response

If you are still unhappy after this response, you can ask the Scottish Public Services Ombudsman (SPSO) to look at your complaint. You normally need to do this within 12 months of when you first knew about the problem. Find out how at spso.org.uk.

The Pro add-on #

HolmesPortfolio Forms Pro is a paid add-on for when your forms need to do more. It installs next to the free plugin and adds to it. Pro is coming soon, in two plans.

With the Pro plan you can:

The Casework plan has everything in Pro, plus a case system for your teams:

Keep an eye on holmesportfolio.co.uk for news.