ཞིབ་བརྗོད།
Gather Grove Booking runs the schedule for people who teach — yoga and fitness studios, dance and martial arts schools, music teachers, pottery and craft studios, wellness practitioners, and community programs. Design your booking pages visually with Elementor, take drop-in and appointment bookings, and accept card payments with Stripe.
The free version is fully functional for running a real studio:
- Classes & sessions — recurring schedules, capacity limits, multiple locations and rooms.
- Online booking — Elementor booking-form and schedule widgets your clients use to reserve a spot.
- Appointments — bookable service slots with availability windows and optional deposits.
- Waivers & liability forms — collect a real signature as part of booking, then see your whole roster at a glance: who has signed the current version, who signed an older one, whose signature has expired, and who has never signed at all. Send reminders by hand, record a paper signature, or export the lot to CSV.
- Passwordless sign-in — students can sign in with a link emailed to them instead of a password, so nobody is locked out of a booking by a password they never set. Optional, and you choose whether your site offers passwords, magic links, or both.
- Waitlists — clients can join a waitlist when a class is full, and open spots are automatically offered to the next person in line.
- Flexible schedules — a class can meet on multiple recurring schedule blocks (e.g. Mon/Wed/Fri at different times).
- Bulk attendance marking — mark a whole roster present in one action.
- Payments — accept cards through Stripe for drop-in bookings.
- Client accounts — a self-service dashboard for bookings and profile.
- Attendance — front-desk and instructor check-in.
- Instructors & locations — profiles, assignments, and per-location schedules.
Who it’s for
- Yoga, pilates and fitness studios — recurring drop-in classes, capacity limits, waitlists, and a signed waiver on file before anyone steps on a mat.
- Dance and martial arts schools — several weekly schedule blocks on one class, per-location rooms, and front-desk check-in.
- Music teachers and schools — appointment-style lessons with availability windows and optional deposits, alongside recurring group classes.
- Pottery, craft and maker studios — small capacities, multiple rooms, and a roster you can mark present in one action.
- Wellness practitioners — one-to-one appointments shown in the visitor’s own timezone, with a self-service client dashboard.
- Community programs and co-ops — free and comp bookings with no payment gateway required, and waiver compliance across a whole roster.
Built for Elementor
The client-facing pages (booking form, class schedule, appointment booking, client dashboard) are Elementor widgets, so you design them visually alongside the rest of your site. The free Elementor plugin is required to display these on your site. Elementor Pro is optional — it unlocks dynamic tags and one-click Theme Builder starter pages, but is not required for booking to work.
External services
This plugin connects to the following third-party services.
Stripe — used to process card payments after you connect a Stripe account and a client pays for a booking or appointment. The booking and payment details required to create the charge (amount, currency, and related metadata) are sent to Stripe at payment time. Stripe.js is loaded from Stripe’s servers on pages that display a payment form, as required for PCI compliance.
Terms of service: https://stripe.com/legal — Privacy policy: https://stripe.com/privacy
Google Maps — used by the optional Location “Map Embed” and “Directions Link” Elementor dynamic tags. If you place the Map Embed tag on a page, the visitor’s browser loads an embedded map from google.com for the location’s address (Google receives the visitor’s IP address and the studio address, as with any embedded map). The Directions Link tag only builds a link to google.com/maps containing the studio address; nothing is sent unless the visitor clicks it. No data is sent from your server, and neither tag is active unless you add it to a page.
Terms of service: https://policies.google.com/terms — Privacy policy: https://policies.google.com/privacy
Zoom — used to automatically create, update, and delete Zoom meetings for virtual class and appointment sessions, only after you connect your own Zoom Server-to-Server OAuth app under Settings Integrations. When a virtual booking is confirmed (and on reschedule or cancellation), your server sends the session’s topic, start time, duration, timezone, and the host’s email address to api.zoom.us / zoom.us using your own credentials. Nothing is sent unless you enable the integration, and visitors’ browsers never contact Zoom through this plugin.
Terms of service: https://explore.zoom.us/en/terms/ — Privacy policy: https://explore.zoom.us/en/privacy/
གཏུབ་རེིས།






