- Brand
- 1club
- Category
- Operations
- Primary Subcategory
- Branded Fitness Class & Coaching Booking
Integration details
Description
1club Admin lets the owners and staff of sports clubs, gyms and studios that run on 1club manage their business from ChatGPT. Review the class schedule and rosters, find a member's bookings and remaining sessions, book courts and classes, record attendance, keep memberships and the product catalogue up to date, and edit your website as a draft you preview before publishing. Sign in with your 1club account and choose which business to connect; you decide which kinds of access to grant, and every action is limited to that business and to the access you granted.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Branded Fitness Class & Coaching Booking
- Secondary Subcategories
- None listed
- Brand
- 1club
- Access
- Account required
- First tracked
- 2026-10-30
- Tool count
- 204
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for 1club Admin
Get updates when 1club Admin’s Discoverability Score or category rank changes.
Competing in ChatGPT Branded Fitness Class & Coaching Booking
View Category204 tools agents can invoke
Add another player to a booking - for example the other three players on a doubles court. The contact must already exist (use search_contacts or create_contact). The total, counting the person the booking is for, is capped by the area type's maximum players. Reaches the same bookings as cancel_booking: any of the organization's over an OAuth connection, and only the ones it created itself with a developer-managed API key. Requires the 'bookings:write' scope.
add_booking_participant
Put tags on contacts, keeping every tag they already carry. A name no tag has becomes a new manual tag, so check the spelling against list_tags first. Smart and interest tags are refused: they are applied from the organization's rules, which would undo a hand-made change. Returns each contact's tags as they now stand. Requires the 'contacts:write' scope.
add_contact_tags
Add one section to a page, leaving the sections already on it alone. Appends it, or inserts it at `position` (0-based; a position past the end appends). Use it for a single addition - a FAQ under the pricing, a gallery at the end; to rebuild or reorder a page, send the whole list with update_website_page instead, which is one request and cannot leave the page half-built. Call get_website_section_types first for the valid types and the config fields each one takes - an invented type is refused and an invented field renders wrong. Refused when the page has reached its section limit. Returns the page with the section in place; sections after it shift down by one, so re-read indexes from that before using update_website_section or remove_website_section. Edits the draft; call publish_website to make it live. Requires the 'website:write' scope.
add_website_section
Write a role's saved notification settings onto every person in the role, replacing the choices they made themselves. Use it only when the user wants everyone to get exactly the saved settings, and say how many people that is (userCount from get_notification_settings) - it is not undone by changing the setting back. Limit it with categories. Requires the 'notifications:write' scope.
apply_notification_settings
Retire a contact who has left the club. Nothing is destroyed - the contact is archived, so their charges and payments survive, but they disappear from search_contacts and cannot be booked or sold to. It also cancels their active memberships and every future booking they hold, and restoring the contact in 1club does not bring those back, so list what you are about to destroy first and confirm with the user before calling this. list_memberships and list_bookings both take a contactId, but neither is a complete preview: list_bookings shows only bookings the contact organized, not ones they are an additional player on (those are released too), and it defaults to a 7-day window - pass from and to to look further ahead. Never call this to "clean up" a duplicate; merging is done in 1club. Requires the 'contacts:delete' scope, which is separate from 'contacts:write' for that reason. It is refused for a staff member or owner with admin access, an instructor with upcoming classes, and a contact paying part of a split bill - all resolved in 1club first; an ordinary member with a portal login archives normally. A 409 with code CANCELLATION_CHARGE_DECISION_REQUIRED means a future booking was paid: ask the user whether to refund it in full or apply the cancellation terms, then call again with keepCancellationCharge. A 409 with code ARCHIVE_INCOMPLETE means the opposite of the others: the contact IS archived and only the release is unfinished, so call again with the same arguments to reconcile it.
archive_contact
Add coaches to a pay rate policy, leaving the ones already on it alone. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Use this when the user wants to put one or more coaches on an existing policy - it is the additive counterpart of update_pay_rate_policy, whose instructorIds replaces the whole list, so prefer this for "also cover X". Adding the first coach to a policy that named none narrows it: an empty list meant every coach without a policy of their own, so it stops being the organization-wide default - confirm that with the user first. A coach already covered by another policy for the same work comes back as a conflict naming that policy; the fix is to take them off the other one, not to retry. Returns the policy with its coaches as they now stand. Requires the 'instructors:write' scope.
assign_pay_rate_policy_instructors
Enrol one customer in a class occurrence - the booking the club's staff make when they add someone to a class from the admin portal, through the same pipeline: the class's capacity, its booking policy, an existing waitlist entry (converted into this booking) and the 'already on this class' check all apply, and the seat takes the class's time, club and price. Use it when the user asks to put someone on a class; resolve the occurrence id with list_classes (one row per session) and the customer with search_contacts. Identify the customer with exactly one of contactId or an inline customer matched by email and created if new; prefer contactId. payment.status 'paid' records the seat as settled against a payment method named after the connection (no card is charged); 'unpaid' leaves it outstanding. With 'unpaid' and no amount, a membership of the customer's that covers the class is used - one session is spent and nothing is owed - and otherwise the class price is recorded as owed; so leave amount out unless the user named a price. A full class, a cancelled class and one that has already run are refused, and nothing here overrides that - tell the user rather than retrying; a customer already booked on, teaching or checked in to the class is refused too. Read the roster afterwards with list_class_bookings. Requires the 'bookings:write' scope.
book_class
Cancel a booking by its 1club booking ID. Over an OAuth connection this covers any of the organization's bookings, whichever channel created it; a developer-managed API key can only cancel the bookings it created itself. Requires the 'bookings:write' scope. Refunds follow the money: on a booking this API created the caller collected it, so 1club moves nothing but records what was given back - with a developer-managed API key everything collected unless refund.amount says otherwise (send what was actually returned when the partner kept a share, 0 when it kept it all); over an OAuth connection nothing is recorded unless refund is sent. On a booking taken through 1club the club is cancelling: an unpaid booking owes nothing, and a paid one needs keepCancellationCharge (refund in full, or apply the cancellation terms) - ask the user. A booking that has already been checked in cannot be cancelled. The customer is told unless you set notifyCustomer false - except on a booking this API created, where they are not told unless you set it true. Idempotent.
cancel_booking
Cancel an event. This CANCELS EVERY ACTIVE BOOKING for it (and any tournament played at it) and cannot be undone - a cancelled event cannot be published again. Nobody is refunded automatically; refunds stay with staff in the 1club admin portal. Tell the user how many bookings it has (bookedCount from get_event) and get their explicit confirmation first. Requires the 'events:write' scope.
cancel_event
Create the club's own editable copy of a system email, seeded with the built-in subject and body. From then on the copy is what gets sent, so edit it with update_template right after; deleting it restores the built-in email. One copy per email: if one exists the call fails with its id (also shown as overrideTemplateId by list_system_templates) - edit that one instead. Not available on Free. Requires the 'templates:write' scope. Pass idempotencyKey so a retry cannot fail on the copy it just made.
copy_system_template
Add a bookable area - a court, a studio, a lane - to one of the organization's clubs. Resolve clubId with get_club and areaTypeId with list_area_types first; both must belong to this organization, and the area type is what makes the new area bookable for a sport, so never guess it. A new area defaults to active and publicly visible and appears in availability immediately. Requires the 'areas:write' scope, the same one that blocks and unblocks areas - an OAuth connection made before this tool shipped will not have it until the user reconnects. Pass idempotencyKey so a retry cannot create the area twice.
create_area
Close a court, or a whole club, for a time range. Requires the 'areas:write' scope. Send areaId to close one court (its club is derived), or clubId with areaId omitted to close every court in that club with a single record - use the club-wide form for holidays and camps rather than creating one block per court. Existing bookings in the window are NOT cancelled; the block only stops new ones. Pass idempotencyKey so a retry cannot create the block twice.
create_area_block
Add a kind of space the organization books, so create_area has a type to hang courts on. Call list_area_types first and only create one if nothing fits - a second "Padel court" splits inventory that should be one group. Give it sports: a type with none produces areas nobody can book for anything. Requires the 'areas:write' scope, the same one that creates areas. Pass idempotencyKey so a retry cannot create the type twice.
create_area_type
Create a booking on an area (e.g. a padel court), optionally with an instructor leading the session. Identify the customer either with contactId - resolve it first via search_contacts, or create them with create_contact - or with an inline customer object matched to a contact by email and created if new. Pass exactly one of the two; prefer contactId whenever the contact can be resolved. payment.status is 'paid' (money already collected, recorded against a payment method named after the API key so the club can reconcile it) or 'unpaid' (outstanding); amount is the price the customer paid, before any fee the caller kept, and defaults to the area's price for the slot plus the instructor's hourly rate when an instructor is attached. With 'paid', payment.reference carries the caller's own payment id and payment.fee its commission - the sale is recorded at amount, the fee is for reconciliation. 1club's member-facing booking policy (minimum notice, maximum days in advance, operating hours, slots already in the past) is not enforced for this API, so an existing or historical schedule can be recorded as-is - but a real double-booking, the area's capacity, and instructor bookability are always enforced. Requires the 'bookings:write' scope. Pass idempotencyKey so a retry cannot create the booking twice.
create_booking
Create a booking policy. name and clubIds are required; everything else defaults to free cancellation, no forced payment and every flag off, governing every booking for everyone. A policy is scoped on WHAT it governs (validFor: classes, areas and/or instructors, optionally narrowed to types; empty = every booking) and WHO (audience: contact types, tags, plans held; null = everyone), and narrowed to clubIds (empty = every club). When several apply, the most specific wins - club-specific first, then what+who, what, who, then the unscoped default; a tie goes to the newest. So a new policy can take over bookings another policy governed - check get_effective_booking_policy before and after. Every id must belong to the organization. Policies are live as soon as they are written: new bookings follow them at once (existing bookings keep the cancellation terms they were made under). Confirm with the user first, and check the outcome with get_effective_booking_policy. Requires the 'booking-policies:write' scope. Pass idempotencyKey so a retry cannot create the policy twice.
create_booking_policy
Record attendance, in one of two ways - send exactly one of bookingId or contactId. (1) An existing booking: pass bookingId (resolve it with list_bookings or list_class_bookings first). The booking must be confirmed or pending, inside its configured check-in window, paid when policy requires it, and not already checked in. (2) A member walking in with no booking: pass contactId and clubId, and the member is checked in at that club on their membership, the way the front desk's direct check-in does, spending one session from it. Leave out membershipId and externalProgramId to use the member's own covering membership (one with nothing owed is preferred), name the membership with membershipId (from list_memberships), or record the visit against a zero-fee external program with externalProgramId - at most one of the two. The membership must not be limited to particular classes, areas or instructors, must have sessions left, and must have nothing owed on it: a membership that still owes money is refused, so tell the user to check the member in at the front desk where staff can see what is owed. Nothing is charged. To check someone into a class or onto a court, book it first (book_class or create_booking) and check that booking in. Pass idempotencyKey so a retry cannot record attendance twice. Requires the 'checkins:write' scope.
create_checkin
Create a class: its club, time, capacity, area, and instructors. Use list_areas and search_instructors to resolve IDs first. Times need an explicit offset. For a class that repeats, pass `recurrence` - one call then creates the whole series, so do NOT call this once per occurrence. Requires the 'classes:write' scope. Pass idempotencyKey so a retry cannot create the class twice.
create_class
Add a kind of class the organization runs. Call list_class_types first: a gym rarely wants two types meaning the same thing, and this tool will happily create a duplicate name, after which half its classes are filed under one and half under the other. Only name is required - leave the rest out unless the user described that behaviour, since the defaults (one person per booking, no self-cancellation, the default revenue account) are what most types want. Requires the 'classes:write' scope. Pass idempotencyKey so a retry cannot create the type twice.
create_class_type
Create a contact (customer) in the organization. Search first with search_contacts (by name and by phone) - creating a contact whose email already exists fails, as does one with the same name and phone number as an existing contact (the error names that contact's id - use it), and duplicate people are hard to merge afterwards. At least one of email or phone is required. Requires the 'contacts:write' scope. Pass idempotencyKey to make a retry safe.
create_contact
Create a content item - a blog post, an FAQ entry, a reusable website block, a signable document, or a how-to guide. Requires the 'content:write' scope. Send the body as contentBlocks (preferred) or contentHtml, not both. The returned `slug` may differ from one you asked for, since a clash gets a numeric suffix - use what comes back, especially when pointing a website `block` section at it. To publish the same item in another language, create it again with the slug that came back and a `language` - same slug, different language, and the site serves each visitor the right one. When a user asks for a waiver or agreement and gives no wording, write sensible default clauses rather than refusing.
create_content
Add a custom field to the organization's contacts. Pick the type that fits (select with options for a fixed list). It is staff-only unless the user wants members to see it; a field the sign-up form must ask needs requireOnSignup and a member-visible visibility. Requires the 'contacts:write' scope. Pass idempotencyKey so a retry cannot create it twice.
create_custom_field
Make one or more documents something matching members are asked to read and accept. documentIds are content items of type "document" (find or create them with list_content / create_content). Leaving filters out asks EVERY member. A mandatory rule (the default) blocks members from finishing account setup until they accept; set mandatoryToAccept false for an optional one such as a marketing consent. requiresTypedNameAcceptance and requiredForEntry only exist on a mandatory rule, consentChannel only on an optional one - asking for the wrong combination is refused rather than silently dropped. requiredForEntry stops unsigned members checking themselves in as soon as the rule is saved, so confirm it with the user first. Requires the 'document-rules:write' scope. Pass idempotencyKey so a retry cannot create the rule twice.
create_document_rule
Create an event. It is always created as a DRAFT that members cannot see; call publish_event afterwards, once the user has confirmed it. The club, coaches, areas and each ticket's revenue account must belong to the organization, and the club must still be taking events. To sell places, add tickets. Requires the 'events:write' scope. Pass idempotencyKey so a retry cannot create the event twice.
create_event
Create a form. IMPORTANT: it is LIVE immediately at the returned publicUrl - there is no draft - so show the user what you are about to create and get their go-ahead first. createsAccount is required and can never be changed: true makes a sign-up form, which registers whoever completes it and sells what it offers (completing one with a plan creates a real membership, or takes payment for a plan paid up front); false makes a fill-in form that only collects answers and turns an unknown visitor into a lead. Resolve plans with search_plans and products with search_products first; only active, publicly visible ones are accepted. After creating a fill-in form, add its questions with set_form_questions. Read slug and publicUrl from the result; a null publicUrl means the club has no member portal or live website switched on, so tell the user nobody can open the form until they turn one on. To send people to a sign-up form from the website's header or footer button, set signupFormSlug with update_website_layout. Requires the 'forms:write' scope, which is new: an OAuth connection made before it shipped has to be reconnected. Pass idempotencyKey so a retry cannot create the form twice.
create_form
Add an instructor (a coach) to the organization. They must already exist as a contact, so call search_contacts first and create_contact if they are new, then pass that contactId here. IMPORTANT: this does NOT invite them to the staff portal - it creates a bookable coach with no login, no role and no invitation email, and sending sendInvitation, organizationUserId, role or color is rejected. If the user wants their coach to be able to sign in, tell them to invite them from the 1club admin portal. hourlyRate here is what a MEMBER pays for an hour with them; what the gym pays the coach is a separate thing, set with create_pay_rate_policy. A contact who already has an instructor profile is a conflict naming that profile - use update_instructor on it, including to bring an inactive coach back. Requires the 'instructors:write' scope, which is new: an OAuth connection made before it shipped has to be reconnected before this works. Pass idempotencyKey so a retry cannot create the instructor twice.
create_instructor
Add a kind of coach. Call list_instructor_types first and only create one if nothing there fits - most organizations already have a type per sport, and a near-duplicate splits the roster. Only name is required. Requires the 'instructors:write' scope. Pass idempotencyKey so a retry cannot create the type twice.
create_instructor_type
Add an already-hosted image or video to the organization's media library so a website section or content item can use it. Requires the 'media:write' scope. This does NOT upload a file - the file must already be reachable at a public https URL; if the user has a file on their computer, tell them to upload it in the admin dashboard instead. Give it a descriptive `name`, since that is what list_media searches. Registering a URL the library already has updates its details and returns the existing item.
create_media
Put a customer on a plan. Resolve the customer with search_contacts and the plan with search_plans first. The plan is snapshotted onto the membership exactly as it is when sold in 1club, so allowance and coverage behave identically. payment.status is 'paid' (money already collected, recorded against a payment method named after the API key with no card charged; payment.reference and payment.fee carry the caller's own payment id and commission for reconciliation) or 'unpaid' (left outstanding). The plan supplies the price, joining fee, billing frequency, session allowance and minimum term, so a normal sale sends nothing but the customer, the plan and the payment status. How long it runs follows from the plan too: it starts at startDate and its end date cannot be set here. Use overrides only for a negotiated sale or when migrating a partly-used pass. Collection and refunds stay with you. Requires the 'memberships:write' scope. Pass idempotencyKey so a retry cannot create the membership twice.
create_membership
Create a membership plan. A normal plan needs a name, price, billing frequency, and validFor scopes describing which bookings it covers. Set validFor.scopes to classes, areas, and/or instructors; an empty validFor creates a generic direct-entry plan. Requires the 'plans:write' scope. Pass idempotencyKey so retries cannot create duplicates.
create_plan
Add a membership plan category. Omit sortOrder and it goes to the end of the list, which is what you want unless the user is rebuilding the whole ordering. Check list_plan_categories first - a gym rarely wants two headings meaning the same thing, and this tool will happily create a duplicate name. Requires the 'plans:write' scope.
create_plan_category
Write a DRAFT email, SMS or WhatsApp Message. It is NOT sent: there is no way to send through this tool set. The draft waits in the 1club admin app (Messages, drafts) for a member of staff to review and send it - tell the user that. type is email, sms or whatsapp (push notifications cannot be drafted). An email needs a subject. Name the audience with exactly one of contactIds or segment. With an API key the draft is attributed to the person who created the key. Requires the 'messages:write' scope. Pass idempotencyKey so a retry cannot write the draft twice.
create_message_draft
Create a rule for what the club pays its coaches. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Set earnings.kind to "individual" for one-to-one sessions or "class" for group classes; the rate fields differ and the wrong ones are rejected. instructorIds is required: name the coaches, and send an empty list only when the user genuinely means every coach - that makes this the gym-wide default and re-prices everyone. Two policies cannot claim the same coach for overlapping work: that comes back as a conflict listing which coaches are already on which policy, and the fix is to change one of them, not to retry. Requires the 'instructors:write' scope, which is new - an OAuth connection made before it shipped has to be reconnected. Pass idempotencyKey so a retry cannot create the policy twice.
create_pay_rate_policy
Add a payment method staff can record payments with, e.g. "Bank transfer" or "Voucher". Call list_payment_methods first: Cash and POS Terminal already exist for every organization, so do not add them again. It is staff-only (Private) unless the user wants members to pick it when paying for a booking. Requires the 'payment-methods:write' scope. Pass idempotencyKey so a retry cannot create it twice.
create_payment_method
Add a rule to the club's price list. adjustmentType and scopes are required: say what the rule does to the price and which resources it prices (an empty scopes list means EVERY area, coach and class - only when the user means that). Send only the amount field the type reads: percentageAdjustment for percentage, fixedAmountAdjustment for fixed and absolute. Every id must belong to the organization. A member rate is a "plan" condition naming the plan; a peak band is a "weekdays-time" condition. Rules are live as soon as they are written: every new quote and booking uses them (existing bookings keep their price). Confirm the change with the user first, then check it with quote_booking_price. Requires the 'pricing-rules:write' scope. Pass idempotencyKey so a retry cannot create the rule twice.
create_pricing_rule
Add a product to the catalogue. Only name and price are required. Resolve categoryId with list_product_categories first if the user named a category - a category from another organization is rejected, and so are clubId, brandId, taxRateId and revenueAccountId that do not belong to this one. A barcode or SKU already used by another product, package, plan or access card is refused, because a scanned code has to mean exactly one thing. Creating a product does not give it stock; putting units on the shelf is done in the 1club dashboard, so tell the user to do that there. Requires the 'products:write' scope. Pass idempotencyKey so a retry cannot create the product twice.
create_product
Add a product category. Omit sortOrder and it goes to the end of the list, which is what you want unless the user is rebuilding the whole ordering. Check list_product_categories first - a gym rarely wants two categories meaning the same thing, and this tool will happily create a duplicate name. Requires the 'products:write' scope.
create_product_category
Add an account to the organization's chart of accounts. This is bookkeeping, not configuration: the code and name are what the club's accountant reconciles against, so call list_revenue_accounts first and only add one the user actually asked for, with the code they gave you. A duplicate code is refused. Requires the 'revenue-accounts:write' scope, which nothing else grants - an OAuth connection made before this tool shipped will not have it until the user reconnects. Pass idempotencyKey so a retry cannot create the account twice.
create_revenue_account
Create a manual tag staff can put on contacts, e.g. "VIP" or "Corporate". Check list_tags first: a name another manual tag has is refused, and one a smart tag has would confuse the two. You do not need this before add_contact_tags, which creates a tag it is given by a new name. Requires the 'contacts:write' scope.
create_tag
Create a reusable message template. Call list_template_variables for the type first: every {{variable}} in the subject, preview text and body must be one it lists, or the template is refused (an unknown variable would reach recipients as literal text). Not available on Free. To customize one of the emails 1club sends automatically (booking confirmation, welcome email...), use copy_system_template instead. Creating a template sends nothing. Requires the 'templates:write' scope. Pass idempotencyKey so a retry cannot create the template twice.
create_template
Add a page to the website. Requires the 'website:write' scope. The slug becomes the page's URL path (lowercase letters, numbers and hyphens). Adding a page does not link to it - follow up with update_website_layout to add it to the header navigation and the footer, or visitors will never find it. Edits the draft; call publish_website to make it live.
create_website_page
Delete an area block, reopening the court(s) it covered for booking. Requires the 'areas:write' scope. Use list_area_blocks to find the block id.
delete_area_block
Permanently delete a booking policy. The bookings it governed fall to the next most specific policy, or to none - which means free cancellation and no forced payment. Existing bookings keep the cancellation terms they were made under. Check get_effective_booking_policy for the affected clubs first, and only delete when the user asks for it. Requires the 'booking-policies:write' scope.
delete_booking_policy
Delete a class occurrence. For a recurring class, scope=all_future deletes this and later occurrences. Deletion fails while affected future classes have active bookings or waitlist entries. Requires the 'classes:write' scope.
delete_class
Permanently delete a content item. Requires the 'content:write' scope. Prefer setting status to 'draft' with update_content - that hides it from the public and is reversible. Never delete a `document` that members have signed: the signed wording goes with it. A website `block` section pointing at a deleted block renders nothing.
delete_content
Delete a contact custom field and every value recorded in it, on every contact. To stop using a field but keep the values, update it with isActive false instead - offer that first. Requires the 'contacts:delete' scope.
delete_custom_field
Delete a document rule. Members stop being asked for its documents under it (another rule may still ask for the same document), and an entry rule stops refusing self check-in. Signatures already made and the documents themselves are kept. To pause a rule instead, use update_document_rule with isActive false, which is reversible. Requires the 'document-rules:write' scope.
delete_document_rule
Permanently delete an event nobody has ever booked (typically an unwanted draft). An event with any booking, even a cancelled one, is refused - use cancel_event for it instead. Confirm with the user first. Requires the 'events:write' scope.
delete_event
Permanently delete a file from the media library. Requires the 'media:delete' scope, which is separate from 'media:write' precisely because this cannot be undone - the file itself is destroyed, and any website section or content item still pointing at it will show a broken image. Check what uses the image first, and confirm with the user.
delete_media
Permanently delete an unused membership plan. This fails if memberships or other records reference it; use update_plan with isActive=false to retire an in-use plan. Requires the 'plans:write' scope.
delete_plan
Permanently delete a draft Message. A Message that was sent stays on record and cannot be deleted. With an API key only drafts written through the API can be deleted. Confirm with the user first. Requires the 'messages:write' scope.
delete_message_draft
1club Admin ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve 1club Admin's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are 1club Admin alternatives on ChatGPT?
As of 2026-10-30, 1club Admin competes with BODi, Club Planner, Court Reservation, CrossHero, Forj, iBody, Junocal, KYN AI Fitness Planner and 6 more in ChatGPT Branded Fitness Class & Coaching Booking, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.