Description
Gather Grove Forms builds contact forms, sign-ups, surveys, intake questionnaires and RSVPs, and shows each one in the way that suits it:
- Classic — every field on one page, the familiar way.
- Conversational — one question at a time, large type, keyboard-first, with a welcome screen and ending screens you write yourself. Switching a form between the two changes only how it looks: the questions, logic and entries stay exactly as they are.
What you get:
- A drag-and-drop builder with text, paragraph, email, phone, website, number, date, dropdown, radio, checkbox and content fields, and eleven starter templates.
- Conditional logic. Show or hide a field based on earlier answers, on both the page and the server, so a hidden field is never required.
- Outcomes. Route a conversational form to different ending screens depending on the answers.
- Email notifications. Tell yourself when a form comes in and send the person a confirmation, with
{field:name}placeholders and fallbacks. - Entries you own. Every submission is saved in your own database before anything else happens with it. Browse, star, search and filter them, and export as CSV or JSON.
- Spam protection with a honeypot, rate limiting and optional Cloudflare Turnstile.
- Webhooks to Zapier, Make, n8n or any URL.
- Privacy tools. Submissions appear in WordPress’s own personal-data export and erase tools.
- Place it anywhere with the Gather Grove Form block, the
[gather_grove_form id="..."]shortcode, or Elementor’s Shortcode widget. - Styled by your palette. Forms read CSS custom properties, ship four palettes, and never use
!important, so your theme can always override them. - Accessible by default: real labels, error messages tied to their fields, visible focus and reduced-motion support.
Part of the Gather Grove suite
Gather Grove Forms works entirely on its own. It is also one part of Gather Grove, a family of plugins for running and growing a creative business on your own WordPress site. The plugins share one admin, one list of people, and one look:
- Gather Grove Booking — classes, appointments and events, with online payment.
- Gather Grove Pulse — email broadcasts, automated sequences and a contact list that knows who booked, joined or enrolled.
- Gather Grove Communities — private member spaces with rooms, an activity feed and direct messages.
- Gather Grove Courses — self-paced and cohort-based online courses.
- Gather Grove Companion — an AI assistant for your admin, and a chat helper for your visitors.
- Gather Grove Sync for Notion — free; sends form entries and bookings to your Notion workspace.
Learn more at gathergrove.io.
Free and Professional
Everything listed above is free, and stays free. The free plugin has no locked features, never expires, and is not a trial.
Gather Grove Forms Professional is a separate plugin, available from gathergrove.io, for forms that do more of the work. It adds:
- Multi-step forms and repeater fields
- Calculations and quiz scoring
- File uploads and e-signatures
- Payment on submit through Stripe
- Applications with approve and decline
- Save and resume
- Popup, slide-in and sticky-bar forms
- More notifications, with conditions and branded layouts
- Mailchimp, Kit, Google Sheets, Stripe and Gather Grove Booking integrations
- An Elementor widget
Compare every feature at gathergrove.io/docs/pricing.
External services
This plugin can connect to the following services. None of them is contacted unless you set it up.
Cloudflare Turnstile — optional spam protection. When you add Turnstile keys to a form, the form page loads Cloudflare’s challenge script from challenges.cloudflare.com, and each submission’s challenge token is sent to Cloudflare’s siteverify endpoint to check it, together with the visitor’s IP address.
Terms of use: https://www.cloudflare.com/website-terms/
Privacy policy: https://www.cloudflare.com/privacypolicy/
Webhooks — when you add a webhook to a form, each submission’s answers are sent to the URL you enter, and only to that URL. What happens to them there is governed by the service you chose.
Screenshots






