Build
Forms
Build contact forms, newsletter sign-ups and full account flows in the Elementor editor — no shortcodes, no field codes to memorise.
NovaSpark does not process form submissions. It lays them out. The actual work — validation, spam checks, sending mail, creating accounts — is done by software built for it, so every plugin and integration you already rely on keeps working.
| Form | Powered by | You need |
|---|---|---|
| Contact | Contact Form 7 | The Contact Form 7 plugin |
| Newsletter | Mailchimp | Mailchimp for WordPress, with your API key |
| Sign in, sign up, reset password | WordPress itself | Nothing extra |
Two ways to build one #
Both produce the same markup, so you can move between them later without restyling.
| The quick way | The flexible way | |
|---|---|---|
| What | One widget — NovaKit Contact Form, NovaKit Newsletter or NovaKit Auth | NovaKit Form, with field widgets inside |
| Layout | Rows you reorder, each a full, half or third width | Anything a container can do — nested columns, a field beside an image |
| Best for | Most contact forms and sign-ups | Anything the row grid cannot express |
The rest of this page covers the flexible route, since it is the one with settings to explain. The quick widget exposes the same choices in one panel.
NovaKit Form #
Drag NovaKit Form onto the page from the NovaKit Form category. It arrives with a Fields container already holding Name, Email, Message and a Submit button — delete, reorder or add to them. The settings are on the widget, under Content → Form.
| Setting | Default | Accepts |
|---|---|---|
| Powered By | — | Contact Form 7, Mailchimp Newsletter, WordPress Accounts, Custom Action |
| Form | — | Which form, audience or account flow receives this |
| Manage Fields Automatically | On | On or off — Contact Form 7 only |
| When Signed In | Hide this form | Hide it, or show it anyway — accounts only |
The form wraps the Fields container from the outside, so everything you set on that container — direction, gap, alignment, width — still arranges the fields exactly as you laid them out. Select it by clicking the space around the fields, or through the Navigator.
Pick a form before you build. Until you do, NovaKit Form renders its fields and submits nowhere. The panel says so in orange.
The field widgets #
Ordinary Elementor widgets. Arrange them however the layout needs.
| Widget | Renders |
|---|---|
| NovaKit Field: Text | Text, email, phone, URL or number |
| NovaKit Field: Textarea | A message box, or a prompt box |
| NovaKit Field: Select | A dropdown |
| NovaKit Field: Choices | Radio buttons or checkboxes |
| NovaKit Field: Acceptance | A consent checkbox |
| NovaKit Field: Date | A date picker |
| NovaKit Field: Upload | A file attachment |
| NovaKit Field: Hidden | A value the visitor never sees. Takes a dynamic tag, so a submission can carry the page it came from |
| NovaKit Form: Submit | The button. Without it the form cannot be sent |
| NovaKit Form: Message | Where the success or error text appears |
Newsletter forms use NovaKit Newsletter Field instead, and account forms use NovaKit Account Field — both explained below.
A prompt box
Form: Textarea has a Behaviour section for chat and AI prompts. Everything in it is off by default.
| Setting | Default | What it does |
|---|---|---|
| Grow With Text | Off | Gets taller as the visitor types, from its Rows |
| Stop Growing At | Empty | The height it stops at and starts to scroll, per device |
| Enter Sends | Off | Enter sends the form and Shift+Enter starts a new line. Phones keep Enter for new lines, as their keyboards have no Shift+Enter |
| Start Compact | Off | Small until it is clicked, then it stretches smoothly. It stays open while it holds text, and while the visitor uses the rest of the form, such as a button or a dropdown beside it. Empty, it closes once they click outside the form |
| Compact Width, Compact Height | Full width, one line | Its size while small, per device |
| Open Width, Open Min Height | Full width, 7rem | Its size once open. With Grow With Text it can grow taller |
| Stretch From | Start | Which side it grows from: Start, Center or End |
| Duration, Easing | 350ms, Smooth | How it stretches |
| Preview Open In Editor | Off | Shows it open while you set the sizes. Visitors never see this |
Fill it from buttons with quick prompts.
Field names
Each field has a Field Name — what it is called in the submission and in your email. Leave it empty and it is taken from the label, which is usually right.
Two rules are enforced for you. Names must be unique within a form, so a
duplicate is renamed rather than silently overwriting the other field. And a few names
belong to WordPress — name, author, s —
so a field called name becomes your-name, exactly as Contact Form
7’s own default does, and for the same reason.
Contact forms #
- Create the form in Contact Form 7Contact → Add New. Name it, save, and leave the form template alone — NovaSpark fills it in.
- Set up the Mail tabRecipient, subject, reply-to. That stays yours; NovaSpark only writes the field list between two markers in the mail body.
- Build the layoutA NovaKit Form with Powered By set to Contact Form 7, your form selected, and field widgets inside.
- Save the pageThis writes your field list into the Contact Form 7 form, so it validates what you actually built.
Why saving matters. Contact Form 7 validates against the field list stored on its own form, not the HTML that arrives. Saving the page keeps the two in step. Without it, the form renders but is checked against an older list.
A form you built by hand is never overwritten. NovaSpark only manages a form whose template is still empty or still the stock default. If you had already written one, it is left alone and the panel tells you so — that is not a failure, it is refusing to throw away your work. Edit the list in Contact Form 7 to match, point at a fresh form, or turn Manage Fields Automatically off and maintain it yourself.
Newsletter sign-ups #
- Connect MailchimpMailchimp for WordPress → Settings, paste your API key, save. That is the whole setup.
- Build the layoutA NovaKit Form with Powered By set to Mailchimp Newsletter, then pick an audience.
- Add the fieldsNovaKit Newsletter Field widgets, then NovaKit Form: Submit.
- SaveThe form record is created and your required fields written into it.
You pick an audience, not a form. Mailchimp for WordPress needs a form record to hang the audience on, so NovaSpark creates and maintains one behind the scenes. You never open its form editor. A form you did build there yourself still appears in the dropdown under its own name, and is never rewritten.
Merge tags
NovaKit Newsletter Field has no Field Name control, deliberately — the merge
tag is the name. Its dropdown lists the tags your audience actually has, read from
Mailchimp rather than typed from memory: EMAIL, FNAME,
LNAME, PHONE and whatever else you have added.
Only EMAIL is required, and a wrong tag fails silently. A merge tag lives in your Mailchimp account, not on your site. Get one wrong and nothing errors — the value is simply dropped on the way, and nobody notices until someone asks where the first names went. That is why the list is read from the API.
Mailchimp collects an address as several values at once, so address-type merge fields are not in the dropdown. Collect them as separate text merge fields, or on a Mailchimp-hosted form.
Sign in, sign up and password reset #
These run on WordPress itself — no Contact Form 7 involved. Every
authenticate and registration_errors filter still runs, so a
security or two-factor plugin keeps working. What NovaSpark adds is that the visitor never
leaves the page you designed.
Turn registration on first if you are building a sign-up form: Settings → General → Membership → Anyone can register. Without it the form renders but cannot create accounts, and the visitor only finds out after filling it in. The panel warns you, with a link to the setting.
Set Powered By to WordPress Accounts, then choose which flow this form is:
| Flow | NovaKit Account Fields to add |
|---|---|
| Sign in | Username or Email · Password · Remember me |
| Register | Username or Email · Email · Password · Confirm Password |
| Reset password — send the link | |
| Reset password — set a new one | Password · Confirm Password |
The two reset forms are not interchangeable, and this is the easiest thing here to get wrong. Recovery is two steps, often days apart. Send the link is what sits behind “Forgot your password?” and asks for an email address. Set a new one is what the emailed link opens, and asks for a new password twice. Put the second one behind “Forgot your password?” and the visitor is asked to choose a password before anyone has checked they own the account — the form has no key to work with, so it can only refuse.
You never type field names. There is one set of fields, and the flow decides what each is called when it arrives. A field with no meaning in its flow — Remember me on a sign-up form — simply does not render, and says so in the editor.
Account fields need a WordPress Accounts form. In a form powered by Contact Form 7 or Mailchimp — or outside a form altogether — they have no meaning and are left off the live page. The editor marks them in red and offers a Use WordPress Accounts button that switches the form for you; choose the flow next. The reverse is marked too: an ordinary field such as First name in an account form still shows, but WordPress does not save what is typed into it.
The password field changes the behaviour
On a sign-up form the Password field is optional, and whether you include it decides what happens:
| With a Password field | The visitor chooses their own and is signed in immediately. |
| Without one | WordPress emails them a link to set a password. This is its default behaviour. |
Add Confirm Password alongside and the two must match. Turning on Show/Hide Button on any password field cuts failed sign-ins on phones considerably.
Where the new password is chosen
The second half of a reset happens after the visitor leaves and comes back from their email. On the set a new one form, open Advanced → NovaKit Settings → Display Conditions → Edit Conditions and add an Include rule Account → Visitor followed a password reset link. Give the sign-in form the same rule as Exclude, and the page swaps cleanly.
That condition is a real check against WordPress, not a glance at the URL — an expired or forged link reports false and the form never appears.
Save the page, not just the block. That is what records where each form lives, and it is the step people miss. A Global Block on its own is a bare canvas with no address, so it can never be a destination. If no page carries a set a new one form, the emailed link is left as WordPress wrote it and lands on the default login screen.
The reset key never appears in the address bar. On arrival it is moved into a secure cookie and the URL is cleaned — a URL gets copied, shared, logged by the server and leaked through the referrer header, and that URL alone is enough to take over an account.
What signed-in visitors see
A sign-in form shown to someone already signed in is nonsense, so When Signed In defaults to hiding it. Give them something instead: a second container set to NovaKit Settings → Display → Visitor is signed in → Show, using the NovaKit User dynamic tags for their name, email and avatar.
Use Account URL → Sign out for the log-out link. A hand-typed logout URL is refused by WordPress, because it needs a security token only that tag can generate.
If the page has nothing else on it, use Page Settings → Signed-In Redirect instead and send them elsewhere entirely.
Test in a private window. As an editor you always see account forms, even when signed in — deliberately, since otherwise you could not see the form you are building.
Custom Action #
Custom Action sends a form wherever you say, with no form plugin in between. Use it for a chat box, a CRM or an automation. It has no email or storage of its own: for those, use Contact Form 7.
| Setting | Default | What it does |
|---|---|---|
| Send To | Empty | A URL posts the fields there. Empty sends them to this site, where your code handles them |
| Method | POST | POST or GET |
| Handle | Empty | A name your code tells this form apart by |
| Stay on Page | Off | Sends in the background with no reload, and shows the answer in place |
| Minimum Sending Time (s) | 0.8 | With Stay on Page: the shortest time the form shows as busy |
| Sent Message, Failed Message | Empty | What the visitor reads. Empty uses the standard wording |
With Stay on Page off, the browser leaves the page: to your URL, or back to this
page with the result. With it on, nothing reloads, which is what a chat box needs. See
Connect a chatbot for the code, and
Hooks and filters for
nk_form_custom_submit.
Putting forms in tabs #
Sign in and sign up on one page, as two tabs, is the common arrangement. Each tab’s panel in NovaKit Tabs is a container, so the forms go straight into it.
- Add NovaKit Tabs to the pageOne item per form: sign in, sign up, and the reset request.
- Build each form in its tabSelect a tab in the widget’s settings to show its panel, then drop the form into it.
- Hide the reset tab from the navigationSet Show in Navigation to off on that item.
That last step is what keeps “Reset password” out of the tab row. Resetting is not a peer of signing in and signing up — it is where you go when you cannot get in — so the row shows two options and the third is reached from a link inside the sign-in panel. The panel is still fully present, just unlisted.
Linking between tabs
Two ways to point a “Forgot your password?” link, both fine:
| Method | Use it when |
|---|---|
| Account URL dynamic tag | Anywhere. It resolves on its own to whichever page carries that form, opening the right tab if it is in one. Move the form later and every link follows. |
A #slug link | From inside the same page. Type the item’s Deep-Link Slug with a # in front, and turn Deep Linking on. |
Display Conditions will not work for this. They are evaluated on the server from who the visitor is, so they cannot respond to a click — swapping two forms that way would need a page reload.
A tab switcher is one arrangement, not a requirement. Separate pages work identically, and the Account URL tag still resolves between them.
Where the message appears #
Every engine’s message looks the same, and every form widget styles it in one place: Style → Message.
| Setting | Default | Accepts |
|---|---|---|
| Show | All Messages | Only Problems hides the sent message and keeps errors. None hides them all, for when something else answers, such as a Mascot. Screen readers still hear them |
| Position | Below on NovaKit Form, above on the quick widgets | Above the form, or below it |
| Preview in Editor | Off | Success or Error — a sample to style by, never shown on the live page |
| Space From Fields | 20px | The gap between the message and the fields, on whichever side it sits |
| Typography, Padding, Border, Shadow | The theme’s | The message box |
| Success / Error | Green / red | Text, background and border colour for each outcome |
Set the colours when the form sits on a dark section: the defaults are tuned for light backgrounds. To put the message somewhere else entirely — beside the button, in another column — drop a NovaKit Form: Message widget there. It has the same style controls, and whatever you leave unset on it follows the form’s.
The wording stays the engine’s own, so a translation or rewrite in Contact Form 7 or Mailchimp is what visitors see. While a Contact Form 7, newsletter or Stay on Page form is sending, the submit button shows a small spinner in its own text colour.
Testing #
| Test | Expected |
|---|---|
| Submit a contact form empty | Each required field shows its own error, inline |
| Submit twice quickly | One set of errors, not two stacked copies |
| Add a field, save, submit empty | The new field is validated too |
| Newsletter, malformed address | “Please provide a valid email address.” |
| Newsletter, real address | Success, and the subscriber appears in Mailchimp — usually as pending, which is its double opt-in |
| Sign in, wrong password | Back on your page with an error, not the WordPress login screen |
| Sign up, mismatched passwords | An error, with the username and email still filled in |
| Reset link used twice | “That password reset link is not valid.” |
After a successful reset the visitor is not signed in automatically. That matches WordPress: possession of a mailbox is enough to change a password, and a deliberate sign-in is the moment the new one is confirmed to work.
Failed attempts hand back what was typed — except passwords, which are never stored anywhere that outlives the request.
What NovaSpark owns #
| NovaSpark | The engine |
|---|---|
| Layout and markup | Validation rules |
| The field list | Mail settings, recipients, subject |
| Where the message sits, and its colours | The message wording |
| Nothing else | Spam protection, integrations, stored submissions |