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:
- Customer contact: Simple enquiry form and Feedback, compliment or complaint
- Complaints & reports: Make a complaint and Report a fault
- Bookings & appointments: Book an appointment or callback and Event or room booking
- Data & information requests: Freedom of Information request (for public bodies only) and Subject Access Request
- Council services: Report a problem, Book a council appointment and Council feedback, compliment or complaint
- Worked examples: Calculation examples and Costs and pay examples
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.
- Forms → Add New. Drag fields from the left onto the page.
- Click a field to set its label, whether it's required, and the wording when it fails.
- Add an Email action so the answers reach you, and a Submit message for the person.
- Save. Copy the shortcode and paste it into a page, or press Add to a new page.
Quick start #
Activating the plugin opens a short setup wizard. It asks a few site-wide questions:
- how forms look
- what’s stored, and for how long
- where email comes from
- spam
- which starter forms to add
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
- 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.
- Click that first field. In the panel on the right, set the label to Full name and tick Required.
- Drag another Text input from Inputs into the same group. Label it Email address, set Input mode to Email, and tick Required.
- 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.
- From Actions, drag a Button below the group. Set Does to Submit the form. It can sit on the page outside the group.
- 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.
- Drag a Submit message. Write something like “Thanks [name], we’ll be in touch.”
- 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.
Page caches and security plugins. Forms keep working when:
- a page cache sends the same page to many people
- a security plugin blocks part of WordPress for visitors.
A few things to know:
- The plugin tells caches not to store form pages or form replies. Besides WordPress’s standard no-cache signals, it tells LiteSpeed servers and the LiteSpeed Cache plugin directly. If your cache ignores all that, exclude those pages in its settings. The Site Health check tells you if form replies are being cached.
- If the connection drops at the moment of sending, the visitor is told the form may have gone through. They’re asked to check for a confirmation email before sending it again.
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.
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:
- Pages with a show or hide rule are left out, so their questions are never asked.
- Questions and groups with a show or hide rule stay as they first load. Any that should appear after an answer never appear.
- A list that changes with an earlier answer shows every choice. If someone picks a choice that doesn’t match their earlier answer, they see an error asking them to pick another.
- Repeatable group Pro, coming soon: Add another does nothing, so people can fill in the group only once.
- Find address does nothing. People can still type their address into the boxes.
- A spam check (Turnstile or reCAPTCHA) can’t run. A form that uses one stays hidden, with the message asking them to turn JavaScript on.
- Map question Pro, coming soon: the map, its search box and Use my current location do nothing. People can only type into the latitude and longitude boxes.
- Signature Pro, coming soon: people can’t draw or type a signature. If the signature is required, they can’t send the form.
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 #
| Part | What it's for |
|---|---|
| Palette (left) | The field types, in five groups:
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 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:
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 tab | Everything form-wide: computed variables and page show/hide rules, plus a Form settings block with:
|
| 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:
- Tick the common questions you want: full name, email address, phone number, address, a message, a file upload, a date, a time or a rating.
- Add questions of your own, each with an answer type.
- Every question starts optional. Tick Required on your own questions, or change any question in the builder.
- Choose one page or several. With several, you can tick End with a Check your answers page. It gets its own last page, with the submit button and emails, so the visitor can check before sending.
- Start from a saved block if you like, and have the team email and a customer copy set up for you.
- The team email uses [all-fields], so it sends every answer. That includes questions you add later.
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.
- Start typing and it offers groups you already have.
- The Forms list then has a Group column and a group filter beside the search box, which helps on a site with dozens of forms.
- A group is only a label. Adding or removing one never changes how a form behaves.
- A group with no forms left in it drops out of the filter by itself.
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.
- It keeps the pages, questions, emails and group.
- It keeps the Setup tab settings too, such as variables and the case view. Only the front-end debugger starts switched off.
- It keeps this form’s own Settings choices for storing entries and for blocked words.
- It starts with no entries. Its version history starts with a note saying which form it was copied from.
- It keeps the original’s reference prefix. Give it its own on the Setup tab, so you can tell the two forms’ entries apart.
- It has its own shortcode, so it isn’t on any page until you add it.
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.
- Tick a group to save it with everything inside it. Tick one question inside a group to save just that question.
- You can also right-click a group and choose Save as a block. The group’s title is filled in as the block’s name, and you can change it.
- A Repeatable group Pro, coming soon keeps its settings, such as the fewest and most entries and the Add another button text.
- When you insert a block, any question name the form already uses gets a number on the end, such as email_2. No two questions share a name.
- To use one, type or pick its name in Find a block under the field list, then press Insert.
- Lock / Unlock, beside Insert, stops a block being deleted or overwritten by mistake.
- Delete only shows once a block is unlocked. For a built-in block, it hides it from the picker instead of erasing it.
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.
- Each topic runs on the practice form or on the real screen. Nothing on the practice form is saved unless you press Save, which asks you first. Anything you save on a real screen is saved for real.
- Finish or skip and you’re back at the list, with a tick beside the topics you’ve done.
- With Pro, a Pro tutorials button beside it (and at the top of Settings) does the same for the Pro features.
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.
| Option | What it does |
|---|---|
| Input mode | Text, 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.
|
| 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 field | Blocks 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:
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.
| Option | What it does |
|---|---|
| Rows | How tall the box starts. The visitor can drag it larger. |
| Minimum / maximum characters | Length limits. |
| Word limit | Shows 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.
| Option | What it does |
|---|---|
| Options | Edit options… opens a box with two tabs.
|
| Filter these options by another answer | Narrow 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 layout | Stacked, or side by side when there's room. |
| Describe this box with an alert | Per choice, links that choice to an alert field, so screen readers read out the extra note. |
| Pre-select from the query string | The 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. |
Checkboxes #
With no options, it's a single yes/no tick (good for “I agree”). Add options and it becomes a “choose any” list.
| Option | What it does |
|---|---|
| Options | Add choices to make it multi-select. Remove them all for a single box. |
| Minimum / maximum selections | How many the visitor must / may tick. |
| Option layout | Stacked or side by side. |
| Pre-select from the query string | Works 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.
| Option | What 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.
|
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.
| Option | What it does |
|---|---|
| Minimum / Maximum | The ends of the track. |
| Step | How far each nudge moves. |
| Unit label | Shown 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 slider | Off 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.
| Option | What it does |
|---|---|
| Number of stars | Between 2 and 10. Five is the usual choice. |
| Required | When 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.
| Option | What it does |
|---|---|
| Allowed dates | Any 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 birth | Lets 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 value | Fills 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 date | Compare 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.
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.
| Option | What it does |
|---|---|
| Time format | 24-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 from | Off 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 allowed | Optional, 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 than | Optional. 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.
| Option | What it does |
|---|---|
| What is measured | Height, 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 from | Tick each unit people may use. The first ticked unit is picked to start with. |
| Formulas and rules use | The 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 units | Optional. 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 to | Whole number, or 1, 2 or 3 decimal places. |
| Lowest and highest allowed | Optional 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.
- Line 1, town and postcode are required once anything is typed. The postcode is checked against the UK format.
- Line 2 is always optional.
- County and country follow the field’s own Required setting. On a required address, they’re required too: the label drops “(optional)” and each gets its own error-message box.
- Once it’s filled in, the visitor can press Save address to fold it into a read-only summary. A Change address button opens it again.
| Option | What it does |
|---|---|
| Include address line 2 (always optional) | Show or hide the second line. |
| Include county | Show or hide the county box. When shown, it is required or optional in step with the field's own Required setting. |
| Include country | Show 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 is | The 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.
- It’s free. It uses the free postcodes.io service, so there’s nothing to sign up for.
- That service has no service guarantee and may limit or block heavy use. For a busy site, run your own copy of postcodes.io, which is open source. Or use a paid service that sends addresses back in the same format. Then put its address in Postcode service address on the same tab. It must start with https://. On a local or development site, http:// works too.
- HolmesPortfolio doesn’t supply or pay for postcodes.io or any service you put there.
- The visitor’s postcode is sent there when they press the button, so mention that in your privacy notice.
- The data comes from Ordnance Survey, Royal Mail, National Statistics and National Records of Scotland. Add this credit to your site, for example on your privacy or terms page: “Contains Ordnance Survey data © Crown copyright and database right. Contains Royal Mail data © Royal Mail copyright and database right. Contains National Statistics data © Crown copyright and database right. Contains NRS data © Crown copyright and database right.”
- Northern Ireland postcodes (starting BT) are free for non-commercial use only. Commercial use needs a licence from Land & Property Services in Northern Ireland. See the postcodes.io data licences (opens in new tab).
- With JavaScript off, or if the lookup can’t be reached, the plain boxes are still there to type into.
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 includes address fields on later pages. It also includes a Pro repeatable group, where every “Add another” entry gets its own box.
- Each box is named after its address field for screen readers.
- Each lookup is one small request to the postcode service. Your site keeps each answer for 30 days, so repeated postcodes don’t make extra requests. If a postcode isn’t found, that answer is kept for an hour.
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:
- Choose getAddress.io, Ideal Postcodes or Ordnance Survey Places, or a custom endpoint.
- Paste your API key.
- 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.
- In an HTML email it becomes a small thumbnail, about 500 px on its longest edge, so the message stays small.
- In a plain-text email it stays as the file name.
- A few email plugins can’t place pictures inside the message. The file name shows instead, so the email still says which file was sent.
- A very large image (over about 12 MB or 30 megapixels) isn’t made into a thumbnail. It shows as its file name and travels only as an attachment.
- The full-size file is still attached if the email action has Attach files uploaded through the form ticked.
- The Pro PDF of the answers adds uploaded images the same way, automatically.
| Option | What it does |
|---|---|
| Accepted file types | Any 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. |
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:
- Any email that carries uploads ends with a short line reminding whoever gets it to scan the files, and only open ones they were expecting.
- Each email action has Attach files uploaded through the form on by default. Turn it off on emails whose recipient doesn’t need the files.
- Route form mail through a gateway that scans attachments (Microsoft 365 and Google Workspace both do), and keep readers patched.
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:
- basic HTML
- tokens, where [data-name] is replaced with an earlier answer
- <if key>…</if>, which shows part of the notice only when that field has a value. That’s handy for a message that reacts to what the visitor picked on an earlier page.
| Option | What 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.
|
| Add a “confirm you have read this” checkbox | Turns 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. |
Built-in blocks
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.
- Privacy notice and Terms and conditions. Each is one alert with its “confirm you have read this” checkbox turned on, so the visitor can’t send the form until they tick it. Both carry placeholder wording you must replace. The builder shows a red reminder on the alert, and the words “replace before publishing” appear in the text. Change the text and the example.com link before the form goes live. A privacy notice doesn’t need a tick box, and a tick isn’t consent. Remove the privacy notice’s tick box unless you have a reason for it.
- Customer contact: a group titled Customer details asking for a name, email and phone number. Each question has a short hint. You can change the hints and the title like any other question.
Pick one in the Find a block box under the field list and press Insert.
- Each built-in block starts locked. Unlock it there to hide it from the picker.
- Anything hidden or unlocked comes straight back from Settings → General → Restore starter content. The starter blocks are built into the plugin, so there’s nothing to back up.
- A confirmed alert shows as Yes in the answers summary, emails and the spreadsheet export.
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 from | What it does |
|---|
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.
- An email action sends unless it sits on a page a rule hid, or inside a group whose show/hide rule hid it. To send an email only in certain cases, put the action in a conditional group.
- Mail goes out through WordPress’s wp_mail(). How much gets delivered depends on your host and mail setup, not the plugin. See Emails for more.
| Option | What 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:
Only this box decides who gets the email. A visitor can’t add other recipients. |
| From name | The sender name. Falls back to the form's title, then the site name. |
| Subject | Plain 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 form | On 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 soon | Only 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 format | HTML or plain text. |
| Body | Written 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.
- It takes the same tokens as an email, including [case-reference]. See the full list of built-in tokens.
- If you add more than one, the form shows the last one that isn’t on a hidden page or in a hidden group.
- Like an email action, a submit message inside a group that a rule hid is skipped. So you can show a different thank-you depending on what the visitor chose.
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:
- a section for each page, with the page title as a heading
- a heading for each group that has a title
- one line for each answer, such as <dt>Your name</dt><dd>[your_name]</dd>
- a button such as Go to Your details for each page, if the form has more than one page
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:
- pages and questions that a rule hides are left out
- a question left blank says Not answered
- the Go to buttons take the form’s button style
- a form with only one page shows no Go to buttons
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:
- A confirm alert shows Yes or No.
- A multi-select checkbox shows the options the visitor ticked. With [all-fields], it lists every option with Yes or No.
- A radio or dropdown shows the chosen option’s label, not its stored value.
- A file upload shows the name and size of each file.
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.
- If the change reveals a new question on a later page, the visitor answers it first, then comes back to the summary.
- If the change affects nothing else, they come straight back to the summary.
- If the change hides a question that had an answer, that answer is dropped.
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:
- Group: a plain box. Give it a title to put a heading over related questions.
- Conditional group: a box with a show/hide rule. Everything inside appears or disappears together. It reacts straight away to an answer on the same page, and it can use answers from earlier pages too. When it's hidden, the fields leave the page completely and their answers are cleared from the entry and the emails.
- Repeatable group Pro, coming soon: people can fill in the group more than once. The entries are stacked, with an “Add another” button after them, and each entry has its own × to remove it. Without Pro, it shows in the palette with a padlock.
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:
- Only plain question fields repeat: text, text area, radio, checkboxes, dropdown, slider, star rating, date, time and address, plus a Pro Booking calendar. A File attachments field cannot go in a repeatable group, and it is not offered as a child. Keep one attachments field outside the group instead, with its own file count. That keeps the total upload size for a submission predictable.
- Give the entries a name in Name for each entry. Use one short word, such as Child or Item, up to 40 characters. Each entry then gets its own heading: Child 1, Child 2 and so on. Leave it blank and the headings read Entry 1, Entry 2. The same headings show in the “Check your answers” step, the emails and the stored entry.
- Each box with a problem gets its own error message under it. The error summary at the top names the entry too, for example “Child 2: Enter age.” Each line links straight to the box that needs fixing. Too few or too many entries still shows as one message for the whole group.
- Fewest entries and Most entries are numbers from 0 to 100.
- Leave Fewest at 0 (or blank) to make the group optional. Set it to 1 or more to require that many filled-in entries.
- A completely blank entry never counts. Visitors can add spare ones and fill them in any order, and the blank ones are ignored when the form is sent.
- Optional fields in an entry can be left blank. Add another will not make the next entry while an existing one is missing a required field, including any part of a required date or address. It says so under the button and moves focus to the box that needs filling in. This applies to every entry in turn: entry 2 has to be complete before entry 3.
- Leave Most at 0 for no limit of your own. The Add another button hides once that many are on the page.
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
- Drag a Conditional group onto the page. It opens its own Show / hide rules straight away.
- + Add condition: pick “How would you like us to respond?”, operator is, value By phone.
- 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 #
| Option | What 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.
|
| Label | The 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.
Left blank, some fields show the example hint GOV.UK uses:
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. |
| Required | When 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 width | How 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 messages | Your 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.
|
| Show / hide rules | Show or hide the field when other answers meet a condition. See Show / hide rules below. |
| Clear this field's answer when it is hidden | When 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 changes | When 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.
|
| 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.
|
| Page | Moves 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
- Add a Radio buttons field, Do you have a reference number?, with Yes and No.
- Add a Text input field for the reference number below it.
- With the text field selected, go to Where it shows in the options panel and press Add show/hide rules…
- Add a rule: Do you have a reference number? is yes.
- 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
- Add a Text input field, Data Name email, Input mode Email, Required.
- Add another Text input field below it, label Confirm email address, Input mode Email, Required.
- In the second field, set Must match another field to Email address.
- 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.
- When the form loads, it looks through the query string (everything after the ?).
- If an option’s match text appears there as a whole word, in any capitals, that option is picked. yes matches ?member=yes but not ?from=yesterday.
- A blank match box looks for the option’s stored value instead.
- The form keeps the query string, so this still works after moving to a later page.
- An answer the visitor picks always wins.
Send people to the form with a team already chosen
- Add a Dropdown, Which team is this for?, with options Housing, Benefits, Council tax.
- Turn on Pre-select from the query string. In each option's query string match box put a short unique code, HOUS, BEN, CTAX.
- On the benefits landing page, link to the form as /contact/?team=BEN.
- 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
- 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.
- Move a field between pages by dragging its row onto a page tab, or with the Page selector in the field's settings.
- Reorder pages with ← Move / Move → on the page header row.
- 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:
- its fields aren’t shown or required
- its email actions don’t send
- the step count adjusts, so a visitor who skips a page sees “Step 2 of 3”, not “of 4”
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
- Add a page for the postal address, with an Address field on it.
- On the Setup tab, under Show or hide pages, find that page and set This page to is shown only when…
- + 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:
- Press Add show/hide rules… under Where it shows in the field’s panel.
- Pick is shown only when or is hidden when.
- 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:
- A field that’s hidden when the form is sent never has its answer saved, emailed or sent to a webhook.
- Tick Clear this field's answer when it is hidden if you also want its box emptied while the visitor is still filling in the form.
- Some rules only test a dropdown, radio button or checkbox answer on the same page, using is, is not, contains or is empty. With those, the field, group or notice appears or goes as soon as the visitor answers. A notice with an answer token in its text waits for the server instead.
- Rules that use typed answers, bigger or smaller numbers, dates, calculations or answers from earlier pages are checked by the server. They take a moment to show or hide. Every rule is checked again when the form is sent.
- A hidden field or group is hidden so nobody can see it or reach it with the keyboard or a screen reader. Anything typed into a field that goes and comes back is kept, unless Clear this field's answer when it is hidden is ticked. A hidden group always clears what’s inside it.
- When an answer makes something appear or go, the form tells screen readers, for example “Now showing: Dog breed.” or “Now showing: Email address. Now hidden: Phone number.” A group is named as well as its questions. A notice is named by its own words, so an error notice that comes or goes is read out once, in that news.
- When a radio button or checkbox option shows another question or group, the option carries a short note for screen readers, such as “Choosing this shows: Email address.” If it shows an alert, the note says “Choosing this shows a note.” and leaves out the alert’s internal label. If it shows both, the note says “Choosing this shows: Phone number, and a note.”
- While that question is on the page, the option is also linked to it in the page’s code (aria-controls), as in GOV.UK’s version. Unlike GOV.UK, the question appears after the whole group, not under the option. Both come from your show/hide rules, so there’s nothing extra to set up.
Show one field only when another answer needs it
- Add the follow-up field, say a Text area called “Tell us more”.
- Select it. Under Where it shows, at the bottom of its settings, press Add show/hide rules…
- Keep is shown only when… selected. Then + Add condition: subject “How did we do?”, test is, value Not happy.
- 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.
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.
- In the dependent field’s settings, set Filter these options by another answer to the controlling field. Its options become groups.
- 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.
- Chaining works. The filtered field can itself filter a third (Region → Office → Team).
- Changing the first answer clears the second, so a required one has to be picked again against the new list.
- Pairs with Pre-select from the query string: a “report a pothole” link can point at ?category=roads&problem_type=pothole and land on the form with both dropdowns already set and filtered. The bundled Report a problem and Report a fault forms are built this way.
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.
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
| Goal | How |
|---|---|
| A statutory or service-level deadline | A 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 team | A 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 score | Add 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 flag | A 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:
- Days between two dates: pick a From and a To. The lists show your Date questions, your date variables and Today.
- Age in whole years from a date: pick one Date, such as a date of birth. The list shows your Date questions and date variables.
- Hours between two times: pick a From and a To from your Time questions.
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 formula | Means |
|---|---|
| [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 days | Move 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. |
| today | The current date, as DD-MM-YYYY. |
| 25-12-2026 | A 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
| Operator | True when |
|---|---|
| is / is not | The value matches, or doesn't. |
| contains / does not contain | The text (or a ticked choice) includes the value. |
| is greater than / is less than | Number and money comparisons. £1,250.50 and 1250.5 count as the same amount. |
| is before / is after | Date comparisons. Compare with a date such as 25-12-2026, with today, or with today + 14 days. |
| is empty / is not empty | The 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
- Add two Text input fields with Input mode set to Number: Quantity (qty) and Unit price (price).
- Add a variable, Name Order total, Formula [qty] * [price] + 5. The + 5 is a flat delivery charge.
- 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
- 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.
- 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
- Add a Hidden field, Data Name date_received. Set Value comes from to A calculation from other fields and put today in the formula.
- Add a second Hidden field, date_due, formula [date_received] + 20 workdays.
- 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
- Add two Date fields, date_from and date_to.
- On date_to, set Check against another date to date_from, and The rule to On or after that date.
- 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:
- email subjects and bodies
- the submit message and alert text
- formulas and default values
- a field’s own label, hint and error messages, filled in live on the page from what’s been answered so far
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:
- reference, case-reference and page-title
- working-days-note and cancel-link
- all-fields, all_fields, all-data and all_data
- group-inbox
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.
| Token | Becomes |
|---|---|
| [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.
| Token | Becomes |
|---|---|
| [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.
|
| [page-title] | The form’s own title.
|
| [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:
How it shows:
|
| [html:data-name] | Puts an Alert / notice field’s own text into an email. Use the alert’s Data Name, for example [html:notice1].
|
| [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 Insert bar above each editor (email body, submit message, alert text, Case view) has a button for:
- every field, showing its Data Name next to its label so you can see which token it adds
- every hidden field, marked “(hidden)”
- every computed variable, shown with its [name]
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:
- When you add a question, its settings show a reminder that it isn’t in the email yet. Press Add to email (or Add to emails) to add its line, or Not now to leave it. Get the label right first, because the line copies the label when you add it.
- In the email action, a note under the editor names any question that’s missing. Press Add the missing answers to add their lines. Your own text stays as it is.
- Form check adds a note when an email lists its answers one by one and leaves a question out.
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.
| Wrapper | Keeps 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
- 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.
- Write a short confirmation: thank them, include [reference], don't dump every answer.
- Add a second Email action. Put your team inbox in To.
- Write the internal version: [all-fields] for the full picture, plus [reference] in the subject.
- 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.
- Links you write in the email template work as normal.
- Many email clients ignore external CSS. For a reliable look, put inline style attributes in the header and footer HTML.
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.
- It’s the “from” on every email the plugin sends. A single email action can use its own From address instead.
- It only changes who the email appears to be from, not who it goes to.
- Replies go to a form’s Group inbox when one is set (on the form’s Setup tab). Set one on any form that uses a no-reply address.
- The address must be one your site is allowed to send as. Your domain’s Sender Policy Framework (SPF) and DomainKeys Identified Mail (DKIM) records decide this. That usually means your own domain.
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.
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:
- Restore an earlier version. The current one goes into the history first.
- Delete a version.
- Tick two and Compare them, to see exactly what changed.
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.
- Each finding says where it is, what’s wrong, why it matters and how to fix it, with a Go to field link.
- The badge is red for errors and amber for warnings. It’s a plain blue count when only notes remain. Notes are suggestions, not things you have to fix.
- The same count shows against each form on the Forms list. Clicking it opens that form with this panel already up.
It reads the structure only: labels, legends, choices, keys, error messages, autofill purposes, and a field set narrower than its answer needs.
- One note it raises is a field still on the Data Name the builder gave it (text_1, radio_2). It works, but it reads badly in the stored entry, the spreadsheet export and the emails. The builder’s Find a field panel lists the same fields under Fields never named.
- Another note flags a hidden field that records something about the signed-in user or from the page address. It reminds you to mention it in your privacy notice.
- An email action that lists its answers one by one gets a note when it leaves a question out. This usually means the question was added after the email was written. The note names the missing questions. Open the email and press Add the missing answers. Or use [all-fields] instead of the answer lines. It sends every answer, including questions added later. It only looks at an email with three or more answer lines. An email that mentions answers in its sentences, such as a letter to the visitor, is left alone.
- An Answers summary gets a note when it doesn’t show a question, usually one added or renamed after the summary was made. Open the summary and press Update from the form, or add the line yourself.
- It’s a starting point, not a full audit. Colour contrast, text zoom, reading age, focus visibility and whether the wording makes sense still need a person. The panel lists what it can’t check, and links to the World Wide Web Consortium (W3C) guide to accessible forms (opens in new tab).
- Its errors, warnings and notes never stop you saving. Leftovers from things you removed are different. See below.
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:
- an answer token such as [name] in an email, a notice or a label
- a show or hide rule or a calculation step that checks the removed question
- a setting on one question that picks another question
- the entry title and the answers summary
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.
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.
- Most public bodies must meet the Public Sector Bodies (Websites and Mobile Applications) (No. 2) Accessibility Regulations 2018 and publish an accessibility statement.
- Any organisation that serves the public must make reasonable adjustments under the Equality Act 2010.
- This is guidance, not legal advice.
The questions fall into three groups:
- GOV.UK pattern: the question follows a named GOV.UK Design System component or pattern. Each one links to it.
- Our own design: GOV.UK had nothing for it when we checked in October 2026, or we built our own version. Each row says what it’s built on.
- Has known limits: some people can’t use it, or part of it is run by someone else. Each row says what you can do about it.
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.
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.
| Question | What to check or do |
|---|---|
| Text input | Follows 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 mode | Follows 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 mode | Follows 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 modes | Follow 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 area | Follows 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 limit | Works 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 buttons | Follow 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 box | Follow 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”. |
| Dropdown | Follows 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 boxes | Follows 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. |
| Address | Follows 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 style | Follows the GOV.UK inset text component (opens in new tab). Use it for ordinary guidance. |
| Notice, Notification banner style | Follows 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 style | Follows 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 box | The 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 summary | Follows the GOV.UK error summary component (opens in new tab). Write error messages that say how to fix the answer. |
| Submit message | Uses 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 part | Follows 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 times | Follows 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.
| Question | What to check or do |
|---|---|
| Text input, Web address mode | A 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. |
| Time | A 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. |
| Measurement | Boxes 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 dropdown | Built 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 attachments | A 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. |
| Slider | The 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 rating | A 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 style | 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. 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 button | Each 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 page | Our 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 summary | Our 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 times | Built 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 calendar | Built 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 soon | The 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 results | Our 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 soon | Our 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 only | Our 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 itself | Our 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 Casework | Ordinary 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.
| Question | What 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:
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. |
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.
- Each form’s team email starts off going to the site admin address. Change it on each form.
- Each team email lists every answer on its own line. You can edit, move or delete any line. A line with no answer is left out of the email.
- Worked-out values, such as a response deadline, get their own lines too.
- A question you add later isn’t added to the email by itself. The builder offers to add it for you.
- You can edit or delete any of them. Check each form’s wording and settings against how your organisation works before you publish it.
- To bring a deleted one back, use Settings → General → Restore starter content. It lists each form with its status. Tick the ones you want back. Tick one that’s already here to reset it to its built-in version. You confirm first, and a backup is saved before anything changes.
| Form | Group | Suits | What it shows |
|---|---|---|---|
| Simple enquiry form | Customer contact | Any 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 complaint | Customer contact | Any 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 complaint | Complaints & reports | Any 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 fault | Complaints & reports | Landlords, 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 callback | Bookings & appointments | Any 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 booking | Bookings & appointments | Village 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 request | Data & information requests | Public 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 requests | Any 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 problem | Council services | Councils 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 appointment | Council services | Councils 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 complaint | Council services | Councils 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 examples | Worked examples | Anyone 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 examples | Worked examples | Anyone 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. |
Notes on the request forms #
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
- The acknowledgement email is written for the Freedom of Information Act 2000. That covers public bodies in England, Wales and Northern Ireland, and UK-wide bodies.
- A Scottish public authority works under the Freedom of Information (Scotland) Act 2002. That Act gives no extra time to weigh up the public interest. Appeals go to the Scottish Information Commissioner. In the form’s Acknowledge to the requester email, replace the two paragraphs that start “If we need to ask” and “If you are unhappy” with this wording:
Wording for a Scottish public authorityThen set Bank holidays for working days on the form’s Setup tab to Scotland.
If we need to ask what information you want, the time starts again when you reply.
If you are unhappy with our response, you can ask us to review it. If you are still unhappy after our review, you can appeal to the Scottish Information Commissioner at foi.scot.
- Requests for environmental information come under the Environmental Information Regulations 2004, or the Scottish version. The limit is still 20 working days, and it still starts again when someone answers your question about what they want. If a request is both complex and large, you can take up to 40 working days, but you must tell the person, with your reasons, within the first 20. You can’t take extra time for the public interest, so the acknowledgement email’s line about that doesn’t apply. Check what you tell people who make these requests.
Subject Access Requests
- The deadline is one month. If you ask for proof of identity, the month starts when you get it. If you need more detail to find what the person wants, the clock stops from when you ask until they answer.
- If a request is complex, or the person has sent several, you can take up to two more months. Tell them before the first month ends, and say why.
- You must make a reasonable and proportionate search. You don’t need to say this in the acknowledgement.
- Your reply, not the acknowledgement, must tell the person they can complain to you and to the ICO.
Data protection complaints
- Since 19 June 2026, people can complain to you about how you use their personal information. The law says you must make this easy, for example with a form people can fill in online. You must acknowledge each complaint within 30 days, and tell the person the outcome without undue delay.
- People can use the Make a complaint form for these. It has a choice called How we use your personal information.
- The Subject Access Request acknowledgement email says people can complain to you. Add how they can do that, such as a link to your complaints form or an email address.
- People can still go straight to the ICO. The ICO usually asks them to complain to you first.
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.
- Scotland. Most public bodies follow a model complaints procedure from the Scottish Public Services Ombudsman (SPSO). That includes councils, the NHS, housing associations, colleges and universities. Its first stage gives a response within 5 working days. Its investigation stage gives an acknowledgement within 3 working days and a response within 20 working days. Your final response must tell people they can ask the SPSO to look at their complaint, and give the time limit.
- Wales. Public bodies come under the Public Services Ombudsman for Wales, at ombudsman.wales.
- Northern Ireland. Public bodies come under the Northern Ireland Public Services Ombudsman (NIPSO), at nipso.org.uk.
- England. Councils come under the Local Government and Social Care Ombudsman, at lgo.org.uk. Its code has a shorter first stage: acknowledge within 5 working days and respond within 10. Housing associations and council landlords come under the Housing Ombudsman. The NHS and UK government departments come under the Parliamentary and Health Service Ombudsman.
- Personal information. Complaints about how you use personal information can go to the ICO, in every part of the UK.
- Businesses and charities. Your sector may have its own ombudsman or regulator. Check which one applies to you.
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.
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:
- take payments by Stripe payment link, PayPal button or bank transfer
- collect signatures
- send a PDF of the answers
- let people save a long form and come back to it later
- add repeatable groups, so people can add another child, vehicle or item
- offer booking calendars for appointments, rooms, tables and holiday stays
- run polls
- ask map questions, so people can show you exactly where something is
- track each entry with statuses and internal notes, and email the person who sent the form
- send each entry to your other systems with webhooks, and add people to Mailchimp or Brevo
- see where people give up, with form analytics
The Casework plan has everything in Pro, plus a case system for your teams:
- staff pick up cases and see them through to the end
- teams can hand cases to each other
- response time targets come with reminders when a case runs late
- customers can reply through a one-time link, or sign in to see their own cases
- a map shows where reports were made
- there’s no fee per member of staff
Keep an eye on holmesportfolio.co.uk for news.