Roadmap
Forms is growing from a contact-form builder into an all-in-one form system: one builder that makes contact, lead, registration, application, survey, quiz, order and donation forms, with other extensions adding their own fields and on-submit actions to it. Phase 0 is what already ships.
Verified against the extension source on 2026-10-19.
Phase 0 · What Forms already doesDone
7/7The base every later phase builds on: a drag-and-drop form builder inside the Contact Form element, stored entries, conditional fields, on-submit actions other extensions add to, and ready-made starter forms.
- Stored entries — Done
Every submission is kept under Unyson+ → Form Entries, even when the notification email fails: search, status views, date filter, bulk archive or delete, CSV export, a retention period, and the WordPress personal-data export and erase tools.
- Field types — Done
Text, textarea, email, website, number, select, radio, checkboxes, date and time, star or score rating, hidden values, consent boxes and private file uploads.
- Conditional fields — Done
Any field can be shown only when another field has a given answer. The rule is also enforced on the server, so a hidden field is never checked or collected.
- On-submit actions — Done
A per-form list of steps that run after a submission. Forms ships Store entry; the CRM adds Add to the CRM and Membership adds Register member. Any extension can register its own.
- Starter forms — Done
Nine ready-made forms in the builder's Templates panel: Contact, Appointment request, Table booking, Quote request, Event registration, Support ticket, Feedback, NPS survey and Newsletter signup.
- Spam protection — Done
A hidden honeypot field, Google reCAPTCHA, and a limit on how many forms one visitor can send in ten minutes.
- AI Assistant abilities — Done
A connected AI can describe the field types and starters and place a form with its actions. It never sees the entries.
Phase 1 · Form Styles presetsIn progress
3/4Field styling moves onto presets in Theme Settings, the same rule buttons and boxes already follow, so every form on a site matches and one edit restyles them all. The Contact Form element picks a style; its own Style tab keeps only what belongs to that one form.
- Form Styles presets in Theme Settings — Done
Theme Settings → Components → Form Styles: field background, text, border, focus colour and ring, placeholder, label, help, error and choice colours; border width, box or underline, corner radius, height, side padding and text size; label size, weight and case; separate colours for site dark mode; and custom CSS. Ships Standard, Soft, Underline, Rounded and On Dark (for forms on dark sections).
- Form style picker on the element — Done
The Contact Form element's Style tab has a Form Style dropdown. Its own field settings remain as "this form only" overrides that win over the preset; width, alignment and spacing stay per form. The submit button keeps using the Button presets.
- Existing forms keep their look — Done
Standard reproduces the original field look exactly and is the default, so existing forms render the same. A form whose style was renamed or deleted falls back to plain fields.
- One style for every form on the site — Planned
The same Form Styles reach the Newsletter element and Membership's forms, and the Site Converter maps a source site's input styling into a preset.
Phase 2 · Better sending: accessible, instant and trustedPlanned
0/8The basics every form on every site benefits from, before any new form type: sending without a page reload, errors everyone can find and fix, the sender getting a copy, and stronger spam protection.
- Send without reloading the page — Planned
The form sends in the background and shows its message in place; the page no longer reloads and jumps back to the top. Forms still work with JavaScript off, falling back to today's reload.
- Accessible error messages — Planned
Each problem is described in words next to its field and linked to it for screen readers (aria-invalid and aria-describedby); a long form gets a summary at the top; focus moves to the first problem; colour is never the only signal. Follows WCAG 2.2 success criteria 3.3.1, 3.3.3 and 1.4.1.
- Autofill hints — Planned
Name, email, phone and address fields declare what they hold, so browsers and password managers fill them in and assistive tools can recognise them (WCAG 2.2 success criterion 1.3.5).
- What happens after sending — Planned
Show a message, show a message and hide the form, go to a thank-you page, or go to any address, with answers usable in the message or the address. Different outcomes can depend on the answers.
- A confirmation email to the sender — Planned
An on-submit action that emails the person who sent the form a copy of their answers or a custom message, with the site's email styling.
- Smarter notification emails — Planned
More than one notification per form, CC and BCC, recipients chosen by an answer (sales questions to sales, support to support), and answer tags such as {name} or {all_fields} in the subject and body.
- Cloudflare Turnstile and hCaptcha — Planned
Two more spam checks beside reCAPTCHA. Turnstile is free with no usage cap and usually shows nothing to real visitors.
- Content spam filtering — Planned
Check submissions against Akismet when it is installed, and against a site list of blocked words, email domains and links. A caught submission is kept as Spam in Entries rather than lost.
Phase 3 · Choose a form type firstPlanned
0/3The starter forms stop being hidden in the builder's Templates panel. Adding a Contact Form element opens a picker of form types first, then the same builder as today.
- Starter picker on a new form — Planned
A new Contact Form element opens with a grid of form types, each with a short preview and its fields listed, plus Blank and the site's own saved forms. Picking one fills the builder and the form's actions; everything stays editable.
- More starter types — Planned
Job application, volunteer sign-up, RSVP, lead magnet download, callback request, product enquiry and a short quiz, on top of the nine starters.
- Describe a form, get a form — Planned
In the picker, describe the form in a sentence ("a waiver for a surf school with an emergency contact and a signature") and the AI Assistant builds the fields, actions and messages for you to edit.
Phase 4 · The form libraryPlanned
0/4Forms become things you build once and place anywhere, the model Gravity Forms and WPForms use. Unyson+ → Forms lists every form; the Contact Form element shows one of them.
- Saved forms — Planned
A form is stored once, with its fields, settings, actions and style, and keeps a stable id, so entries group by real form instead of by page.
- Forms screen — Planned
Unyson+ → Forms, beside Form Entries and Forms Settings: every form with its entry count, last submission and where it is placed. New form starts from the starter picker; duplicate, export and import a form as JSON.
- The element picks a saved form — Planned
The Contact Form element chooses a form from the library, so editing it once updates every page that shows it. A form built inside an element keeps working and gets a Save to the library button.
- Form history and undo — Planned
Every save of a form is kept, so an earlier version can be compared and restored.
Phase 5 · Longer forms and richer fieldsPlanned
0/10What application, registration and intake forms need: steps, and fields that collect a person's details properly.
- Multi-step forms — Planned
A page-break field splits a form into steps with a progress bar, Back and Next. Each step is checked before moving on, and conditional rules can skip a step.
- Name field — Planned
First and last name in one field, stored separately so the CRM and emails can use each part.
- Phone field — Planned
A country code and number, checked and stored in one international format.
- Address field — Planned
Street, city, region, postcode and country, with the parts stored separately.
- Section headings and text — Planned
A heading-and-text block to explain a part of the form between fields. It collects nothing.
- Repeating groups — Planned
A set of fields a visitor can add again ("add another guest", "add another job"), each copy stored as its own row.
- Picture choices, ranking, sliders and grids — Planned
Choices shown as images, drag-to-rank options, a range slider, and a Likert grid (several statements rated on one scale) for surveys.
- Pre-filled and piped answers — Planned
Fill fields from the address, the logged-in user or the CRM contact, and repeat an earlier answer later in the form ("Thanks, {name}. Which date suits you?").
- One question at a time — Planned
An optional layout that shows one question per screen, with keyboard navigation and a progress bar. The same form can be shown either way.
- Floating labels — Planned
A Form Styles option that places the label inside the field and moves it above while typing, without losing the label for screen readers.
Phase 6 · Calculations and paymentsPlanned
0/6Forms that work out a price and take the money: quotes, simple orders, deposits and donations, without a shop.
- Calculated field — Planned
A total worked out from other answers (quantity × price, options that add to a base price), shown live and recalculated on the server.
- Product and amount fields — Planned
A product with a price and quantity, and a pay-what-you-want amount for donations, with suggested amounts.
- Take payment action — Planned
An on-submit action that charges the form's total by card through Stripe or through PayPal. The entry records the payment and its status; a failed payment keeps the entry and tells the visitor.
- Coupons — Planned
Fixed or percentage discount codes on payment forms, with limits on uses and dates.
- Recurring payments — Planned
Monthly or yearly charges for donations and simple subscriptions, cancellable by the payer.
- Pay later — Planned
A bank transfer or pay-on-arrival choice that records the amount owed and is marked paid by hand.
Phase 7 · Quizzes, limits and morePlanned
0/9The remaining form types from the common list, and the tools long or popular forms need.
- Quiz scoring — Planned
Points per answer, a total score, and a different message, redirect or CRM tag for each score range. Covers knowledge quizzes and product-finder quizzes.
- Entry and seat limits — Planned
Close a form after a number of entries, on a date, or once each choice's seats are taken ("Saturday workshop: 3 places left"), with a message shown when it is full.
- Save and continue later — Planned
A visitor can save a long form part-way and get a link by email to finish it.
- Signature field — Planned
Draw a signature with a mouse or finger, stored privately with the entry like a file upload.
- Create a post action — Planned
Turn a submission into a draft post or a custom post type entry (a listing, a testimonial, an event), with fields mapped to the title, content, featured image and custom fields.
- Survey results — Planned
A results view per form: answer counts and charts for choice and rating fields, average scores, NPS, and the trend over time.
- Send to a webhook action — Planned
Post a submission's answers as JSON to any URL, for automation tools and other systems.
- PDF copies of entries — Planned
Turn an entry into a PDF (a receipt, an application, a signed waiver), attach it to the emails or download it from Entries.
- Send to a spreadsheet action — Planned
Add each submission as a row in a Google Sheets spreadsheet.
Phase 8 · See how forms perform and follow upPlanned
0/4Which forms are seen, started, finished and abandoned, and the tools to act on what comes in.
- Form analytics — Planned
Views, starts, completions and the field where people give up, per form and over time. Shares the Visitor Insights data when that extension is on.
- Unfinished entries — Planned
Optionally keep what a visitor typed into a form they did not send, so a half-finished quote request can be followed up. Off by default, and stated in the form's privacy notice when on.
- Working with entries — Planned
Notes on an entry, assign it to a team member, star it, reply from the entry, and correct an answer with the change logged.
- Scheduled export and clean-up — Planned
Email a CSV of new entries every day or week, and set retention per form instead of one site-wide period.
Phase 9 · Show entries on the sitePlanned
0/3Use what people send as content: directories, listings and testimonials, with an approval step before anything goes public.
- Entry views — Planned
An element that shows a form's entries as a table, grid, list, map or calendar, with search, filters and a page per entry. Only the fields chosen for it are shown.
- Approval before publishing — Planned
Entries shown in a view wait for approval; an approver gets an email and can approve or reject from it.
- People edit their own entries — Planned
A logged-in person can update what they sent (a listing, an application) until it is locked.
Phase 10 · Bookings plug inPlanned
0/2Reservations stay a separate Bookings extension (availability, nightly or slot pricing, calendar sync). It connects to Forms the way the CRM and Membership do: by adding a field and an action, never by moving booking code into Forms.
- Dates and availability field — Planned
Supplied by the Bookings extension: a calendar that greys out taken dates or slots and shows the live price, usable in any form. Planned with that extension.
- Reserve action — Planned
Supplied by the Bookings extension: holds the chosen dates when the form is sent and re-checks that they are still free. A booking form is then a normal form with its own extra questions.
How it will feel
Adding a Contact Form element opens the same form builder as today, with two additions in front of it:
- Pick a form type (phase 2). A grid of starters (Contact, Quote request, Event registration and so on), plus Blank and your own saved forms. Picking one fills in the fields and the right actions.
- Pick a form style (phase 1). A dropdown of the Form Styles presets from Theme Settings, the same way the submit button already picks a Button preset.
Once the form library lands (phase 3), the element can also show a form that already exists, so one form can appear on many pages and is edited in one place.
Order of work
- Form Styles presets. Small, and every form on the site changes at once.
- Better sending: no page reload, accessible error messages (WCAG 2.2), autofill hints, a choice of what happens after sending, a copy to the sender, smarter notifications, and Turnstile, hCaptcha and content spam filtering. Every existing form benefits, so this comes before new form types.
- The form-type picker, so the starters are found without opening a Templates panel, plus "describe a form" with the AI Assistant.
- The form library, the biggest change: it moves where forms are stored, so existing forms keep working inside their elements and can be moved to the library when wanted.
- Longer forms and richer fields: steps, name, phone and address fields, repeating groups, picture choices, ranking, sliders, survey grids, pre-filled answers and a one-question-at-a-time layout.
- Calculations and payments, with coupons, recurring payments and pay-later, which also cover donations and simple orders.
- Quizzes, limits, save and continue, signatures, create-a-post, survey results, PDFs, spreadsheets and webhooks.
- Analytics and follow-up: where people give up, optional unfinished entries, notes and assignment, scheduled exports.
- Showing entries on the site: directories and listings with an approval step.
- Bookings, which stays its own extension and plugs in with a field and an action.
Already covered elsewhere
Some features other form builders sell as add-ons already exist in Unyson+ through other extensions, so they are not repeated here: email-list signups, double opt-in and CRM records come from the CRM, user registration and member-only forms from Membership, and webhooks to other systems from the CRM's webhooks module as well as the planned form action.
How this page stays current
Status is not ticked by hand. src/data/forms-roadmap.json lists every task with a detect block naming the
files (and, where needed, code symbols) that make it real, and scripts/gen-roadmap.mjs checks them against
the extension's source tree:
| Result | Status |
|---|---|
| Every file and symbol found | Done |
| Some found, some missing | In progress |
| None found | Planned |
npm run roadmap:forms # scan and rewrite the JSON
npm run roadmap:forms -- --dry # report only, write nothing
npm run roadmap:forms -- --check # exit 1 if stale
The detect paths double as the extension's agreed file layout, decided before the code is written: core
classes in includes/<area>/, each field type in includes/option-types/form-builder/items/<type>/, each
on-submit step in includes/actions/, and the element in extensions/contact-forms/shortcodes/contact-form/.