སྒྲིག་འཇུག
- Install and activate the free Elementor plugin (Plugins Add New search “Elementor”).
- Upload the
gather-grove-bookingfolder to/wp-content/plugins/, or install the zip via Plugins Add New Upload Plugin. - Activate Gather Grove Booking through the Plugins screen.
- Go to Gather Grove Settings to configure your studio, then connect Stripe under the Payments tab.
- Use Gather Grove Getting Started to create your booking and schedule pages.
FAQ
-
Do I need Elementor?
-
Yes — the free Elementor plugin is required to display the booking form, schedule, and other client-facing pages. The admin and booking engine run without it, but your visitors need the Elementor widgets to book.
-
Do I need Elementor Pro?
-
No. Elementor Pro is optional. It adds dynamic tags and automatic Theme Builder starter pages, but every booking feature works with the free Elementor plugin.
-
How are payments processed?
-
Card payments are processed by Stripe. You connect your own Stripe account; Gather Grove never stores card numbers on your site.
-
Does it work without a payment gateway?
-
Yes. You can run free classes, complimentary (comp) bookings, and offline/invoice payments without connecting Stripe.
-
Will my data be deleted if I uninstall?
-
No. Uninstalling leaves your studio data intact by default so you can reinstall safely. You can opt in to full data deletion under Settings General Danger Zone.
-
Can I style the widgets using my real classes in the Elementor editor?
-
Yes. Gather Grove widgets show a styleable sample by default in the Elementor editor. To style against your actual content, open the widget’s Content tab, find the “Editor Preview” section, and set “Preview in editor” to “Real data” (for the Class Card widget, also pick a specific class). The editor canvas then renders your real class so you can style it without switching to the live page. This is rolling out across the widgets — the Class Card and Sessions List widgets have it today, with more on the way. It only affects the editor; your published page always shows live data.
གདེང་འཇོག
There are no reviews for this plugin.
བྱས་རྗེས་འཇོག་མཁན། & གསར་འབྱེད་པ།
“Gather Grove Booking” is open source software. The following people have contributed to this plugin.
བྱས་རྗེས་འཇོག་མཁན།ཁྱེད་ཀྱི་སྐད་ཡིག་ནང་ལ་ “Gather Grove Booking” ཡིག་སྒྱུར་བྱོས།
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
དག་བཅོས་ཉིན་ཐོ།
1.178.1
- Maintenance: the WordPress.org build no longer includes a file that only the paid membership-applications screen uses. Nothing changes for your studio.
1.178.0
- New: birthday greetings can go out at the start of each client’s birthday month instead of on the day. Choose “At the start of their birthday month” under Settings > Emails > Automated > Birthday Greeting. Everyone with a birthday that month is greeted on the 1st, and anyone who adds their month later is greeted the next morning. Each client still gets one birthday email a year.
- New: in birthday-month mode, the Birthday field on My Account becomes a simple month picker. Many people are happier sharing a month than a full date. Birthdays already on file count automatically. Staff can set a month on the client’s Profile tab.
- New: the {birthday_month} placeholder for the Birthday Greeting template.
- New: promo codes can limit each client to a number of uses per calendar year instead of ever, and can be restricted to the client’s birthday month. Together they make one shared “free class in your birthday month” code safe to publish.
- Fixed: saving your profile on My Account no longer erases your address. The form doesn’t show the address fields, and each save was clearing them.
1.177.3
- Fixed: the Class Discovery widget could overload a slow server. Each time a visitor changed a filter or typed another letter in the search box, the widget dropped its previous request and sent a new one — but the server finished every dropped request anyway, so they piled up. The widget now sends one request at a time, follows it with a single request for the latest filters, and waits longer between searches when the server is answering slowly. Results and links are unchanged.
1.177.2
- Fixed: approving a free membership with “Approve a membership” (or the founding-cohort import) now gives them the membership straight away, the same as approving a request they made. Before, it only marked them approved, so they held no membership and, if emailed, were asked to complete a purchase for a free plan. A rate you agreed with them is never waived.
- Fixed: the “Approve a membership” card now says what happens for free and paid memberships, marks free memberships in the list, and confirms when a free membership has been granted.
1.177.1
- Fixed: Membership Requests no longer tells staff that approving always emails a link to pay. Each waiting request or application now says what Approve will do: a free membership is granted straight away; a paid request emails a link to complete the purchase; a paid application emails the applicant that they are approved so they can buy it. Nobody is charged by approving.
1.177.0
- Added: Membership Requests now shows membership applications sent through an application form, next to the requests made on the site, so everyone waiting for a decision is on one page. Each shows who applied, for which membership, when, how long they have been waiting, and a link to their full application. Approve or Decline works exactly as it does in Forms — the applicant gets the same email, and a free membership is granted the same way. The menu count includes them. Needs Gather Grove Forms 1.30.0 or newer; staff also need permission to manage forms to see and decide applications.
1.176.0
- Fixed: a membership switched on by the daily payment check (when Stripe’s notification was missed or late) now sends the member their “Purchase confirmed” receipt and is recorded as a purchase — once, whichever check notices the payment first.
- Fixed: a member’s receipt is no longer skipped when the payment is confirmed while a staff member is logged in. Gifts are still receipted only to the person who bought them.
- Fixed: class packs paid with a card that needed extra verification now send the buyer a receipt.
- Fixed: a membership agreement form can no longer be signed on someone else’s login. If the email typed on the agreement isn’t the signed-in person’s, the form asks them to sign in as that person instead of filing the signature to the wrong account. Parents signing for a child from the family link are unaffected.
1.175.0
- Fixed: approving an application now grants a free package to the applicant named by the email on the form, not to whoever happened to be logged in on the device it was filled in on. If that email has no account yet, nothing is granted to anyone (as for any guest applicant).
- Fixed: members whose card payment is confirmed after checkout now get their “Purchase confirmed” receipt. Every membership is receipted exactly once, however it activates; gifts are still receipted to the giver, and renewals are not receipted as purchases.
- Fixed: a membership activated after checkout is now recorded as a purchase in the activity stream, so purchase history and tier-based member tagging see it.
1.174.2
- Fixed: a package’s “What’s included” lines (and every other list the plugin stores as JSON) kept accented letters, dashes and other non-ASCII characters intact. An em dash used to be saved as the four characters “u2014” and show that way in the shop.
1.174.1
- Security: the instructor profile’s intro-video embed is now filtered through wp_kses at output (an iframe allow-list on top of the plugin’s widget allow-list).
- Changed: the JSON-LD class schema is encoded at the echo.
1.174.0
- Fixed: signing in through the Login widget from a link that names a page — “sign in to continue” — now takes you to that page. It used to send everyone to their usual page (My Account, the Instructor Dashboard, or home), so a member invited to a community room who already had an account accepted, signed in, and landed on My Account instead of the room. Only pages on your own site are followed; anything else still goes to the usual page.
1.173.0
- Fixed: a demo fixture (seeded instructor, its linked user, or seeded member) is never mailed — judged by record, not by domain, and regardless of Demo Mode, booking scope, or the release filter.
1.172.0
- Fixed: co-teachers did not get the pre-class roster email listing who is coming. If the lead teacher had no email address saved, nobody got it — the roster was dropped silently, with nothing in the plugin to say so. Everyone teaching a session now gets their own copy.
1.171.3
- Fixed: if you renamed Appointments to your own word under Settings Custom Labels, the word never appeared anywhere — the Services menu ignored it. It now uses your wording, the same way Classes and Instructors already did.
- Fixed: the Gather Grove dashboard tile always said “Today’s classes”, even for studios who call them events, gatherings or ceremonies. It now uses your own word.
1.171.2
- Fixed: a class scheduled for a different length than usual showed its usual length on the schedule. If you ran a 90-minute class for two hours at a special event, or trimmed one to 75 minutes for the day, the booking, the times and the reminder email were all correct — but the schedule, the class list and the pop-up all still said 90 minutes. Every view now reads the length from the session itself.
1.171.1
- Fixed: cancelling a booking that was paid with a pack could fail to give the session back. On packs where the booking had never been counted, the database refused the whole update, so the member’s remaining sessions were not credited. Sessions are now always restored.
- Changed: the public schedule and class-grid renderers close their output buffer on the same straight-line path as every other buffer in the plugin; the exception path discards it explicitly.
1.170.4
- Fixed: payments made for a child showed up in Reports with the Client column blank. A family membership is bought for the child, and a child has no login of their own, so there was no name to print — the money was always counted, it just had nobody’s name against it. Rows now read the child’s name, with a new “Paid By” column naming the parent, in the transactions list and the CSV export alike.
- Fixed: a parent’s own Purchases tab said “No transactions found for this client” even after they had paid, because their children’s payments were filed under the children. The tab now shows everything the household has paid, with a Member column saying who each payment was for.
1.170.3
- Fixed: nobody could create an account from the sign-up pop-up. If you ask new members for a phone number — which is the default — the pop-up never showed a phone box but still refused to continue without one, so anyone signing up from a class page or an RSVP hit “Please enter a phone number” with nowhere to type it. The box is now there. The separate Login and Register pages were never affected.
1.170.2
- Fixed: two membership and household lookups rebuilt so the WordPress.org security scanner can verify them. No change to what they return.
1.170.1
- Changed: updated the bundled Gather Grove core to 0.55.0.
1.170.0
- Fixed: a studio that started using Pulse after it had already been selling could never get its membership history across. Booking has always told Pulse about a purchase as it happens, but it had no way to hand over the ones that came before — so “everyone on the $99 tier” or “when someone buys a membership” simply had nothing to work with, and the import said it had finished. Past purchases, memberships and renewals now come across with the rest of the history.
- Fixed: a renewal now arrives as its own event on the day it was paid, rather than everything folding back onto the day the member first joined. Without that, a member who has paid every month since 2023 looked like they last bought something two years ago — which is exactly the kind of member a win-back campaign should never be mailing.
- Fixed: purchases imported from another platform came across dated to the day the import ran and priced at zero. They now carry the date and price they actually had.
- Added: Booking now tells Pulse which kinds of past activity it cannot hand over, and why, so “the import finished” stops being mistaken for “you have everything”. Past failed and recovered payments are the honest gap — Booking records where a payment ended up, not the moment it went wrong, so those can only be captured from now on.
1.169.0
- Fixed: if you asked for access to a members-only class while booking for someone in your household, the access was granted to you instead of to them — so the studio approved it, you were told you were approved, and the class still turned you away. The request now asks who it is for, and the approval lands on that person.
- Added: a “Who is this access for?” choice on the request panel, listing exactly the people you are allowed to book for. Anyone who already has the membership, or already has a request waiting on it, is left off.
- Fixed: emails about a membership request now go to whoever asked for it. A request made for a child or a family member without their own login used to resolve to an address that did not exist, and the approval email quietly went nowhere.
- Fixed: the studio’s request email now names the person the membership is for, not just the person who asked — approving puts the membership on their account.
- Fixed: after your request was approved, an adult family member you book for could disappear from the checkout you had just been told to complete.
1.168.0
- Fixed: a parent could see a family member in the booking form’s “Who is this for?” list, choose them, and be told “You don’t have permission to book for that person”. The list showed everyone in the household; the booking check allowed a narrower set. They now come from the same place, so the list can never again name somebody the booking is going to refuse.
- Fixed: an adult you had granted “Can manage children” got no “Who is this for?” list at all, so the one person that setting exists to help had no way to say which child they were booking. They now see the children they are allowed to book for.
- Added: supported adults. Someone with their own account can now say that the adults in their household may book classes and appointments for them — for a self-directed or day-programme participant, an adult child, or anyone else who has their own login and would rather a parent or caregiver did the booking. Turn it on from the Household section of your account, or ask the studio to set it up.
- Added: studios can record the arrangement from Clients Household, with a new “Booked for by household” column. The person can always turn it off again themselves.
- Changed: the household roster now says why you cannot book for a linked adult, on the roster where you added them, instead of leaving you to find out at checkout.
- Note: only the person themselves or the studio can turn this on — a payer cannot grant it to themselves over another adult. Memberships remain non-transferable: a supported adult needs their own pass, which a caregiver can buy and use on their behalf.
1.167.0
- Fixed: booking and course confirmations no longer promise “a full refund” for cancelling. Cancelling has never returned money automatically — refunds have always been the studio’s own decision — so the email was committing you to something the software does not do.
- Fixed: the cancellation email no longer tells a member that a named amount “will be returned to your original payment method within 5-10 business days”. It now states what they paid and leaves the refund to you.
- Changed: confirmations now show YOUR Cancellation Policy from Settings, the same words shown at checkout. Previously the emails ignored it and stated their own rule, so a studio could advertise one policy and have its confirmation contradict it.
- Note: the “cancellation window” setting has never been enforced anywhere in the booking system, and this release does not start enforcing it. Members can still cancel at any time. Set your Cancellation Policy text to describe what you actually do.
1.166.0
- Fixed: the studio’s address now also appears on appointment confirmations, course enrolment confirmations, the email a guest gets when someone books them a seat, and the note a substitute teacher receives — the four other messages sent to someone expected to turn up somewhere.
- Fixed: “Add to Calendar” carries the address everywhere it appears, including on a member’s account page and in an instructor’s subscribed calendar feed. A substitute covering an unfamiliar room gets a calendar entry that actually navigates.
- Note: cancellations, rejections and “you are back on this class” notices deliberately do not show an address — nobody is being asked to travel.
1.165.0
- Fixed: booking confirmations now show the studio’s street address under the location name. They named the place but never said where it was, which for a studio whose name is its brand left a first-time student with nothing to navigate to.
- Fixed: “Add to Google Calendar” and the calendar invite attached to a confirmation now carry the full address, so tapping the entry for directions actually finds the place instead of searching for the studio’s name.
- Fixed: a suite or unit number entered on a location was never included in any address, sending students to the right building and the wrong door.
- Changed: addresses now read “Crestone, CO 81131” rather than “Crestone, CO, 81131”, and are formatted the same way everywhere they appear.
1.164.0
- Added: promo codes now work on the enrolment checkout link, so an offer made at an info session or agreed with one student can be redeemed by typing the code — the discount is worked out on your server from the code and the package price, never from the link.
- Added: a promo code can be limited to specific packages, so a code written for one programme cannot be spent on anything else.
- Fixed: a code that cannot be used says so and returns you to the page you typed it on, instead of quietly sending you to Stripe at the full price.
1.163.1
- Fixed: since 1.162.0 the booking window opened from the schedule did nothing on some pages, because the booking script’s settings were attached before the script existed. Found in the browser check, not by the tests; a test now pins the order.
1.163.0
- Changed: housekeeping found by review, none of it visible. Four empty placeholder files, twenty-nine methods nobody called, five unused constants, eight unused imports and about forty-five stylesheet rules that matched nothing are gone; three screens share one status-badge helper and three exports share one CSV writer; every dollar amount goes through the currency formatter (a studio charging in another currency saw a stray “$” in three places); the plugin’s scripts keep their helpers under one namespace; and the developer notes stop describing widgets and list tables that were removed months ago.
1.162.0
- Changed: the public schedule, class lists, calendar and instructor dashboard now read each class’s details once per page instead of several times per row, so busy schedules load with a handful of database reads.
- Changed: the Front Desk roster, Waiver Compliance report, Invoices list, Bookings list, Clients list and CSV export, package shop and enrolment picker each make one read for the whole page instead of one per row.
- Changed: attendance now has database indexes for the counts and reports that read it, so milestone and attendance lookups stop scanning the whole table as history grows; the mail log is indexed for the reminder sweep.
- Changed: generating a season of sessions clears the schedule cache once, not once per session; scheduling an automation is a single write that cannot double-schedule under load; email styling and custom class labels are resolved once per batch of emails.
- Changed: Booking’s stylesheet and scripts load only on pages that actually contain a Booking widget.
1.161.0
- Fixed: typing a member’s email address into the guest checkout — for a class, an appointment or a gift card — attached the booking to that member’s account, emailed them a confirmation they never made, and quietly turned their account into a “guest” one. An address that belongs to a member is now asked to log in; a returning guest can still book without a password.
- Fixed: “book for someone else” could be used without logging in, minting accounts for any email address and booking them past the waiver. It now requires a logged-in buyer, and the option only appears when you are logged in.
- Fixed: the “you already have credit that covers this class” prompt listed a member’s packs and balances to anyone who typed their email. It is only offered to logged-in members now.
- Fixed: a family promo code took the household size from the form, so a single-person household could claim the large-family discount on twenty bookings from one code. The size is now the household on record.
- Changed: checking a promo code while logged out gives the same answer whether the code is new-clients-only or already used by that address, so an address cannot be probed. Household invitations and gift-card redemption attempts are rate-limited.
Older releases are listed in changelog.txt, included with the plugin and viewable at https://plugins.svn.wordpress.org/gather-grove-booking/trunk/changelog.txt