Blocks
This plugin provides 1 block.
- Gather Grove Form Embed a Gather Grove form — classic or conversational. The form's own mode decides how it renders.
Installation
- Install Gather Grove Forms from the Plugins screen, or upload the
gather-grove-formsdirectory to/wp-content/plugins/. - Activate it through the Plugins screen.
- Build your first form under Gather Grove Forms in the admin sidebar, or start from a template. Site-wide options live under Gather Grove Forms → Settings.
- Place the form with the Gather Grove Form block or the
[gather_grove_form id="..."]shortcode.
FAQ
-
Where are my submissions kept?
-
In your own database, in tables belonging to this plugin. They are never sent to our servers. Every submission is stored before anything else happens with it, so a failing notification or webhook cannot cost you an entry. Browse them under Gather Grove Forms → Entries, or export them as CSV or JSON.
-
What happens to my forms and entries if I delete the plugin?
-
Nothing, by default. Deleting the plugin leaves your data in place, so reinstalling restores it. To remove everything, turn on “Also delete every form, entry and uploaded file” under Gather Grove Forms → Settings before you delete the plugin.
-
Can the same form be a normal page of fields and a one-question-at-a-time form?
-
Yes. Every form has a display mode, and switching it changes nothing about your questions, logic, notifications or existing entries — only how the form is presented.
-
Do I need Elementor?
-
No. The block, the shortcode and Elementor’s Shortcode widget all show the same form, drawn by the same code.
-
Do I need the other Gather Grove plugins?
-
No. Forms is complete on its own. The other plugins are there if your business grows into them.
-
Does it add a link to my site?
-
Only if you ask it to. A small “Powered by Gather Grove” link under your forms is off unless you turn it on under Gather Grove Forms → Settings.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Gather Grove Forms” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Gather Grove Forms” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.33.0
- New: a form can now be filled in right inside Gather Grove Booking’s checkout — for example a waiver built as a form. It appears in the checkout panel, submits there, and checkout carries on; it never sends the visitor off to another page. Conversational forms fit the panel too: one question at a time, Enter to advance, sized to the panel rather than the whole screen.
- Changed: a form that takes a payment can’t be submitted from inside Booking’s checkout. The visitor sees a message to contact the studio, and nothing is saved or charged. Everywhere else the form takes payment as before.
- New: Gather Grove Booking can tell which forms take a payment or send people to another page when they finish, so it can warn you before you use one inside checkout, where neither happens.
- Fixed: a form that appears after the page has loaded — in a popup, a tab or a checkout panel — now shows its Cloudflare Turnstile check. Before, the check never appeared, and the submission was marked as spam even though the visitor saw a normal thank-you message.
1.32.0
- New: Gather Grove Booking’s Studio Director role (Booking 1.198.0) can build forms and read entries, the same as a Gather Grove Manager. Like a manager, a Studio Director cannot export or delete entries or delete forms.
1.31.2
- Changed: all your Gather Grove menus now sit together in the WordPress admin sidebar. Each plugin used to choose its own spot, so on a site with other plugins (WooCommerce, Elementor, an SEO plugin) they could end up scattered between them. A menu-editor plugin can still rearrange them however you like.
- Changed: bundled Gather Grove Core updated to 0.64.5.
1.31.1
- Changed: now requires WordPress 6.9 or later. The bundled Action Scheduler, which runs the plugin’s background tasks and is shared across Gather Grove plugins, is updated to its current release, 4.2.0, and that release needs 6.9.
- Changed: bundled Gather Grove Core updated to 0.64.4.
- Fixed: first-time setup now loads the WordPress database-upgrade tools exactly where it uses them.
1.31.0
- Changed: the small “Powered by Gather Grove” link under your forms is now off unless you switch it on. The new Gather Grove Forms Settings General card has the switch.
- Added: the same card has “Also delete every form, entry and uploaded file” for when you delete the plugin. The plugin always honoured this choice, but there was no way to make it.
- Added: an autoresponder’s “Send to” box now explains how to confirm to more than one person — separate them with commas, e.g. {field:email}, {field:guardian_email}.
- Changed: the plugin’s stored settings and scheduled tasks now use its full name as a prefix. Your settings, forms and entries carry across automatically on the first page load after updating; nothing needs doing.
- Changed: every database query now passes table names as placeholders, and admin output is escaped where it is printed. Nothing looks different; it is the shape WordPress.org checks for.
- Fixed: the page a decline link opens now sends the note you type with the decision, without relying on a script.
- Changed: bundled Gather Grove Core updated to 0.64.3.
1.30.1
- Fixed: searching on Forms Entries could overload a slow server. Every letter typed sent a new search, and although only the last answer was shown, the server still ran every one of them. The list now waits for a pause in typing, sends one search at a time, and waits longer between searches when the server is answering slowly. The search box itself still keeps up with your typing.
- Fixed: “Delete permanently” on a full page of entries sent all twenty deletions at once, which on a small server could hold up the whole site until they finished. They now go three at a time. Every selected entry is still attempted, and you are still told if any could not be deleted.
1.30.0
- Added: applications can now be reviewed from the page of the plugin they are for. Gather Grove Booking’s Membership Requests page lists the membership applications waiting in Forms next to its own requests, and Approve or Decline there works exactly as it does in Forms Entries — the applicant gets the same email, and an approved free membership is granted the same way. Deciding still needs permission to manage forms.
1.29.1
- Fixed: a popup or slide-in form now puts the cursor in its first real field when it opens. It was landing in the invisible anti-spam field, so a visitor who simply started typing filled that field and their submission was marked as spam.
- Fixed: webhook and Google Sheets integrations now refuse link-local, carrier-grade NAT and other reserved network addresses (including the cloud metadata address 169.254.169.254) on every supported WordPress version, and on every redirect the request follows. WordPress itself only began refusing these in 7.1.
1.29.0
- Fixed: a placeholder whose fallback contains another placeholder now works. A subject like “New submission from {field:name|{field:full_name|{field:first_name|someone}}}” used to arrive with the inner placeholders printed as raw text whenever the first field was missing or empty; it now tries each field in turn and ends with “someone”. A fallback can mix words and placeholders, and form and entry placeholders accept a fallback too. Submitted values are still escaped in the email body exactly once.
1.28.0
- Changed: exporting entries and permanently deleting entries or forms now need their own permissions, held by administrators and the studio’s Gather Grove administrator. A manager can still build forms, read entries, trash them and archive forms — everything reversible — but cannot carry the whole submission history out of the site or destroy it. The export permission had been handed to managers since 1.17.0 and is taken back on update.
1.27.0
- Added: a “Waiver & consent” starter template — the agreement in sections with per-section acknowledgements, a media-consent choice, and a required signature.
- Added: a signature shows on the entry as the redrawn mark or the typed name with its record beneath; exports carry a short reference in CSV and the full record in JSON; a notification placeholder expands to the reference.
1.26.1
1.26.0
- Added: a popup or slide-in behaves as a real dialog. Keyboard focus stays inside it, Escape closes it, the rest of the page is out of reach for screen readers and pointers while it is open, the page behind does not scroll, and focus returns to whatever opened it. A sticky bar is a labelled region visitors can read past. Reduced-motion users get an instant open and close.
- Added: the shell around an embedded form takes the same design tokens as the form and exposes a custom property for every part of it, so it follows the studio palette and can be tuned without touching the plugin.
1.25.0
- Added: a submission by someone who is not signed in can now reach that person’s timeline. Until now Forms told the Gather Grove activity stream about a submission only when the visitor was logged in, so a public interest form filled in by a stranger — most of them — never appeared on the member record Pulse later created for them. A plugin that creates the member can now name them through the new
gather_grove/forms/activity_member_idfilter. Forms never guesses from an email address itself. - Added: application decisions are on the activity stream. A submission becoming a pending application, and the owner approving or declining it, now emit
forms.application_submitted,forms.application_approvedandforms.application_declined, so a lifecycle pipeline can move an applicant on the day the studio said yes. The decision note is never carried onto the stream. - Added: integrations are told who submitted and where. An integration adapter now receives the submitter’s user id, the first email field’s value and the placement context, instead of re-deriving them from the values.
- Added: a sibling plugin can list one person’s submissions across every form, newest first, each with a link that opens the entry directly in the Entries screen.
- Added: a scored form’s score rides on its activity events, so “scored 8 or more on the intake quiz” can be a segment.
- Fixed: the duplicate-application guard and the application-state gate were silently off for a logged-in applicant on a form with an email field. The lookup for that case was invalid SQL since 1.21.0, and the error read as “no prior application”, so such a member could apply twice and a gate could ask an approved member to apply again.
1.24.1
- Changed: updated the bundled Gather Grove core to 0.55.0.
1.24.0
- Added: you can remove a form. All Forms now has Archive on every row, an Archived view alongside Active and All, Restore, and Delete permanently. The ability existed from the first release and nothing was ever wired to it, so a form you created could not be taken away again.
- Added: archiving a form stops it rendering everywhere it is embedded while keeping every submission, and the notice that follows offers a one-click Undo.
- Added: deleting a form for good goes through a confirmation page that names the form and counts the submissions it will delete with it. It is offered only on an already-archived form, so a live form is never one click from being destroyed.
1.23.0
- Fixed: the form styles on your pages now read the same design tokens as the rest of Gather Grove. The public form carried its own copy of the palette file, frozen at the moment it was copied, so a colour changed elsewhere in Gather Grove could leave a form and the admin screens showing two different greens.
- Changed: five pieces of logic that had been written out two to four times each — how an email address is matched to an applicant, how a stored answer is read back, how a form’s field keys are resolved, and how an integration records what it sent — are now written once. Nothing behaves differently; there is simply no longer a second copy to drift.
1.22.0
- Changed: the plugin’s own documentation now matches the plugin. The developer notes described hooks and endpoints that do not exist, omitted the whole file-upload feature and eleven real hooks, and still called shipped work “planned”.
- Changed: this readme’s description and questions are written out, replacing placeholders left over from the first release, and the installation steps point at the right place in the admin.
- Removed: an unused helper class, a dead import and two style rules nothing rendered.
1.21.0
- Changed: the Entries screen no longer reads the database once per row. A page of entries took a query per row for its values and another for its attachments; it is now a fixed handful however many rows are shown, so the screen stays quick on a site with years of submissions behind it.
- Changed: exports stream. A CSV of thousands of entries was assembled in memory three times over before anything was sent; rows are now written out in pages as they are read.
- Changed: saving a submission writes its answers in batches instead of one statement per answer, and the submission is no longer read back after being written. A form with a repeater roughly halves its database work per submission.
- Changed: the nightly clean-ups delete in batches of 500 rather than selecting every matching row at once, which is what a first run on a large site used to do.
- Added: database indexes for the three queries that could not use one — the application-approval lookup a gated course consults on every page view, the personal-data search, and the abandoned-draft sweep.
- Changed: screens that only need a form’s name no longer load and decode every form’s full definition, and the Entries screen’s form filter asks for a summary instead of the whole library.
- Changed: bulk actions on entries send one request instead of one per entry. Permanent deletion stays per entry, so a failure can be reported against the entry it belongs to.
1.20.0
- Fixed: a save-and-resume link from one form could be used to complete a different form, filing the submission under the wrong form and destroying the original draft. A resume link now only works on the form it was made for.
- Fixed: an Approve link from a notification email also worked as a Decline link, and neither ever expired. Decision links are now specific to the decision and stop working after 30 days.
- Fixed: applying to a form told an anonymous visitor whether the email address they typed had been declined or was still under review — a way to learn something private about someone else. Both now give the same answer.
- Fixed: a payment confirmation from Stripe could mark a submission paid even when that submission had never started a payment.
- Changed: the visitor’s address used for rate limiting now goes through one place with a filter, so a site behind a proxy can tell the plugin how to read it instead of treating every visitor as one.
- Changed: entering or replacing the Stripe keys now requires a full administrator. Gather Grove managers keep every other Forms permission.
- Fixed: an outbound webhook or Google Sheets connection can no longer be pointed at the server itself or at a private network address; those targets are refused before any request is made.
1.19.0
- Fixed: a form that charges a fee now actually sends people to Stripe Checkout after they submit. The checkout link was built and then dropped from the response, so the submission was saved as awaiting payment and nobody was ever asked to pay.
- Fixed: prices in currencies without a hundredth unit (Japanese yen, Korean won and others) were charged one hundred times over; three-decimal currencies (Kuwaiti dinar and others) were charged a tenth. Amounts are now scaled by the currency’s own minor unit, the same rule the receipt uses.
- Fixed: a database error while recording a Stripe event no longer reads as “already processed” — a payment could be taken, never marked paid and never retried by Stripe.
- Fixed: pressing Enter or OK twice on a conversational form while it was still sending created two entries (two emails, two integration fires, two checkout sessions). One submission is in flight at a time now.
- Fixed: after a validation error on a form protected by Cloudflare Turnstile, the corrected resubmission was silently filed as spam because the spent challenge token was reused. The challenge is reset whenever a submission is refused.
- Fixed: a page with a classic and a conversational form on it mounted the conversational form twice, so one click added two repeater rows and one submit posted twice.
- Fixed: radio buttons and checkboxes ignored their show/hide rules on the page and rendered as plain text boxes inside a repeater; both now carry the same conditions, keys and inputs as every other field.
- Fixed: an email address with a typo was quietly “corrected” into a different, valid address (a space or an accented letter was simply deleted) and stored as if the person had typed it. A malformed address is now refused so it can be fixed.
- Fixed: whole-number fields accepted decimals and stored them truncated, ignored their step, and turned absurdly large input into the largest integer; choices whose value contained
<,%or edge spaces could never be selected; a URL field rejected intranet and private-network addresses and stalled every submission on a DNS lookup. - Fixed: on a multi-step form, an error on an earlier step was written into a hidden step and the form went quiet; it now jumps to the first step with an error, or shows a form-level message. Removing a middle repeater row no longer makes later rows’ errors invisible.
- Fixed: a calculation’s live preview rounded differently from the saved value (-2.5, 1.005, chained calculations). Both sides now round half away from zero and chained calculations read the rounded intermediate.
- Fixed: a resumed form recorded the person who STARTED the draft and the day the draft began — so a guest who finished after logging in landed without their account, and retention aged the entry from the abandoned draft. The completing submission is what is recorded now.
- Fixed: a schema update that could not apply was still recorded as done, leaving the database one column short until someone reset it by hand. A migration now records its version only after verifying the change landed.
- Fixed: deleting entries (by hand, by retention, or with a form) left their uploaded files, upload records and integration history behind; one cascade now removes all of it. Retention never sweeps a pending or approved-but-unredeemed application, which is someone’s place.
- Fixed: a trashed or spam-marked application still blocked that person from applying again and still answered “pending” to a gated course. The public rate limit no longer re-arms its window on every attempt, so steady traffic from a shared address is not locked out indefinitely. The read-only query helpers siblings use no longer count spam and trashed entries as submissions.
1.18.0
- Changed: every Forms admin screen — All Forms, Entries, the entry record, the builder and Settings — is now built from the shared Gather Grove component layer (cards, status badges, banners, empty states), so it reads as one product beside Booking and Pulse instead of as a stock WordPress list table. The component styles are served from the bundled Gather Grove Core rather than a hand-copied set that nothing refreshed, and a build check now fails if a screen stops using them or Core ships a component Forms does not load.
- Fixed: the admin no longer inherits the studio’s front-end palette. A dark brand painted cream text onto WordPress’s light chrome; the admin now takes Core’s contrast-guarded admin accent instead, and picks up the site’s own Elementor palette on sites with no Brand settings (Core 0.53.0).
- Changed: bundled Gather Grove Core updated to 0.53.0 (email header/logo work, dark-mode-safe email card, admin palette tier).
1.17.1
- Fixed: the update screen no longer shows a first-release announcement as if it described your update. Forms carried an “Upgrade Notice” section that stopped at 1.0.0, so every later update fell back to that text and displayed it in a red warning box. The section is gone — matching every other Gather Grove plugin, none of which has one. The changelog above remains the place to read what changed.
1.17.0
- Fixed: Gather Grove Admins and Managers can now open Forms. Its capabilities were granted only to WordPress Administrators, so a studio’s own admins and front-desk managers — who hold Gather Grove roles, not WordPress ones — never saw Forms in the sidebar and could not read entries. The grant now includes both roles on update. Instructors are deliberately excluded: entries hold contact details and disclosures for everyone who submitted, not one instructor’s roster.
1.16.2
- Changed: bundled Gather Grove Core updated to 0.46.1 (documentation-only release).
1.16.1
- Vendored core 0.46.0. Because the newest vendored core copy on a site is the one every Gather Grove plugin runs, this carries two security fixes to sibling plugins: the shared visitor-IP helper now reads the rightmost
X-Forwarded-Forentry (the only one a proxy sets, so it can no longer be spoofed), and push-notification endpoints are checked against a browser push-service allowlist. Also fixes async job cancel/is_scheduled matching and thegather_grove/portal_shell_readyaction now firing. Forms itself readsREMOTE_ADDRdirectly and was not affected.
1.16.0
- Fixed: a submission caught as spam no longer emails you, runs your integrations, or opens a Stripe checkout. It was only ever marked as spam in the entries list — everything else still happened. It is still kept, so you can review it. This also closes a gap where a bot could sidestep the spam check by saving a partial submission first.
- Fixed: anything a visitor types into a form is shown as plain text in your notification email, so a pasted link or image cannot render as a live link or a tracking pixel.
- Fixed: files uploaded inside a repeater row (for example one ID document per participant) are now kept with the entry instead of being cleaned up as unclaimed a day later.
- Fixed: the payment notification now shows the payer’s email address, and amounts in currencies without cents (such as Japanese yen) are shown correctly.
- Fixed: a payment that Stripe reports twice at the same moment sends one receipt, not two.
- Housekeeping: updates the shared Gather Grove code bundled with this plugin (0.45.2 — the branded email footer and postal-address fixes reach Forms’ emails).
1.15.0
- Added: you now get an email when someone pays through a form, and they get a receipt. Until now a payment went through quietly — the only notification was the one sent when the form was submitted, which arrives whether or not the person ever paid. The new emails are sent when the money actually settles, and they use the same branding and logo as your other Gather Grove emails.
- Fixed: a payment could not be acknowledged twice. Stripe sometimes sends the same notification more than once; the receipt is now sent only the first time.
1.14.1
- Housekeeping: updates the shared Gather Grove code bundled with this plugin. Nothing in Forms changes.
Older releases are listed in changelog.txt, included with the plugin and viewable at https://plugins.svn.wordpress.org/gather-grove-forms/trunk/changelog.txt
