# Sessions Go — full API context Endpoint: https://go.sessions.website/api/graphql Schema sha: c2c926ce475b77c1c709c99c7144c560056f32e1d734405a376122006b2b67f5 Generated: 2026-06-12T03:16:03.652Z Authenticate with the `auth` HTTP-only cookie set by the Sessions web app, or `Authorization: Bearer ` for server-to-server / embed-scoped callers. Introspection is enabled in production. MCP (Streamable HTTP; config at https://go.sessions.website/build/agents/mcp.json): sessions-dev at https://go.sessions.website/build/api/mcp (no auth — search_docs, get_type, get_operation, validate_graphql); sessions-public at https://go.sessions.website/api/mcp (find_business, browse_sessions, get_session, preview_checkout, start_sign_in, my_registrations, cancel_registration; viewer tools use the auth cookie or a Bearer JWT; also mounted at https://go.sessions.website/@/api/mcp). ## Root queries ### activities(near: GeoPointInput, metadata: [MetadataFilterInput!]): [Activity!]! Public discovery feed of activities across visible businesses. When `near` (or, when omitted, the request's inferred location) yields a country, results are gated to businesses in that country and ordered nearest-first by the business's geocoded location. With no location signal at all, falls back to newest-first across every visible business. `metadata` filters the feed to activities carrying matching well-known metadata values (skill level, age range, …). An activity matches an entry when any value stored under that key is in the entry's `values`; multiple entries are AND-ed together. ### activity(id: ID!): Activity ### activitySession(id: ID!): ActivitySession ### activitySessions: [ActivitySession!]! ### bookingActivityNextAvailability(activity: ID!, after: DateTime!): DateTime The start of the earliest open booking increment strictly after `after` (scanning forward up to a bounded horizon), so a booking calendar can jump the customer to the next day/week that actually has availability. Null when there's none within the horizon, the activity isn't bookable, or the `appointments` feature is off. ### bookingActivitySlots(activity: ID!, from: DateTime!, to: DateTime!): [AppointmentSlot!]! Open, bookable increments for a `structure: booking` activity within the `[from, to]` window — the activity's weekly windows minus the assigned resource's commitments, honoring its booking notice + advance window. Each slot is one increment; customers compose a longer booking from a contiguous run (bounded by `minIncrements`/`maxIncrements`). Empty when the activity isn't bookable or the `appointments` feature is off. ### business(id: ID, handle: String): Business ### businessClaim(token: String!): BusinessClaimPreview Look up a business-ownership claim by its secret token, to preview the pre-built business (and the platform it was migrated from) before the visitor signs in to take ownership. Returns null for an unknown token, and a non-redeemable preview for an expired/claimed/revoked one. ### challenge(id: ID!): Challenge ### checkoutPreview(checkout: CheckoutPreviewInput!): CheckoutPreviewResult! Read-only preview of what a customer would be charged at checkout for a product or activity, with optional `discountCode` and `giftCardCode` applied. Used by checkout UIs to show line totals as the customer types. Returns per-field errors (invalid code, conditions not met, expired, etc.) instead of throwing. ### debugMode: DebugMode The active debug-mode claim for the current session, or `null` if debug mode has not been unlocked. Drives the developer Debug Panel UI. ### familyInvite(token: String!): FamilyInvite Look up a pending co-guardian invitation by its secret token, to preview who invited the viewer and to which household before accepting. Returns null for an unknown, expired, or already-resolved token. ### inferredLocation: InferredLocation! Best-guess location of the current request, inferred from the Cloudflare edge geo-IP. Used to prefill optional location fields like the create-business country. All fields null in non-Cloudflare runtimes. ### match(id: ID!): Match ### matches(first: Int, after: String): MatchConnection! Matches the viewer has recorded, newest first. Cursor-paginated; default page size 50, clamped to [1, 100]. Sort order is `startedAt DESC, id ASC`. ### me: Me The currently authenticated user and their passkeys. ### oauthConsentRequest(clientId: String!, redirectUri: String!, scope: String, codeChallenge: String, codeChallengeMethod: String): OAuthConsentRequestResult! Validate a pending OAuth authorization request and return what the consent screen needs: the requesting app's presentation, the scopes it's asking for, and the businesses the signed-in viewer may connect. The `error` field is set (and `request` null) for an unknown client, an unregistered redirect URI, or an otherwise invalid request — the consent page renders an error state. Requires an authenticated viewer. ### previewBranchPullRequest(branch: String!): PreviewBranchPullRequest GitHub pull request associated with a preview branch name, used by the debug panel to show PR title/number alongside the branch slug. Returns `null` when no PR matches the branch or when server-side GitHub lookup is not configured. ### product(id: ID!): Product ### productPurchase(id: ID!): ProductPurchase Look up a single purchase the viewer owns (as buyer or gift-card redeemer), used by the account purchase-detail page. Returns `null` when the viewer is unauthenticated or does not own the purchase. ### quoteTax(input: QuoteTaxInput!): QuoteTaxResult! Quote the tax that would apply for a hypothetical purchase given the buyer's destination address. Used by the public checkout to show a tax line before the buyer commits to the payment. Returns zero tax (no error) when the seller has tax collection disabled or when the destination is in a jurisdiction the seller doesn't collect for. ### search(query: String!, first: Int): SearchResults! Global search across Sessions' public surfaces, used by the Cmd-K Go menu's contextual results. Today returns matching businesses; the result type will grow over time to surface favorite instructors, activities, and other public entities alongside without breaking the field name. Each list is capped at `first` (default 5, max 10); matches are case-insensitive substring matches on the entity's primary text columns. Returns empty lists for an empty query. ### searchTeams(query: String!, type: ActivityType, business: EntityRef): [Team!]! ### services: Services! Third-party service configuration (Stripe keys, Mapbox tokens, etc.). ### team(id: ID!): Team ### teamInvite(token: String!): TeamInvite ## Root mutations ### acceptFamilyInvite(token: String!): AcceptFamilyInviteResult! Accept a co-guardian invitation by its secret token. The viewer must be signed in with the email the invite was sent to; on success they join the family with the invited role. ### acceptTeamInvite(token: String!): AcceptTeamInviteResult! ### acceptWaitlistOffer(registration: EntityRef!, discountCode: String, giftCardCode: String): AcceptWaitlistOfferResult! Accept a waitlist offer. Completes registration; for card-paid offers with no reserved card on file, returns a `CheckoutSession` so the caller can drive Stripe.js. Optional discount and gift-card codes can be applied at accept time. ### addChild(family: EntityRef!, input: ChildInput!): FamilyMemberResult! Add a managed child to a family the viewer manages. Creates a login-less `users` row (no email) and a `child` membership. Requires a date of birth (`YYYY-MM-DD`) for age-eligibility. ### addEmergencyContact(member: EntityRef!, input: EmergencyContactInput!): FamilyMemberResult! Add an emergency contact for a member. ### addFavorite(favorite: FavoriteTargetInput!): AddFavoriteResult! Add a business, staff member (instructor), or activity to the authenticated user's favorites. Idempotent — adding an existing favorite is a no-op. ### addReview(input: AddReviewInput!): AddReviewResult! Leave a star rating (1–5) and an optional written review for a business or one of its staff members. The viewer must be a verified attendee: a confirmed registration for one of the business's sessions is required, and for a staff review, a session that staff member was assigned to. At most one live review per target — submitting again when one already exists returns a `$.target` error (edit the existing review instead). ### authorizeOAuthApplication(input: AuthorizeOAuthApplicationInput!): AuthorizeOAuthApplicationResult! Approve (or deny) a pending OAuth authorization request for the chosen business. On approval, re-validates the request, re-authorizes the viewer's access to `businessId`, and mints a one-time authorization code; on denial, builds an `error=access_denied` redirect. Either way `redirectUrl` is the absolute URL the browser should be sent to (the client's `redirect_uri` with a `code` or `error`). Requires an authenticated viewer. ### bookActivityTime(activity: ID!, startAt: DateTime!, endAt: DateTime!, buyer: BuyerInput, formData: [RegistrationDataInput!], productPurchase: ID, tipAmount: Int, emailMarketingConsent: Boolean): AppointmentBookingResult! Books an open time range on a `structure: booking` activity. Validates `[startAt, endAt)` is a contiguous run of the activity's open increments whose increment count is within `[minIncrements, maxIncrements]`, then creates the booking — an `activityId`-tied appointment session + registration. Free bookings confirm immediately; activities set to `request` mode create a pending request the business approves or declines. Paid bookings charge `bookingPricePerIncrement × increments` and create the booking only once payment succeeds (via `completeCheckout`). `buyer` supplies guest details when the caller is not signed in. `productPurchase` redeems one of the caller's passes/memberships (as surfaced by `Activity.bookingPaymentResolution`) against the booking: a pass spends the activity's `creditCost` (default 1) per booked increment, so a covering purchase settles the whole booking for `creditCost × increments`, confirming immediately via the free path — no charge, no `checkout`. It's all-or-nothing — the purchase must belong to the buyer, be active, cover the activity, and (for a finite session count) have enough sessions for the whole booking; otherwise it's rejected and the caller pays by card. `formData` carries answers to the activity's registration blocks — intake questionnaires and consent/waiver signatures collected before the appointment — persisted as block metadata + an agreement PDF on the resulting registration, exactly like `registerForActivity`. `tipAmount` adds an optional gratuity (cents) on top of a paid booking's service price; it is added after tax, ignored for free / package-covered bookings, and excluded from both the tax base and the platform-fee base. `emailMarketingConsent` records the participant's optional opt-in to the business's marketing email, exactly like `registerForActivity` — honoured only when the booked activity carries an `emailMarketing` registration block and the business has consent collection enabled. ### cancelActivityRegistration(id: ID!): CancelActivityRegistrationResult! Cancel an existing activity registration. ### cancelMembershipSubscription(purchase: ID!, reason: String): CancelMembershipSubscriptionResult! Schedule a membership subscription to cancel at the end of the current billing period. ### claimBusiness(token: String!): ClaimBusinessResult! Take ownership of a concierge-built business via a claim token. Requires an authenticated viewer (sign-in/account creation happens first on the claim landing page). Transfers `businesses.ownerId` to the viewer, adds them as a staff member, and marks the claim `claimed`. Rejects unknown, expired, already-claimed, or revoked tokens. ### completeCheckout(paymentId: ID!): CompleteCheckoutResult! Complete a checkout after Stripe payment confirmation. Verifies the payment status with Stripe, then fulfills the underlying entity (pass purchase or registration). Idempotent — safe to call multiple times. ### completeSubscriptionBillingUpdate(purchase: ID!): CompleteSubscriptionBillingUpdateResult! Finish an in-app billing recovery attempt after Stripe Elements confirms the latest invoice payment. Webhooks remain the source of truth for clearing the local billing issue. ### confirmEmailChange(email: String!, code: String!): ConfirmEmailChangeResult! Confirm a pending email change with the 6-digit code sent to the new address. The user must still be signed in to the account requesting the change. ### createAccount(email: String!, name: String, redirect: String, businessHandle: String): RequestAuthCodeResult! Request an email containing a 6-digit code to confirm a new account. Always returns success regardless of whether the email is already in use (anti-enumeration). If an account already exists for the email, a sign-in code is sent instead. When `businessHandle` is set, the issued code is pinned to that business and the resulting token is scoped to it (does not set a cross-account cookie). Used by the business-pinned embed sign-in flow. When `name` is set and the email resolves to a brand-new account at redemption time, that name is applied to the inserted user row. Ignored for emails that already have an account. ### createBillingPortalSession(purchase: ID!): CreateBillingPortalSessionResult! Create a Stripe Customer Portal session for a membership purchase so the buyer can update payment details or cancel the recurring subscription. ### createBusiness(name: String!, owner: EntityRef!, organization: EntityRef, locations: [LocationCreateInput!], structures: [ActivityStructure!], activityTypes: [ActivityType!], country: String, plan: PlatformSubscriptionPlan): CreateBusinessResult! Create a new business owned by the given user. Surfaced on the public (account-subdomain) schema so the post-signup `Create a business` flow can run before the operator has a business subdomain to call the business-scoped variant against. ### createFamily(name: String): FamilyResult! Create a family (household) owned by the viewer, who becomes its first `manager`. A viewer can create more than one family. ### createMatch(type: ActivityType!, startedAt: DateTime!, endedAt: DateTime, winner: MatchTeam, sets: [MatchSetInput!]!, user: EntityRef): CreateMatchResult! ### createPaymentMethodSetupIntent: CreatePaymentMethodSetupIntentResult! Create a SetupIntent for adding a saved card to the viewer's account. The client mounts Stripe Elements in setup mode against the returned `clientSecret`; on success the card is attached to the viewer's Stripe Customer and listed by `Me.paymentMethods`. ### createTeam(name: String!, members: TeamMembersInput, initialMembers: [EntityRef!]): CreateTeamResult! ### createTeamInvite(team: EntityRef!, email: String): CreateTeamInviteResult! ### createWaitlistSetupIntent(activitySession: EntityRef!): CreateWaitlistSetupIntentResult! Create a SetupIntent for capturing a card to reserve a paid waitlist spot. The returned client secret is consumed by Stripe.js; the resulting PaymentMethod is then passed to `registerForActivity` as `paymentMethod`. ### deleteAccount: DeleteAccountResult! Soft-delete the currently authenticated account, revoke its sessions, and immediately cancel any active recurring membership billing linked to it. ### deletePasskey(id: ID!): DeletePasskeyResult! Delete a saved passkey by ID. ### deleteReview(review: ID!): DeleteReviewResult! Delete a review the viewer authored. Soft-deletes the row, freeing the viewer to review the same target again later. ### disputeMatch(session: EntityRef!, reason: String): DisputeMatchResult! Dispute a completed league result (only under `immediate` scoring). Flags the match for staff adjudication; allowed for a captain of either team. ### finishPasskeyCreate(credential: String!, name: String): FinishPasskeyResult! Complete passkey registration and save the credential. ### finishPasskeySignIn(credential: String!, businessHandle: String): SignInResult! Complete passkey authentication and issue an auth token. Sets the auth cookie unless `businessHandle` is set, in which case a business-scoped token is returned without touching the cookie session (embed sign-in flow). ### generatePurchasesExport(input: GeneratePurchasesExportInput): GenerateUserExportResult! Generate a CSV of the viewer's product purchases (across every participant linked to their account) and persist it as a downloadable {@link UserExport}. The optional filters mirror the account purchases list — substring search, product types, and businesses. ### generateReviewsExport: GenerateUserExportResult! Generate a CSV of every review the viewer has written and persist it as a downloadable {@link UserExport}. Reviews carry no list filters. ### generateSessionsExport(input: GenerateSessionsExportInput): GenerateUserExportResult! Generate a CSV of the viewer's session registrations and persist it as a downloadable {@link UserExport}. The optional filters mirror the account schedule list — time window, businesses, activity types, and substring search; `business` scopes the export to a single business. ### graduateTeen(member: EntityRef!, email: String!): FamilyMemberResult! Graduate a managed child to their own login by giving them an email. Only allowed for a child aged 13 or older (COPPA). Sends them a sign-in code so they can take over the account. ### inviteGuardian(family: EntityRef!, email: String!, role: FamilyRole!): FamilyInviteResult! Invite another adult by email to join a family as a manager or guardian. The viewer must be a manager/guardian of the family. Emails the invitee a link that signs them in (creating an account if needed) and lands on the accept page. `role` must be `manager` or `guardian` — never `child`. ### prepareSubscriptionBillingUpdate(purchase: ID!): PrepareSubscriptionBillingUpdateResult! Prepare an in-app billing recovery attempt for a membership subscription. Returns the latest invoice confirmation secret for Stripe Elements when the invoice still needs payment or authentication. ### purchaseProduct(product: EntityRef!, gift: ProductPurchaseGiftInput, buyer: BuyerInput, discountCode: String, giftCardCode: String, paymentMethod: ID, savePaymentMethod: Boolean, taxCalculationId: String, forRegistration: Boolean, recurringConsentAccepted: Boolean, emailMarketingConsent: Boolean, emailMarketingConsentDisclosureVersion: ID): PurchaseProductResult! Purchase a product (pass, membership, gift card, or physical product). Returns a checkout session if payment is required, or the purchase directly for free products. Pass `buyer` when the caller is not signed in to perform guest checkout. Requires the business's `guestCheckoutEnabled` setting. Passes and memberships always require a signed-in user. ### recordPaymentMethodAttached(paymentMethod: ID!): RecordPaymentMethodAttachedResult! Persist a freshly-attached PaymentMethod into the local cache so subsequent reads of `Me.paymentMethods` don't need a Stripe call. Called by the client right after `confirmSetup` resolves; idempotent with the `payment_method.attached` webhook backstop. ### recordPurchaseBlockResponses(input: RecordPurchaseBlockResponsesInput!): RecordPurchaseBlockResponsesResult! Persist the buyer's responses to a product's purchase-page blocks (contract acceptance, signature, acknowledgements, form fields) as an immutable snapshot, keyed by purchase. Sent as part of the checkout flow. Replaces any previously-recorded responses for the purchase. ### redeemAuthCode(email: String!, code: String!): SignInResult! Redeem a 6-digit auth code and sign the user in. Returns the created or signed-in user, the JWT token, and the redirect URL stored on the code. Sets the auth cookie on success — except for codes that were issued with a `business` pin, which return a business-scoped token without touching the cookie session. ### redeemGiftCard(code: String!, business: EntityRef!): RedeemGiftCardResult! Redeem a gift card code for the given business. Creates or transfers the balance to the authenticated user's participant record. ### registerForActivity(activitySession: EntityRef!, productPurchase: EntityRef, bookableSpot: EntityRef, formData: [RegistrationDataInput!], guest: GuestRegistrationInput, familyMember: EntityRef, buyer: BuyerInput, discountCode: String, giftCardCode: String, paymentMethod: String, savePaymentMethod: Boolean, taxCalculationId: String, emailMarketingConsent: Boolean, emailMarketingConsentDisclosureVersion: ID): RegisterForActivityResult! Register for an individual activity session. Use productPurchase to pay with an existing pass/membership, or omit it for direct purchase. Pass `guest` to register on behalf of someone else; the caller is recorded as the booker and pays. The activity's participant policy must allow guest registrations. Pass `buyer` when the caller is not signed in to perform guest checkout. Requires the business's `guestCheckoutEnabled` setting. ### registerForChallenge(challenge: EntityRef!): RegisterForChallengeResult! Register the current user for a challenge. Creates or reuses the participant record for the challenge's business. ### registerPushDevice(input: RegisterPushDeviceInput!): RegisterPushDeviceResult! Register (or refresh) the calling device's push-notification token for a business's white-label app. Idempotent on the device token: re-registering updates the row and re-enables it. The token is scoped to the business identified by `businessHandle`. Requires an authenticated viewer. ### removeEmergencyContact(contact: EntityRef!): DeleteFamilyMemberResult! Remove an emergency contact (soft-delete). ### removeFamilyMember(member: EntityRef!): DeleteFamilyMemberResult! Remove a member from the family (soft-deletes the membership). ### removeFavorite(favorite: FavoriteTargetInput!): RemoveFavoriteResult! Remove a business, staff member, or activity from the authenticated user's favorites. Idempotent — removing a favorite that isn't set is a no-op. ### removePaymentMethod(paymentMethod: ID!): RemovePaymentMethodResult! Detach one of the viewer's saved cards. Returns a friendly error when the card backs an active membership subscription — the caller should swap the subscription's payment method via the billing portal first. ### reportMatchScore(session: EntityRef!, winner: MatchTeam, sets: [MatchSetInput!]!): ReportMatchScoreResult! Report the result of a league match — the single match of a session. Allowed for an active captain of either competing team. Applies the activity's `scoreEntryMode` (immediate vs. admin-approval). ### requestCountrySupport(country: String!, region: String, note: String): RequestCountrySupportResult! Register interest in Sessions supporting a country it can't yet onboard. Surfaced on the create-business country picker ("Request another country…"). `country` is free-form (the whole point is unsupported countries); `region` and `note` are optional. The request is logged as an internal `country-request` signal (and the caller's detected location is attached server-side). Always succeeds for any non-empty country. ### requestEmailChange(email: String!): RequestEmailChangeResult! Send a verification code and link to the requested email address. Confirming either swaps the user's email to the new address. Always returns success regardless of whether the target email is already in use (anti-enumeration). ### resumeMembershipSubscription(purchase: ID!): ResumeMembershipSubscriptionResult! Undo a pending end-of-period cancellation for a membership subscription. ### revokeFamilyInvite(invite: EntityRef!): DeleteFamilyInviteResult! Revoke a pending co-guardian invitation. Only a manager/guardian of the family may revoke it. ### revokeOtherSessions: RevokeOtherSessionsResult! Revoke (sign out) all of the viewer's sessions except the current one. ### revokeSession(session: ID!): RevokeSessionResult! Revoke (sign out) one of the viewer's own sessions. ### setConsent(member: EntityRef!, type: ConsentType!, granted: Boolean!): FamilyMemberResult! Record or update a single consent for a member. ### setDebugPreviewBranch(branch: String): SetDebugPreviewBranchResult! Set the preview branch to route requests to. Pass `null` (or omit) to clear the pinned preview and route to the main worker. Writes (or augments) the `debug` claim on the auth cookie; clients reload to pick up the new routing. ### setDefaultPaymentMethod(paymentMethod: ID!): SetDefaultPaymentMethodResult! Mark one of the viewer's saved cards as the default. Updates the Stripe Customer's `invoice_settings.default_payment_method`, which is the auto-charge fallback for paid waitlist promotion (and any future off-session charge surface). ### setHealthProfile(member: EntityRef!, input: HealthProfileInput!): FamilyMemberResult! Create or replace a member's medical profile. ### setMyEmailMarketingConsent(business: EntityRef!, action: EmailMarketingConsentAction!): SetMyEmailMarketingConsentResult! Set the signed-in viewer's own email-marketing consent for a business they participate in. `grant` records an affirmative opt-in and freezes the compliant disclosure the viewer was shown (only allowed while the business is collecting consent); `withdraw` unsubscribes. Recorded as an immutable ledger event with `source = participant`. ### signIn(email: String!, redirect: String, businessHandle: String): RequestAuthCodeResult! Request a sign-in email containing a 6-digit code. Always returns success regardless of whether the email matches an existing account (anti-enumeration). When `businessHandle` is set, the issued code is pinned to that business and the resulting token is scoped to it (does not set a cross-account cookie). Used by the business-pinned embed sign-in flow. ### signOut: SignOutResult! Clear the auth cookie and sign out the current user. ### signUpTeam(division: EntityRef!, team: EntityRef!): SignUpTeamResult! ### startPasskeyCreate: StartPasskeyResult! Begin passkey registration for the currently authenticated user. ### startPasskeySignIn(email: String): StartPasskeyResult! Begin passkey authentication. Pass email to hint at known credentials. ### stopObserving: StopObservingResult! End the current observer session and restore the admin's own session. Available wherever an observer session is honored (e.g. the user's own `go` / account view) so the admin can stop observing from any of them. ### unregisterPushDevice(token: String!): Boolean! Disable the calling device's push token (e.g. on sign-out or when the user turns off notifications). Returns true if a matching active token was disabled. ### updateFamilyMember(member: EntityRef!, input: FamilyMemberUpdateInput!): FamilyMemberResult! Update a member's name and/or date of birth. ### updateMe(name: String, pronouns: String, gender: String, avatar: EntityRef, socialLinks: [SocialLinkInput!]): UpdateMeResult! Update the authenticated user's profile. All arguments are optional; only fields that are provided are applied. Pass `avatar: null` to remove the avatar, or `socialLinks: []` to clear all social links. ### updatePasskey(id: ID!, name: String!): UpdatePasskeyResult! Rename a saved passkey. The trimmed name must not be empty. ### updateReview(input: UpdateReviewInput!): UpdateReviewResult! Update the rating and/or written body of a review the viewer authored. ## Types ### AcceptBusinessInviteResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### AcceptFamilyInviteResult (OBJECT) Fields: - family: Family - errors: [OperationError!]! ### AcceptOrganizationInviteResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### AcceptTeamInviteResult (OBJECT) Fields: - team: Team - errors: [OperationError!]! ### AcceptWaitlistOfferResult (OBJECT) Fields: - registration: ActivityRegistration - checkout: CheckoutSession — Returned when the offer requires interactive payment (card-paid offer - errors: [OperationError!]! ### AccountDeletionPreview (OBJECT) Fields: - activeProducts: [ProductPurchase!]! — Active purchases linked to this account, ordered with recurring memberships - activeProductCount: Int! — Active or billing-attention product purchases linked to this account across - activeRecurringMembershipCount: Int! — Active or billing-attention membership purchases backed by Stripe ### Activity (OBJECT) Fields: - id: ID! - business: Business - name: String! - description: String - type: ActivityType - structure: ActivityStructure! - visibility: ActivityVisibility! - price: Int! - reminders: [ActivityReminderConfig!]! — Configured reminders for this activity's sessions, ordered by lead time - taxCode: String — Stripe tax code (e.g. `txcd_20030000` for in-person services) used - startDate: String - endDate: String - rules: LeagueRules - scoreEntryMode: LeagueScoreEntryMode! — How a reported league match result is confirmed (only meaningful for - divisions: [Division!]! - teams: [Team!]! - sessions(starting: ActivitySessionsStarting, sort: ActivitySessionSort, filter: ActivitySessionFilter, first: Int, after: String): ActivitySessionConnection! — Individual session instances generated from this activity. Only - upcomingSessionCount: Int! — Number of upcoming sessions for this activity — sessions whose `endAt` - hasCompletedSessions: Boolean! — Whether this activity has at least one completed session. - isRecurring: Boolean! — Whether the activity repeats. True even when no specific schedule is set - recurrenceSchedule: RecurrenceSchedule — The recurrence rule describing how sessions are generated. Null when the - duration: Int — Default duration of each session in minutes. - registration: RegistrationConfiguration! - pricingRulesForIndividualRegistration: [PricingRule!]! — Pricing rules that apply to individual registrations for this activity. - pricingRulesForTeamRegistration: [PricingRule!]! — Pricing rules that apply to team registrations for this activity. - effectiveIndividualRegistrationPrice: Int! — The effective individual-registration price for the current user after - effectiveTeamRegistrationPrice: Int! — The effective team-registration price for the current user after applying - registrationBlocks: [RegistrationBlock!]! — Custom form blocks shown during registration, configured by the business. - individualRegistrations(first: Int, after: String): ActivityRegistrationConnection! — Confirmed registrations across all sessions of this activity, ordered - waitlistRegistrations(first: Int, after: String): ActivityRegistrationConnection! — All waitlisted registrations for this activity, ordered by - availableLocations: [Location!]! - bookableFacilities: [Facility!]! — Facilities (rooms/courts) that can fulfill this activity. Only meaningful - bookingMode: BookingMode! — How a customer books this activity — only meaningful when `structure` is - fulfilledBy: ResourceKind — Which kind of resource fulfills a `structure: booking` activity (staff, - slotIncrementMinutes: Int — Bookable time increment in minutes (the slot grid step) for a booking - minIncrements: Int — Minimum / maximum number of increments a single booking may span. Null = - maxIncrements: Int - bookingPricePerIncrement: Int — Price in cents per booked increment (total = this × increments booked), or - bookingPaymentResolution: PaymentResolution — How the current viewer can pay for a booking of this activity — the - bookingTimezone: Timezone — IANA timezone the booking windows are interpreted in (null inherits the business default). - bookingWindows: [AvailabilityBlock!]! — Weekly open windows for a booking activity (the availability grid). - bookingExceptions: [AvailabilityException!]! — Date-specific overrides on a booking activity's weekly windows. - staff: [StaffAssignment!]! — Staff members assigned to this activity. Individual sessions - effectiveCancellationPolicy: ActivityCancellationPolicy! — Resolved cancellation policy for this activity — composes the - cancellationPolicyOverride: ActivityCancellationPolicyOverride! — The raw per-activity cancellation override values. Each field is null - metadata(name: String!): String — Returns the first value of the named metadata key, or null if not set. - metadataValues(name: String!): [String!]! — Returns every value stored for the named metadata key, in order. A - metadataEntries: [MetadataEntry!]! — All metadata stored on this activity, one entry per key (each carrying - createdAt: DateTime! - url: ResourceUrl! - calendar: CalendarUrl! ### ActivityCancellationPolicy (OBJECT) Effective cancellation policy resolved for an `Activity`. Differs from {@link BusinessCancellationPolicy} only in that each field reflects the activity-level override (or the business default when no override is set). Useful for the public registration confirmation sheet — surface this on the activity so the customer sees the exact terms before they hit "Cancel registration". Fields: - cutoffMinutes: Int - refundPercentageInWindow: Int! - refundPercentageOutOfWindow: Int! - penaltyFixedCents: Int! - penaltyCredits: Int! ### ActivityCancellationPolicyOverride (OBJECT) The raw per-activity cancellation override. Unlike {@link ActivityCancellationPolicy} (the resolved/effective policy), every field here is nullable: a `null` means the activity inherits the business default for that field. Drives the activity editor's override inputs. Fields: - cutoffMinutes: Int - refundPercentageInWindow: Int - refundPercentageOutOfWindow: Int - penaltyFixedCents: Int - penaltyCredits: Int ### ActivityConnection (OBJECT) Cursor-paginated list of activities for a business. Fields: - edges: [ActivityEdge!]! - nodes: [Activity!]! - pageInfo: PageInfo! - totalCount: Int! ### ActivityDraft (OBJECT) A strongly-typed, partially-filled activity proposal generated from a plain-text description. Every field is nullable — the generator only fills what the text supports, leaving the rest for the user. Scoped to the verticals enabled for v1: leagues (rules/divisions) and appointment booking are intentionally not generated here. Fields: - name: String - description: String - structure: ActivityStructure — Restricted to `class`, `session`, or `other` for v1. - type: ActivityType - visibility: ActivityVisibility - individualPrice: Float — Individual registration price as the amount the customer pays, in major - teamPrice: Float — Team registration price in major currency units (see individualPrice). - startDate: String — Start date as `YYYY-MM-DD`. - startTime: String — Start time of day as `HH:mm` (24-hour), for non-recurring activities. - endDate: String — End date as `YYYY-MM-DD`, for recurring activities. - durationMinutes: Int — Session length in minutes. - isRecurring: Boolean - recurrence: ActivityDraftRecurrence - registration: ActivityDraftRegistration - assumptions: [String!]! — Human-readable notes on assumptions the generator made or details it could ### ActivityDraftRecurrence (OBJECT) Fields: - intervalUnit: IntervalUnit - intervalCount: Int - daysOfWeek: [DayOfWeek!] - startTimes: [String!] — Session start times as `HH:mm` (24-hour). ### ActivityDraftRegistration (OBJECT) Fields: - scope: RegistrationScope - status: RegistrationStatus - allowIndividuals: Boolean - allowTeams: Boolean - maxIndividuals: Int - maxTeams: Int - participantMode: RegistrationParticipantMode - opensBeforeStartDays: Int — How many days before the activity start registration opens. - closesBeforeStartDays: Int — How many days before the activity start registration closes. - waitlistEnabled: Boolean ### ActivityEdge (OBJECT) Fields: - cursor: String! - node: Activity! ### ActivityFilter (INPUT_OBJECT) Filter applied to a paginated activity list. `query` matches the activity's name (case-insensitive substring). Array filters narrow the result to activities whose `type` / `structure` / `registration.status` is in the supplied set; an empty or omitted array applies no filter. `startAfter` / `endBefore` restrict to activities whose configured `startDate` / `endDate` falls on or after / on or before the supplied ISO-8601 date string. Input fields: - query: String - types: [ActivityType!] - structures: [ActivityStructure!] - registrationStatuses: [RegistrationStatus!] - lifecycle: ActivityLifecycle — Lifecycle status. `upcoming` keeps activities whose end date is in - startAfter: String - endBefore: String - metadata: [MetadataFilterInput!] — Metadata filters. An activity matches an entry when any value stored for ### ActivityLifecycle (ENUM) Lifecycle phase of an activity, derived from its end date relative to the current moment. Values: - upcoming - completed ### ActivityPassGifting (ENUM) Values: - disabled - optional - required ### ActivityRegistration (OBJECT) Fields: - id: ID! - activitySession: ActivitySession — The session this registration is for, or null for an activity-level - activity: Activity — The activity this registration belongs to. Use it to render an activity-level - participant: Participant! - bookableSpot: BookableSpot - status: ActivityRegistrationStatus! - bookedBy: User — The user who initiated this registration (the booker / payer). Null - bookedByParticipant: Participant — Business participant profile for the user who initiated this registration, - isGuestRegistration: Boolean! — True when the registration was created on behalf of someone other - payment: ActivityRegistrationPayment — How this registration was paid for. Null when the registration is free - kind: ActivityRegistrationKind! — What kind of registration this is: - requiredPayment: Boolean! — True when this registration is the one that carried payment — the league - team: Team — The team this registration is for, when it's a team-based league - paymentSplits: [PaymentSplit!]! — Funding sources for this registration. Empty for free registrations - discountRedemptions: [DiscountCodeRedemption!]! — Discount-code redemptions applied directly to this registration. Each - waitlistPosition: Int — Position in the waitlist, computed dynamically. Only set when status is waitlisted. - offeredAt: DateTime — Timestamp when the participant was offered a spot from the waitlist. - intendedPaymentMethod: ActivityRegistrationIntendedPaymentMethod — How the registrant intends to pay if their waitlist spot is promoted. - reservedCard: ReservedCard — Reserved card on file for this waitlist registration, if any. Set - waitlistPromotionPlan: WaitlistPromotionPlan — Preview of what `promoteFromWaitlist` will do for this row given its - checkedInAt: DateTime - confirmedAt: DateTime — Timestamp when this registration's status was set to `confirmed` — - cancellation: ActivityRegistrationCancellation — Cancellation metadata. Non-null when `status = cancelled` — - cancellationPreview: ActivityRegistrationCancellationPreview — What `cancelActivityRegistration` would do for this registration if - joinedViaWaitlist: Boolean! — True when this registration began life on the waitlist — whether it's - createdAt: DateTime! - participantRegistrationOrdinal: Int! — 1-indexed position of this registration within the participant's - blockMetadata: [BlockMetadataEntry!]! — Structured values captured from registration blocks the business tagged - receiptDocument: ReceiptDocument — Immutable PDF receipt for this registration. Null until generated (eagerly - agreementDocument: PurchaseAgreementDocument — Immutable combined PDF agreement for this registration — the accepted - url: ResourceUrl! — Canonical URLs for this registration. `business` points at the ### ActivityRegistrationCancellation (OBJECT) Cancellation metadata for an `ActivityRegistration`. Present only when the registration has `status = cancelled`. The `reason` field is visible only on business-authenticated GraphQL surfaces — never on the public API. Fields: - at: DateTime! - by: CancellationActor! - byUser: User - reason: String - refund: ActivityRegistrationRefund! ### ActivityRegistrationCancellationPreview (OBJECT) Forward-looking refund decision for a registration that has not yet been cancelled. Computed from the resolved policy + payment splits + session timing. `restoresPassSession = true` when the registration was paid with a pass / membership and would receive its session credit back; `restoresGiftCard = true` when a gift-card balance would be restored. Fields: - decision: RefundDecision! - amount: Int! - restoresPassSession: Boolean! - restoresGiftCard: Boolean! - penaltyFixedCents: Int! — Flat cancellation fee (cents) that would be withheld from the refund - forfeitedCredits: Int! — Pass / membership session credits that would be forfeited if the ### ActivityRegistrationConnection (OBJECT) Cursor-paginated list of activity registrations. Used by activity- and session-detail pages to page through confirmed attendees and the waitlist. Fields: - edges: [ActivityRegistrationEdge!]! - nodes: [ActivityRegistration!]! - pageInfo: PageInfo! - totalCount: Int! ### ActivityRegistrationEdge (OBJECT) Fields: - cursor: String! - node: ActivityRegistration! ### ActivityRegistrationFilter (INPUT_OBJECT) Filter applied to a paginated `ActivityRegistrationConnection`. All fields are optional and combine with `AND` semantics. Input fields: - query: String — Substring match against the registration's activity name and session - time: ActivityRegistrationTimeFilter — Time window. When unset (or `all`), no time filter is applied and the - status: [ActivitySessionStatus!] — Session-status filter shared with `Business.scheduledSessions` so the - includeGuests: Boolean — When false, exclude guest registrations (rows where the participant - payment: ActivityRegistrationPaymentFilter — When `paidOnly`, restrict to registrations that required payment — the ### ActivityRegistrationIntendedPaymentMethod (ENUM) Values: - pass - membership - card ### ActivityRegistrationKind (ENUM) The role a registration plays — distinguishes a paid league/season registration, a complimentary per-match session spot, and an ordinary per-session registration. Values: - leagueSeason - comp - session ### ActivityRegistrationPayment (UNION) How an activity registration was paid for. Members: MembershipRegistrationPayment, PassRegistrationPayment, GiftCardRegistrationPayment, CardRegistrationPayment ### ActivityRegistrationPaymentFilter (ENUM) Narrows a registration feed by whether money changed hands. `all` (the default) keeps the session-centric behaviour — every per-session registration the participant holds, including the free comp spots fanned out to a team's members for each league match. `paidOnly` returns just the registrations that `requiredPayment` (the activity-level "league registration" that covers the whole season, plus any individually-paid session drop-ins), so the captain's one season row surfaces instead of being drowned out by — or hidden behind — the per-match comps. Values: - all - paidOnly ### ActivityRegistrationRefund (OBJECT) Money side of the cancellation outcome. `decision = noRefund` carries `amount = 0`; `decision = fullRefund` returns the original price paid. Fields: - decision: RefundDecision! - amount: Int! - stripeRefundId: String - penaltyFixedCents: Int! — Flat cancellation fee (cents) withheld from the refund under the - forfeitedCredits: Int! — Pass / membership session credits forfeited under the resolved policy. ### ActivityRegistrationSort (ENUM) Ordering for a `ProductPurchase.registrations` page. `createdAtDesc` (the default) lists most-recently-booked first. `sessionStartAsc` / `sessionStartDesc` order by the registration's session start time — e.g. `registrations(first: 1, sort: sessionStartAsc)` returns the purchase's earliest (first-used) session. Values: - createdAtDesc - sessionStartAsc - sessionStartDesc ### ActivityRegistrationStatus (ENUM) Values: - confirmed - cancelled - waitlisted - offered - requested — An appointment booking awaiting business approval before it is confirmed ### ActivityRegistrationTimeFilter (ENUM) Time-window filter for `Me.registrations`. `upcoming` returns registrations whose session has not yet ended; `past` returns ones whose session has already ended; `all` returns both. Values: - upcoming - past - all ### ActivityReminderConfig (OBJECT) One configured session reminder on an activity: how far ahead of session start to notify, and over which channels. An activity may have several (e.g. 24h and 1h before). Fields: - leadMinutes: Int! - channels: [CommunicationChannel!]! ### ActivityReminderInput (INPUT_OBJECT) One entry in an activity's reminders patch. `leadMinutes` must be positive and unique within the list; `channels` must be non-empty. Input fields: - leadMinutes: Int! - channels: [CommunicationChannel!]! ### ActivitySession (OBJECT) Fields: - id: ID! - activity: Activity - name: String - type: ActivityType - startAt: DateTime - endAt: DateTime - status: ActivitySessionStatus! - price: Int! - registration: RegistrationConfiguration! - registrationCount: Int! - waitlistCount: Int! — Number of people currently waitlisted for this session. - pendingRequestCount: Int! — Number of pending (`requested`) appointment booking requests on this - bookableSpots: ActivitySessionBookableSpots — Bookable spot layout, occupancy, and viewer-relative state for this - myRegistration: ActivityRegistration - myGuestRegistrations: [ActivityRegistration!]! — Confirmed registrations on this session that the viewer booked on - paymentResolution(forGuest: Boolean): PaymentResolution — Resolved payment options for the current user. Null when not authenticated. - location: Location - facility: Facility — The specific facility (room / court / studio) within `location` this session - staff: [StaffAssignment!]! — Staff assigned to this session. Merges assignments from the parent - individualRegistrations(first: Int, after: String): ActivityRegistrationConnection! — Confirmed registrations for this session, ordered by - waitlistRegistrations(first: Int, after: String): ActivityRegistrationConnection! — Waitlisted and offered registrations for this session, ordered by - metadata(name: String!): String — Returns the value of the named metadata key, or null if not set. - match: Match — The single match played in this session — a league session *is* one match - createdAt: DateTime! - url: ResourceUrl! - calendar: CalendarUrl - cancellation: ActivitySessionCancellation ### ActivitySessionBookableSpots (OBJECT) Bookable spot data for a session: the layout (rows/columns/style and the spots themselves) plus viewer-relative spot ID sets reflecting the viewer's relationship to each occupied spot. `takenIds` is the union of all confirmed registrations on the session. `viewerIds`, `viewerGuestIds`, and `viewerBookerIds` are subsets of `takenIds`: spots the viewer holds for themselves, spots the viewer holds for a guest, and spots held by users who booked the viewer as a guest, respectively. All viewer sets are empty for unauthenticated requests. Fields: - layout: BookingSpots! - takenIds: [ID!]! - viewerIds: [ID!]! - viewerGuestIds: [ID!]! - viewerBookerIds: [ID!]! ### ActivitySessionCancellation (OBJECT) Cancellation metadata for an `ActivitySession`. Present only when the session has `status = cancelled`. The `reasonInternal` field is visible only on business-authenticated GraphQL surfaces — never on the public API. `reasonExternal` is the customer-facing message rendered in the session-cancelled email fan-out and surfaced on participant views. Always safe to read on public schemas. Fields: - at: DateTime! - reasonInternal: String - reasonExternal: String ### ActivitySessionConnection (OBJECT) Cursor-paginated list of activity sessions. Sort order is `startAt ASC, id ASC`. Pair with the `starting` filter to scope the window to upcoming/past/from-date. Fields: - edges: [ActivitySessionEdge!]! - nodes: [ActivitySession!]! - pageInfo: PageInfo! - totalCount: Int! ### ActivitySessionEdge (OBJECT) Fields: - cursor: String! - node: ActivitySession! ### ActivitySessionFilter (INPUT_OBJECT) Optional filters for `Business.scheduledSessions`. All fields are ANDed together; date-range filtering still goes through the parent `starting` argument so the same predicates back both fields. Input fields: - activity: [ID!] — Restrict to sessions whose parent activity matches any of the listed - staff: [ID!] — Restrict to sessions where any of the listed staff members are - timeOfDay: [ActivitySessionTimeOfDay!] — Time-of-day buckets evaluated in the business's local timezone. - status: [ActivitySessionStatus!] — Lifecycle statuses to include. Sessions whose status matches any of - query: String — Case-insensitive substring match against the session's name and the - source: [ActivitySessionSource!] — Restrict to sessions created via any of the listed sources. Null or - pendingRequest: Boolean — Restrict to sessions that hold at least one pending (`requested`) ### ActivitySessionSort (ENUM) Sort order for an activity-session connection. `startAsc` returns the earliest sessions first (the default); `startDesc` returns the most recent first — useful for "newest at the top" views. `createdAsc` / `createdDesc` order by when the row was created instead of when the session starts — on session connections that's the session's creation time; on registration connections it's the registration's booking time. Values: - startAsc - startDesc - createdAsc - createdDesc ### ActivitySessionSource (ENUM) How an activity session came to exist, mirroring `activitySessions.source`. Used by `ActivitySessionFilter.source` to let an admin narrow a list to a single kind of session — most usefully to isolate (or hide) appointment bookings. Values: - schedule — Generated from the activity's recurrence schedule. - singleDate — The single canonical session of a non-recurring activity. - manual — Added after the fact by a staff member. - appointment — Created on demand when a customer books an open slot against a ### ActivitySessionsStarting (INPUT_OBJECT) Input fields: - from: DateTime — Only return sessions starting on or after this date-time. - to: DateTime — Only return sessions starting on or before this date-time. - upcoming: Boolean — When true, only return sessions starting on or after the beginning - includeCancelled: Boolean — When true, cancelled sessions are returned alongside scheduled/active ### ActivitySessionStatus (ENUM) Values: - scheduled - active - completed - cancelled ### ActivitySessionTimeOfDay (ENUM) Time-of-day buckets used by `ActivitySessionFilter.timeOfDay`. Each bucket is evaluated in the business's local timezone: - `morning` — 05:00 through 11:59 local - `afternoon` — 12:00 through 16:59 local - `evening` — 17:00 through 23:59 local Sessions starting between 00:00 and 04:59 local are deliberately excluded — businesses overwhelmingly don't schedule there, and the bucket carve-out keeps each option intuitive. Values: - morning - afternoon - evening ### ActivityStructure (ENUM) Values: - league - class - session - booking - appointment - other ### ActivityType (SCALAR) Identifier for a kind of activity (sport, fitness modality, mind-body practice). Encoded as a snake_case, dot-separated string. Each `.`-separated segment matches `[a-z][a-z0-9_]*`; segments express variant hierarchy from general to specific. Examples: - `yoga`, `tennis`, `basketball` — single-segment activities - `pilates.reformer`, `pilates.mat` — variants of pilates - `skiing.cross_country`, `skiing.downhill` — variants of skiing - `volleyball.beach` — beach volleyball (indoor stays as `volleyball`) - `martial_arts.mixed` — MMA (`martial_arts` is the generic category) - `other.fitness`, `other.sport` — generic fallback subcategories The full set of valid values is defined server-side; submitting an unrecognised identifier returns a validation error. ### ActivityVisibility (ENUM) Values: - public - private ### AddBusinessTaxRegistrationResult (OBJECT) Fields: - registration: BusinessTaxRegistration - errors: [OperationError!]! ### AddBusinessToOrganizationResult (OBJECT) Fields: - organization: Organization - business: Business - errors: [OperationError!]! ### AddFavoriteResult (OBJECT) Fields: - user: User - errors: [OperationError!]! ### AddLocationToActivityResult (OBJECT) Fields: - activity: Activity - errors: [OperationError!]! ### AddReviewInput (INPUT_OBJECT) Input fields: - target: ReviewTargetInput! — Exactly one of `business` or `staff`. A staff review is implicitly - session: EntityRef — The attended session this review is about. Optional — when omitted the - rating: Int! — Star rating, an integer from 1 to 5. - body: String ### AddReviewResult (OBJECT) Fields: - review: Review - errors: [OperationError!]! ### AddStaffToActivityResult (OBJECT) Fields: - activity: Activity - errors: [OperationError!]! ### AddStaffToActivitySessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### AddTeamMemberResult (OBJECT) Fields: - errors: [OperationError!]! ### AgeRequirement (OBJECT) A participant age window for an activity. At least one of `minimumAge` / `maximumAge` is set when present. Age is evaluated in whole years as of `asOfDate` (a season cutoff) or, when that is null, the session's start. Fields: - minimumAge: Int - maximumAge: Int - asOfDate: String — ISO `YYYY-MM-DD` cutoff the participant's age is evaluated against. ### AgeRequirementInput (INPUT_OBJECT) Input fields: - minimumAge: Int - maximumAge: Int - asOfDate: String — ISO `YYYY-MM-DD` cutoff; null evaluates age as of the session start. ### ApiKey (OBJECT) A per-business API key for the partner Business API. A request presenting `Authorization: Bearer ` resolves to this key's business and `scopes`. The secret itself is shown once at creation and stored only as a hash; this type exposes the non-secret `keyPrefix` for identification. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this API key. Consume instead of building - name: String! — Owner-facing label, e.g. `Zapier` or `BrandBot sync`. - keyPrefix: String! — Non-secret leading fragment of the key (e.g. `sk_live_8f3a…`), shown so the - scopes: [String!]! — Permission scopes granted to this key (e.g. `participants:read`). Effective - status: ApiKeyStatus! - lastUsedAt: DateTime — When the key was last used to authenticate a request, or null if never. - expiresAt: DateTime — When the key expires, or null for no expiry. - createdAt: DateTime! ### ApiKeyConnection (OBJECT) Fields: - edges: [ApiKeyEdge!]! - nodes: [ApiKey!]! - pageInfo: PageInfo! - totalCount: Int! ### ApiKeyEdge (OBJECT) Fields: - cursor: String! - node: ApiKey! ### ApiKeyStatus (ENUM) Whether an API key is usable. Revocation is one-way — a revoked key can never be reactivated. Values: - active - revoked ### AppBuildStatus (ENUM) Status of a single build/submit attempt. Values: - queued - running - succeeded - failed - submitted ### AppListingStatus (ENUM) Lifecycle of an app listing, mirroring the store review flow. Values: - draft - submitted - building - inReview - published - rejected - disabled ### ApplyOrganizationBillingPaymentMethodResult (OBJECT) Fields: - organization: Organization - skippedBusinesses: [String!]! — Handles of child businesses whose subscription could not be updated (e.g. - errors: [OperationError!]! ### AppointmentBookingResult (OBJECT) The result of booking time on a `structure: booking` activity (`bookActivityTime`). Fields: - registration: ActivityRegistration — The booking, for free / request bookings that resolve synchronously. Null - checkout: CheckoutSession — Present only for a paid booking: confirm the payment with Stripe.js using - errors: [OperationError!]! ### AppointmentRequestDecisionResult (OBJECT) Fields: - registration: ActivityRegistration - errors: [OperationError!]! ### AppointmentSlot (OBJECT) A single open, bookable time range for an appointment type on a specific resource. Computed live from the resource's availability minus its existing commitments; never persisted until a customer books it. Fields: - resource: ResourceOwner! - startAt: DateTime! - endAt: DateTime! ### AppPlatform (ENUM) Native platform a white-label app targets. Values: - ios - android ### AppReviewContact (OBJECT) App-review contact details required by the store at submission. Fields: - name: String - email: String - phone: String ### AppReviewContactInput (INPUT_OBJECT) Patch input for an app listing's review-contact details. Input fields: - name: String - email: String - phone: String ### AssignOrganizationStaffRoleResult (OBJECT) Fields: - staffMember: OrganizationStaff - errors: [OperationError!]! ### AttendanceSummary (OBJECT) Check-in outcome totals for confirmed registrations on already-started sessions. See `BusinessSessionAnalytics.attendance`. Fields: - attended: Int! — Confirmed registrations whose seat-holder was checked in. - noShow: Int! — Confirmed registrations with no check-in — i.e. no-shows. - total: Int! — Total confirmed registrations considered (`attended + noShow`). ### AuthorizeOAuthApplicationInput (INPUT_OBJECT) Input fields: - clientId: String! - redirectUri: String! - scope: String - state: String - codeChallenge: String - codeChallengeMethod: String - businessId: ID! — The business the viewer chose to connect. - approve: Boolean! — `true` to grant access, `false` to deny. ### AuthorizeOAuthApplicationResult (OBJECT) Fields: - redirectUrl: URL — Absolute URL to send the browser to — the client's `redirect_uri` with a - errors: [OperationError!]! ### AvailabilityBlock (OBJECT) A recurring weekly open block within a resource's appointment availability. Times are local wall-clock `"HH:mm"` strings interpreted in the schedule's timezone. Fields: - id: ID! - dayOfWeek: DayOfWeek! - startTime: String! - endTime: String! ### AvailabilityException (OBJECT) A date-specific override on a resource's weekly availability. Fields: - id: ID! - date: String! — The affected date, as a local `"YYYY-MM-DD"` string. - kind: AvailabilityExceptionKind! - startTime: String — Local `"HH:mm"` start — present only when `kind` is `hours`. - endTime: String — Local `"HH:mm"` end — present only when `kind` is `hours`. ### AvailabilityExceptionKind (ENUM) Whether an availability exception closes a date entirely or overrides its hours. Values: - closed - hours ### AvailableBookableSpotInput (INPUT_OBJECT) Input fields: - id: ID - label: String! - row: Int! - column: Int! ### BillingCycle (OBJECT) Fields: - interval: BillingInterval! - count: Int! ### BillingCycleInput (INPUT_OBJECT) Input fields: - interval: BillingInterval! - count: Int! ### BillingInterval (ENUM) Values: - weeks - months - years ### BillingPortalSession (OBJECT) Fields: - url: URL! ### BlockMetadataAttestation (OBJECT) Fields: - content: String! - response: String! ### BlockMetadataContract (OBJECT) Fields: - content: String! - accepted: Boolean! - signature: BlockMetadataFile - agreement: BlockMetadataFile — The combined signed-agreement PDF (contract text + answers + embedded ### BlockMetadataEntry (OBJECT) A structured value captured from a custom block (registration block or purchase-page block) and stored on the resulting registration / purchase under a business-configured key. The populated accessor matches `kind`. Fields: - key: String! - label: String! — The block's label snapshot at capture time; a display fallback for keys - kind: BlockMetadataKind! - capturedAt: DateTime! - text: String - attestation: BlockMetadataAttestation - contract: BlockMetadataContract - file: BlockMetadataFile ### BlockMetadataFile (OBJECT) Fields: - url: URL! - contentType: String - hash: String - byteSize: Int ### BlockMetadataKind (ENUM) Values: - text - attestation - contract - signature - file ### BookableSpot (OBJECT) A single bookable spot within a location (e.g. a court position or room seat). Spots are positioned on a conceptual grid to support a visual layout editor. Fields: - id: ID! - label: String! - row: Int! - column: Int! ### Booking (OBJECT) Fields: - status: BookingStatus! - capacity: Int ### BookingConfigurationInput (INPUT_OBJECT) Booking configuration for a `structure: booking` activity — the slot increment, how many increments a booking may span, the per-increment price, the booking / approval mode, the resource kind that fulfills it, and its weekly windows + date exceptions. Passing `booking` to `createActivity` / `updateActivity` replaces the activity's windows and exceptions wholesale. Input fields: - slotIncrementMinutes: Int! - minIncrements: Int - maxIncrements: Int - pricePerIncrement: Int - bookingMode: BookingMode - fulfilledBy: ResourceKind - timezone: Timezone - windows: [BookingWindowInput!]! - exceptions: [BookingExceptionInput!]! ### BookingExceptionInput (INPUT_OBJECT) A date-specific override on a booking activity's weekly windows. `startTime` / `endTime` are required when `kind` is `hours` and ignored when `closed`. Input fields: - date: String! - kind: AvailabilityExceptionKind! - startTime: String - endTime: String ### BookingInput (INPUT_OBJECT) Input fields: - status: BookingStatus - capacity: Int ### BookingMode (ENUM) How a customer books an appointment type. `instant` runs the normal registration + checkout flow; `request` creates a pending request a staff member approves before it is confirmed. Values: - instant - request ### BookingSpots (OBJECT) Fields: - style: SpotStyle! - rows: Int! - columns: Int! - available: [BookableSpot!]! ### BookingSpotsInput (INPUT_OBJECT) Input fields: - style: SpotStyle - rows: Int - columns: Int - available: [AvailableBookableSpotInput!] ### BookingStatus (ENUM) Values: - open - closed ### BookingWindowInput (INPUT_OBJECT) A recurring weekly open window for a `structure: booking` activity. Times are local wall-clock `"HH:mm"` strings interpreted in the activity's booking timezone. Input fields: - dayOfWeek: DayOfWeek! - startTime: String! - endTime: String! ### Boolean (SCALAR) The `Boolean` scalar type represents `true` or `false`. ### BrandActionColor (OBJECT) An action fill (accent/critical/positive). `on` is the contrast-aware foreground for use when the value is the fill color; `subdued` is a lighter variant suitable for tinted backgrounds and hover states. Fields: - value: String! - on: String! - subdued: String! ### BrandActionColorPatchInput (INPUT_OBJECT) Input fields: - value: String - on: String - subdued: String ### BrandAppearance (ENUM) Values: - default - flat - elevated - slideOver - modal - inline ### BrandBannerOverrides (OBJECT) Fields: - borderRadius: BrandScaleStep! ### BrandBannerOverridesPatchInput (INPUT_OBJECT) Input fields: - borderRadius: BrandScaleStep ### BrandButtonEmphasis (ENUM) Values: - subdued - standard - strong ### BrandButtonOverrides (OBJECT) Fields: - borderRadius: BrandScaleStep! - emphasis: BrandButtonEmphasis! ### BrandButtonOverridesPatchInput (INPUT_OBJECT) Input fields: - borderRadius: BrandScaleStep - emphasis: BrandButtonEmphasis ### BrandCardOverrides (OBJECT) Fields: - borderRadius: BrandScaleStep! - shadow: BrandShadowStep! ### BrandCardOverridesPatchInput (INPUT_OBJECT) Input fields: - borderRadius: BrandScaleStep - shadow: BrandShadowStep ### BrandColors (OBJECT) Fields: - surfaces: BrandSurfaces! - accent: BrandActionColor! - critical: BrandActionColor! - positive: BrandActionColor! - brandGradient: BrandGradient! ### BrandColorsPatchInput (INPUT_OBJECT) Input fields: - surfaces: BrandSurfacesPatchInput - accent: BrandActionColorPatchInput - critical: BrandActionColorPatchInput - positive: BrandActionColorPatchInput - brandGradient: BrandGradientPatchInput ### BrandComponents (OBJECT) Fields: - button: BrandButtonOverrides! - sheet: BrandSheetOverrides! - card: BrandCardOverrides! - textField: BrandTextFieldOverrides! - heading: BrandHeadingOverrides! - link: BrandLinkOverrides! - banner: BrandBannerOverrides! ### BrandComponentsPatchInput (INPUT_OBJECT) Input fields: - button: BrandButtonOverridesPatchInput - sheet: BrandSheetOverridesPatchInput - card: BrandCardOverridesPatchInput - textField: BrandTextFieldOverridesPatchInput - heading: BrandHeadingOverridesPatchInput - link: BrandLinkOverridesPatchInput - banner: BrandBannerOverridesPatchInput ### BrandConfigurationStatus (ENUM) Whether a brand has been minimally configured (any of icon, primary color, or accent color set). Drives onboarding completion checks; the underlying fields remain the source of truth for rendering. Values: - unconfigured - configured ### BrandFieldAppearance (ENUM) Values: - outlined - filled ### BrandGradient (OBJECT) Brand signature gradient — the prominent two-tone (or single-tone) backdrop applied to identity surfaces like business avatar tiles, purchased-card headers, and the public-page hero. Always emitted as a usable CSS `background` value plus the component parts so consumers can render a custom variation if needed. Fields: - from: String! — First color stop (OKLCH). Used as a solid when `to` is null. - to: String — Second color stop (OKLCH). `null` means the gradient is single-tone — - balance: Int! — Position of the gradient transition midpoint, 0–100. Default 50. - angle: Int! — Gradient angle, 0–360, matching CSS `linear-gradient` semantics. - background: String! — Ready-to-use CSS `background` value (a color string when single-tone, ### BrandGradientPatchInput (INPUT_OBJECT) Patch input for {@link BrandGradient}. `to` accepts both an OKLCH string (set a second color stop) and explicit `null` (clear the second stop and render as a single-tone gradient). Input fields: - from: String - to: String - balance: Int - angle: Int ### BrandHeadingOverrides (OBJECT) Fields: - weight: BrandHeadingWeight! ### BrandHeadingOverridesPatchInput (INPUT_OBJECT) Input fields: - weight: BrandHeadingWeight ### BrandHeadingWeight (ENUM) Values: - regular - medium - bold ### BrandLinkOverrides (OBJECT) Fields: - underline: BrandLinkUnderline! ### BrandLinkOverridesPatchInput (INPUT_OBJECT) Input fields: - underline: BrandLinkUnderline ### BrandLinkUnderline (ENUM) Values: - always - hover - never ### BrandRadiiScale (OBJECT) Design-system scale definitions for border radius (px). Components reference these by step name; the resolver looks up the resolved px value when emitting `--sessions-button-border-radius` etc. Fields: - xs: Int! - sm: Int! - base: Int! - lg: Int! - xl: Int! - full: Int! ### BrandRadiiScalePatchInput (INPUT_OBJECT) Input fields: - xs: Int - sm: Int - base: Int - lg: Int - xl: Int - full: Int ### BrandScaleStep (ENUM) Values: - none - xs - sm - base - lg - xl - full ### BrandShadowsScale (OBJECT) Design-system shadow scale. Each value is a CSS `box-shadow` string. Fields: - xs: String! - sm: String! - base: String! - lg: String! - xl: String! ### BrandShadowsScalePatchInput (INPUT_OBJECT) Input fields: - xs: String - sm: String - base: String - lg: String - xl: String ### BrandShadowStep (ENUM) Values: - none - xs - sm - base - lg - xl ### BrandSheetOverrides (OBJECT) Fields: - appearance: BrandAppearance! - shadow: BrandShadowStep! - borderRadius: BrandScaleStep! ### BrandSheetOverridesPatchInput (INPUT_OBJECT) Input fields: - appearance: BrandAppearance - shadow: BrandShadowStep - borderRadius: BrandScaleStep ### BrandSpacingScale (OBJECT) Fields: - xs: Int! - sm: Int! - base: Int! - lg: Int! - xl: Int! - xl2: Int! ### BrandSpacingScalePatchInput (INPUT_OBJECT) Input fields: - xs: Int - sm: Int - base: Int - lg: Int - xl: Int - xl2: Int ### BrandSurface (OBJECT) A container palette: background + text + border, plus subdued variants for striped rows and de-emphasized text. Every value is an OKLCH string (`oklch(L C H)`) post-expansion. Fields: - background: String! - backgroundSubdued: String! - text: String! - textSubdued: String! - border: String! ### BrandSurfacePatchInput (INPUT_OBJECT) Input fields: - background: String - backgroundSubdued: String - text: String - textSubdued: String - border: String ### BrandSurfaces (OBJECT) Fields: - primary: BrandSurface! - secondary: BrandSurface! - tertiary: BrandSurface! ### BrandSurfacesPatchInput (INPUT_OBJECT) Input fields: - primary: BrandSurfacePatchInput - secondary: BrandSurfacePatchInput - tertiary: BrandSurfacePatchInput ### BrandTextFieldOverrides (OBJECT) Fields: - borderRadius: BrandScaleStep! - appearance: BrandFieldAppearance! ### BrandTextFieldOverridesPatchInput (INPUT_OBJECT) Input fields: - borderRadius: BrandScaleStep - appearance: BrandFieldAppearance ### BrandThemePatchInput (INPUT_OBJECT) Deep-partial brand theme. Every field is optional; only the leaves the caller wants to change need to be provided. The server deep-merges this into the stored theme. Input fields: - colorScheme: ColorScheme - colors: BrandColorsPatchInput - typography: BrandTypographyPatchInput - radii: BrandRadiiScalePatchInput - spacing: BrandSpacingScalePatchInput - shadows: BrandShadowsScalePatchInput - components: BrandComponentsPatchInput ### BrandTypography (OBJECT) Fields: - family: String! - headingFamily: String - baseSize: Int! - scale: BrandTypographyScaleSetting! ### BrandTypographyPatchInput (INPUT_OBJECT) Input fields: - family: String - headingFamily: String - baseSize: Int - scale: BrandTypographyScaleSetting ### BrandTypographyScaleSetting (ENUM) Values: - compact - comfortable - spacious ### Broadcast (OBJECT) A one-off marketing email campaign to a {@link MarketingSegment} segment. v1 composes a subject + preview text + a plain-text/markdown body; rich block content and the actual send fan-out land with the email-sending platform. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this broadcast. Consume instead of building - name: String! — Internal owner-facing name; not the email subject. - segment: MarketingSegment — Target segment, or null for a draft that hasn't chosen one yet. - subject: String! - previewText: String — Inbox preview/preheader text shown after the subject. - body: String! — The email body (plain text / markdown for v1). - status: BroadcastStatus! - scheduledAt: DateTime - recipientCount: Int! — Recipients materialised for the send (the audience snapshot size). 0 until - sentCount: Int! — Recipients actually handed to the email provider, after consent/suppression - deliveredCount: Int! — Sends the provider confirmed as delivered. Reported by the engagement - openedCount: Int! — Delivered emails that were opened (provider open tracking). - clickedCount: Int! — Delivered emails with at least one tracked link click. - bouncedCount: Int! — Hard bounces — the address was suppressed for future sends. - complainedCount: Int! — Spam complaints — the address was suppressed for future sends. - unsubscribedCount: Int! — Recipients who unsubscribed via this broadcast's unsubscribe link. - sendStartedAt: DateTime — When the fan-out began, or null before sending. - sentAt: DateTime — When the fan-out finished (status became `sent`), or null. - createdAt: DateTime! - updatedAt: DateTime! ### BroadcastConnection (OBJECT) Fields: - edges: [BroadcastEdge!]! - nodes: [Broadcast!]! - pageInfo: PageInfo! - totalCount: Int! ### BroadcastEdge (OBJECT) Fields: - cursor: String! - node: Broadcast! ### BroadcastStatus (ENUM) Lifecycle of a broadcast campaign. `draft` → `scheduled` → `sending` → `sent`, with `paused`/`canceled`/`failed` as off-ramps. Values: - draft - scheduled - sending - paused - sent - canceled - failed ### Business (OBJECT) Fields: - id: ID! - name: String! - handle: String! — URL-safe handle used as the first path segment in public and admin URLs - handleManagement: BusinessHandleManagement! — Editing state for the public handle: whether the business may choose a - kind: BusinessKind! — Classifies the business — a real customer business (`standard`) or an - owner: User! — The single owner of this business. Exactly one user per business — - organization: Organization — The organization this business belongs to, or null for standalone - staffMembers(first: Int, after: String, filter: StaffMemberFilter): StaffMemberConnection! — Staff members of this business. Cursor-paginated; default page size - ownerStaff: [StaffMember!]! — Staff entries for the holders of the implicit Owner role — the business - memberInvites: [BusinessInvite!]! - migration: BusinessMigration — Where this business was migrated from, when it was pre-built by Sessions to - roles: [BusinessRole!]! — Permission roles (templates) defined for this business, including seeded - viewer: BusinessViewerAccess! — The current user's effective access to this business — resolved permission - features: [Feature!]! — The platform feature flags currently enabled for this business. Used by - featureFlagSettings: [FeatureFlagSetting!]! — Every feature flag's setting for this business, including disabled ones, - viewerStaffMember: StaffMember — The current user's own staff member at this business, or null when the - bookableActivities: [Activity!]! — Booking activities (`structure: booking`) that currently accept online - nextBookingAvailability(after: DateTime): DateTime — The earliest open appointment slot across all of the business's booking - nextScheduledSessionDate(after: DateTime!): DateTime — The start of the next scheduled session strictly after `after`, across all - previousScheduledSessionDate(before: DateTime!): DateTime — The start of the most recent scheduled session strictly before `before`, - activities(first: Int, after: String, filter: ActivityFilter): ActivityConnection! — Activities offered by this business. Cursor-paginated; default page - sessions(starting: ActivitySessionsStarting, first: Int): [ActivitySession!]! — Sessions across all activities in this business, ordered by start time. - scheduledSessions(starting: ActivitySessionsStarting, filter: ActivitySessionFilter, sort: ActivitySessionSort, first: Int, after: String): ActivitySessionConnection! — Cursor-paginated sessions across all activities in this business, - upcomingSessionStats(daysAhead: Int): BusinessUpcomingSessionStats! — Aggregate counts of upcoming sessions, used by KPI / chart surfaces - sessionUtilizationHeatmap(start: String!, end: String!, filter: BusinessAnalyticsFilter): BusinessSessionUtilizationHeatmap! — Per-day session utilization heatmap for an inclusive `start..end` - revenueTimeline(start: String!, end: String!, filter: BusinessAnalyticsFilter): BusinessRevenueTimeline! — Daily gross revenue for the inclusive `start..end` window, in the - participantsTimeline(start: String!, end: String!, filter: BusinessAnalyticsFilter): BusinessParticipantsTimeline! — Daily new-participant and confirmed-registration counts for the - topActivities(start: String!, end: String!, limit: Int, filter: BusinessAnalyticsFilter): BusinessTopActivities! — Activities ranked by the number of confirmed registrations booked in - sessionAnalytics(start: String!, end: String!, limit: Int, filter: BusinessAnalyticsFilter): BusinessSessionAnalytics! — Session-level demand breakdowns for the inclusive `start..end` window, - teams(first: Int, after: String): TeamConnection! — Teams for this business. Cursor-paginated; default page size 50, - products(first: Int, after: String, filter: ProductFilter, availability: ProductAvailability!): ProductConnection! — Products sold by this business — passes, memberships, gift cards, and - discountCodes(first: Int, after: String): DiscountCodeConnection! — Discount codes a customer can type at checkout. Includes archived codes - marketingSegments(first: Int, after: String): MarketingSegmentConnection! — Saved marketing segments — named, consent-aware participant filters used - broadcasts(first: Int, after: String): BroadcastConnection! — One-off marketing broadcasts (email campaigns) to a segment. - journeys(first: Int, after: String): JourneyConnection! — Marketing automations (journeys) this business has set up. - webhookEndpoints(first: Int, after: String): WebhookEndpointConnection! — Outbound webhook endpoints registered for this business. Cursor-paginated; - apiKeys(first: Int, after: String): ApiKeyConnection! — Partner Business API keys minted for this business. Cursor-paginated; - challenges(first: Int, after: String): ChallengeConnection! — Challenges this business has set up. Cursor-paginated; default page - locations(first: Int, after: String): LocationConnection! — Physical locations this business uses to host activities. Cursor-paginated; - participants(first: Int, after: String, filter: ParticipantFilter, sort: ParticipantSort): ParticipantConnection! — All participants associated with this business — created when an admin adds - payments(first: Int, after: String, filter: PaymentFilter): PaymentConnection! — Historical payments processed for this business — every `payments` - stripe: BusinessStripe! — Stripe Connect integration state for this business. - subscription: PlatformSubscription — Sessions platform subscription for this business. Null only for - brand: BusinessBrand! — Brand configuration including icon and computed theming tokens. - brandPreviewToken: String — Short-lived embed Bearer token the brand editor's live preview passes to - channels: BusinessChannels! — Channel configuration: surfaces through which a business's customers can - emailMarketing: BusinessEmailMarketing! — Email-marketing consent collection settings. Off by default; governs whether - viewerEmailMarketingConsent: EmailMarketingConsentStatus — The signed-in viewer's own marketing-consent status with this business, or - contact: BusinessContact! — Customer-facing contact details surfaced in transactional emails and - localization: BusinessLocalization! — Localization configuration. Anchors all calendar-relevant rendering - taxSettings: BusinessTaxSettings! — Sales-tax collection configuration. Always non-null; the inner - cancellationPolicy: BusinessCancellationPolicy! — Default cancellation policy applied to registrations across the - policies: BusinessPolicies! — Customer-facing legal and operational policies for this business. Each - isOnboarding: Boolean! — Whether this business is still in its initial onboarding state — it has - guestCheckoutEnabled: Boolean! — Whether visitors can pay for activity registrations and product - hasDiscounts: Boolean! — Whether this business has any active discount codes a customer could - hasGiftCards: Boolean! — Whether this business sells at least one gift card product that a - hasPasses: Boolean! — Whether this business has at least one visible (purchasable) pass. - hasMemberships: Boolean! — Whether this business has at least one visible (purchasable) - hasPhysicalProducts: Boolean! — Whether this business has at least one visible (purchasable) physical - structures: [ActivityStructure!]! — Activity structures (`class`, `league`, etc.) the owner indicated this - activityTypes: [ActivityType!]! — Activity types (sports/disciplines) the owner indicated this business - amenities: [BusinessAmenity!]! — Practical / facility-level amenities the business offers (parking, - highlights: [BusinessHighlight!]! — Values-based "highlight" attributes a business advertises about - createdAt: DateTime! - url: ResourceUrl! - calendar: CalendarUrl! - search(query: String!, first: Int): BusinessSearchResults! — Quick contextual search across this business's resources, used by the - publicSearch(query: String!, first: Int): BusinessPublicSearchResults! — Public-safe counterpart to `search`, used by the Cmd-K Go menu on the - myRegistrationsOnDate(date: String!): [ActivityRegistration!]! — Returns the viewer's confirmed activity registrations at this business - reviews(first: Int, after: String): ReviewConnection! — Reviews about this business, newest first. Cursor-paginated; default - reviewSummary: ReviewSummary! — Aggregate rating summary across this business's visible reviews. - viewerReview: Review — The signed-in viewer's own review of this business, or null when the - viewerCanReview: Boolean! — Whether the signed-in viewer may leave a (new) review for this business ### BusinessAmenity (SCALAR) A practical or facility-level amenity offered by a business — ramp access, free parking, on-site café, etc. Identifiers use the `sessions.amenity.` reverse-DNS namespace and must match the canonical server-side list (`AMENITIES` in the database schema); unrecognised values are rejected at the resolver. Customer-facing labels and icons are not part of this scalar — clients render them from a shared helper keyed off the identifier. ### BusinessAnalyticsFilter (INPUT_OBJECT) Shared filter for the business Reports analytics charts (`Business.revenueTimeline`, `participantsTimeline`, `topActivities`, `sessionAnalytics`, `sessionUtilizationHeatmap`). Every dimension is optional; a null or empty list means "no constraint on that dimension". Not every chart can honor every dimension — each field documents which charts apply it. A chart silently ignores dimensions it cannot support rather than erroring. In particular `revenueTimeline` is backed by payments, which are not linked to activities/staff/locations, so it honors only the surrounding `start`/`end` window and reports `filtersIgnored` when any entity dimension is supplied. Input fields: - activity: [ID!] — Restrict to the listed activity GraphQL IDs. Applied by every chart - staff: [ID!] — Restrict to sessions where any of the listed staff members are - location: [ID!] — Restrict to sessions at any of the listed location GraphQL IDs. - activityType: [ActivityType!] — Restrict to activities of any of the listed activity types. Applied by - timeOfDay: [ActivitySessionTimeOfDay!] — Time-of-day buckets evaluated in the business's local timezone. - status: [ActivitySessionStatus!] — Session lifecycle statuses to include. Applied by ### BusinessAppBuild (OBJECT) One build/submit attempt for an app listing. In v1 the pipeline is semi-manual: a submit enqueues a `queued` build the Sessions team fulfils via fastlane, reporting status back. Full CI automation is tracked in issue #1738. Fields: - id: ID! - version: String - buildNumber: String - status: AppBuildStatus! - ciRunUrl: URL - logUrl: URL - error: String - startedAt: DateTime - finishedAt: DateTime - createdAt: DateTime! ### BusinessAppChannel (OBJECT) Configuration for the business's white-label native apps (iOS first, Android later). A business fills in store metadata and connects their own Apple Developer account (App Store Guideline 4.2.6 requires template apps to ship under the content provider's account); Sessions then builds and submits on their behalf. Returned only to authenticated staff of the business — non-staff callers see `eligible: false` and an empty list. Fields: - eligible: Boolean! — Whether the business may publish a white-label app — i.e. the - developerAccountConnected: Boolean! — Whether App Store Connect credentials have been connected for this - listings: [BusinessAppListing!]! — Per-platform listings the business has configured. Empty until the ### BusinessAppListing (OBJECT) A business's app store listing for one platform. Branding (icon, colors, name) is inherited from the business brand; the per-listing fields here are the store-specific metadata plus published-app identifiers. Fields: - id: ID! - platform: AppPlatform! - status: AppListingStatus! - appName: String - subtitle: String - marketingDescription: String - keywords: [String!]! - bundleId: String - supportUrl: URL - marketingUrl: URL - privacyPolicyUrl: URL - primaryCategory: String - ageRating: String - reviewContact: AppReviewContact! - reviewNotes: String - storeAppId: String - currentVersion: String - currentBuildNumber: String - submittedAt: DateTime - publishedAt: DateTime - rejectionReason: String - builds: [BusinessAppBuild!]! — Build/submit attempts for this listing, newest first. ### BusinessAvailableProducts (OBJECT) Fields: - business: Business! - products: [Product!]! ### BusinessBrand (OBJECT) Business brand configuration: icon image, design-system seed values, and server-computed theming tokens. The expander in `@sessions-internal/core/branding` fills every leaf the business hasn't explicitly set, so an unconfigured business gets sensible defaults. Fields: - icon: Image — Square icon image for the business, or null if not set. - favicon: Image — Operator-provided favicon override shown in browser tabs on the - touchIcon: Image — Operator-provided apple-touch-icon override used by iOS home-screen - faviconUrl: URL! — Absolute URL of the favicon served on this business's public pages — - touchIconUrl: URL! — Absolute URL of the apple-touch-icon for this business's public pages. - colorScheme: ColorScheme! — Light vs dark scheme. Drives the `` attribute on - primaryColor: String — Convenience shortcut for the OKLCH string of `colors.surfaces.primary.background`. - accentColor: String — Convenience shortcut for the OKLCH string of `colors.accent.value`. - colors: BrandColors! — Color roles — three stacked surfaces (primary/secondary/tertiary) and - typography: BrandTypography! — Typography settings (font family stack, heading family override, base - radii: BrandRadiiScale! — Design-system scale definitions. Components reference these scales by - spacing: BrandSpacingScale! - shadows: BrandShadowsScale! - components: BrandComponents! — Per-component overrides applied to the design system primitives. Every - theming: [ThemingToken!]! — CSS custom property tokens in the public `--sessions-*` namespace. - integrationCss: String! — Server-rendered CSS snippet a customer can paste onto their site to - configurationStatus: BrandConfigurationStatus! — Whether the brand has any of icon, colors, typography, or component ### BusinessCancellationPolicy (OBJECT) A business-level cancellation policy. Drives the refund decision when a participant or staff member cancels a registration. Per-activity overrides live on the activity itself; resolved policy for an activity is exposed as `Activity.effectiveCancellationPolicy`. Staff-initiated session cancels (`cancelActivitySession`) bypass this policy and default to a full refund regardless of the cutoff. Fields: - cutoffMinutes: Int — Minutes before the session start at which the in-window percentage - refundPercentageInWindow: Int! — Refund percentage (0–100) issued when a participant cancels at or - refundPercentageOutOfWindow: Int! — Refund percentage (0–100) issued when a participant cancels after - penaltyFixedCents: Int! — Flat cancellation fee (cents, ≥ 0) withheld from the monetary refund - penaltyCredits: Int! — Pass / membership session credits (≥ 0) forfeited when a participant ### BusinessChannels (OBJECT) Channels group the surfaces a business's customers can reach it through. This covers the `public` channel (Sessions Go listing + unified search), the `web` channel (Sessions embeds on the business's own site), and the `app` channel (white-label native apps). Fields: - public: BusinessPublicChannel! - web: BusinessWebChannel! - app: BusinessAppChannel! ### BusinessClaim (OBJECT) Full business-ownership claim, exposed on the internal (concierge) schema. Fields: - id: ID! - business: Business! - status: BusinessClaimStatus! - invitedEmail: String - invitedName: String - createdBy: User - claimedBy: User - expiresAt: DateTime - claimedAt: DateTime - createdAt: DateTime! - url: URL! — Absolute URL the prospective owner follows to claim the business. ### BusinessClaimPreview (OBJECT) Unauthenticated-safe preview of a business-ownership claim, shown on the `/claim/` landing page before the visitor signs in. Deliberately omits private business internals — only the public-facing name, brand, and migration framing needed to render the claim call-to-action. Fields: - token: ID! — The claim token (echoes the value in the URL). - status: BusinessClaimStatus! - businessName: String! — The name of the business being claimed. - sourcePlatform: MigrationSourcePlatform — The source platform this business was migrated from, if any. - sourceName: String — The studio name on the source platform, for familiar framing. - invitedName: String — Prospective owner's name, prefilled to personalize the page. Null if unset. - expiresAt: DateTime — When the link expires, or null if it never does. - redeemable: Boolean! — True when the claim is still redeemable (pending and not past expiry). ### BusinessClaimStatus (ENUM) State of a {@link BusinessClaim}. `pending` links are redeemable; `claimed` have transferred ownership; `revoked` were cancelled by Sessions. Values: - pending - claimed - revoked ### BusinessConnection (OBJECT) Cursor-paginated list of businesses. Used by internal admin search. Fields: - edges: [BusinessEdge!]! - nodes: [Business!]! - pageInfo: PageInfo! - totalCount: Int! ### BusinessContact (OBJECT) Customer-facing contact details. `email` is the operator-set override; when unset, consumers use `effectiveEmail` which falls back to the business owner's email. `phone` is omitted from rendering when null. Fields: - email: String — Operator-set contact email override. Null when unset. - effectiveEmail: String! — Resolved contact email — `email` if set, else the business owner's - phone: String — Free-form phone number for customer contact. Null when unset. ### BusinessEdge (OBJECT) Fields: - cursor: String! - node: Business! ### BusinessEmailMarketing (OBJECT) Email-marketing consent collection settings for a business. Off by default; a business must deliberately enable collection. Sessions never sends marketing email — these settings govern whether an opt-in is presented on registration and checkout so the business can lawfully email participants via its own provider. Fields: - collecting: Boolean! — Whether the opt-in is presented on registration and checkout. - descriptor: String — Business-authored sentence describing what subscribers receive, interpolated - canEnable: Boolean! — Whether the business is eligible to enable collection. Requires a mailing - mailingAddress: String — The sender's mailing address woven into the disclosure — the same address ### BusinessFilter (INPUT_OBJECT) Filter applied to a paginated business list. `query` matches the business's name or handle. `kind` narrows the list to real customer businesses or automated-test fixtures. Input fields: - query: String - kind: BusinessKind ### BusinessHandleManagement (OBJECT) Public-handle editing state for a business. `current` and `isCustom` describe the handle as it stands; `eligible` and `changesRemaining` describe whether and how often the viewer may change it (a paid Grow+ perk, capped over the business's lifetime). Fields: - current: String! — The handle in effect right now (same value as `Business.handle`). - isCustom: Boolean! — Whether the current handle was deliberately chosen rather than auto-generated. - eligible: Boolean! — Whether the business's plan permits choosing a custom handle (middle plan - changesRemaining: Int! — How many handle changes the business may still make. `0` once the cap is ### BusinessHighlight (SCALAR) A values-based "highlight" attribute a business advertises — women- owned, locally owned, sliding-scale pricing, beginner-friendly, etc. Designed as the surface for buyer-preference filtering on the public discovery page (distinct from amenities, which describe tangible facility features). Identifiers use the `sessions.highlight.` reverse-DNS namespace and must match the server-side `HIGHLIGHTS` list. ### BusinessHomeLayout (ENUM) Landing experience a business-admin staff member lands on, determined by their role. A small curated set for v1 (see #95); an arbitrary home builder is out of scope. Values: - dashboard — The full owner / manager KPI dashboard. - schedule — A focused "my upcoming sessions" home, for instructors and similar. ### BusinessInvite (OBJECT) Fields: - id: ID! - business: Business! - email: String! - status: BusinessInviteStatus! - invitedBy: User - role: BusinessRole — The role the invitee is granted on acceptance. Null only for legacy invites - createdAt: DateTime! ### BusinessInviteStatus (ENUM) Values: - pending - accepted - declined ### BusinessKind (ENUM) Classifies a business. `standard` is a real customer business; `endToEndTest` marks an automated-test fixture created by the Playwright suite via `setupE2EBusiness`. Test fixtures share the production database, so this is the source of truth for excluding them from public-facing surfaces and from developer notifications. Values: - standard - endToEndTest - demo — A seeded, public example tenant (one per marketing vertical). Visitors can ### BusinessLocalization (OBJECT) Localization settings for a business — currently just the canonical IANA timezone, with locale and currency display likely to follow. Fields: - timezone: Timezone! — IANA timezone (e.g. `"America/Toronto"`) anchoring the public calendar, ### BusinessMigration (OBJECT) Records that a business was pre-built by Sessions to migrate an operator off a competitor platform, and where it came from. Attached during the concierge build (one per business); null for ordinary signups. Fields: - id: ID! - business: Business! - sourcePlatform: MigrationSourcePlatform! — Which competitor platform the operator is moving from. - sourceHandle: String — The operator's identifier on the source platform — a MindBody numeric site - sourceName: String — The studio name as it appears on the source platform (display only). - importedAt: DateTime — When the bulk import from the source platform last completed, or null if it - createdAt: DateTime! ### BusinessParticipantsTimeline (OBJECT) Per-day new-participant and confirmed-registration counts for a contiguous date range in the business's local timezone. See `Business.participantsTimeline`. Fields: - start: String! — Inclusive start of the window as `YYYY-MM-DD` (business-local). Echoed - end: String! — Inclusive end of the window as `YYYY-MM-DD` (business-local). - today: String! — Business-local "today" as `YYYY-MM-DD`. - totalNewParticipants: Int! — Sum of `daily[].newParticipants` across the window. - totalRegistrations: Int! — Sum of `daily[].registrations` across the window. - daily: [ParticipantsDayCount!]! — One entry per calendar day from `start` through `end` (inclusive), ### BusinessPaymentsMode (ENUM) Whether the business is processing real payments or running in test mode (card checkouts go through the platform's Stripe account until Connect is finished). Computed from `onboardingStatus`. Values: - live — Stripe Connect onboarding is complete; charges route to the connected - test — No connected account or onboarding is incomplete; card charges are ### BusinessPolicies (OBJECT) The business-configurable policy disclosures surfaced to customers. Fields: - privacy: BusinessPolicy! - terms: BusinessPolicy! - cancellationRefund: BusinessPolicy! - californiaPrivacy: BusinessPolicy! — California-specific privacy notice (CCPA/CPRA). Backs the "Do Not Sell or - consumerHealthData: BusinessPolicy! — Consumer health data privacy policy (Washington My Health My Data Act and ### BusinessPolicy (OBJECT) One customer-facing policy disclosure configured by a business. Fields: - mode: BusinessPolicyMode! - url: URL — External policy URL when `mode = externalUrl`. Null for hosted/default - contentMarkdown: String! — Markdown shown on the hosted policy page. Returns the default policy - defaultContentMarkdown: String! — Sessions' generated default Markdown for this policy, useful when an ### BusinessPolicyMode (ENUM) Policy delivery mode for a business policy. Values: - default - externalUrl - hostedContent ### BusinessPrivacy (ENUM) Master access state for a business's public page. `public` is the normal state. `private` gates the page itself: non-staff visitors get a 404 as if the business didn't exist, while staff with access still see the full public experience (with a "Private" indicator), and the business is excluded from every discovery and search surface regardless of the finer-grained `BusinessVisibility` flags. Lets an operator stand up and rehearse a store end-to-end before going live. Values: - public - private ### BusinessPublicChannel (OBJECT) Configuration for the business's presence on Sessions' own public surfaces: the per-business page on `go.sessions.website/`, the Sessions Go discovery listing, and the unified search. Fields: - privacy: BusinessPrivacy! — Master access switch for the public page. When `private`, the page is - visibility: BusinessVisibility! — Visibility of the business on the Sessions Go discovery surface. - searchVisibility: BusinessVisibility! — Visibility in Sessions' public unified search (forthcoming). Stored on - seo: BusinessSeo! — Search-engine and social-sharing metadata for the public page. Operators - homePageBlocks: [HomePageBlock!]! — Operator-configured order and visibility of the public home page's ### BusinessPublicSearchResults (OBJECT) Mixed-resource search results returned by `Business.publicSearch`. Same shape as `BusinessSearchResults` minus `participants` — the public schema never surfaces participant records. Activities are limited to those with `public` visibility. Fields: - activities: [Activity!]! - staff: [StaffMember!]! - locations: [Location!]! - products: [Product!]! — Products whose name matches the query, limited to those with `visible` ### BusinessRevenueTimeline (OBJECT) Per-day gross revenue for a contiguous date range in the business's local timezone. Shape mirrors `BusinessSessionUtilizationHeatmap` so homepage charts can render past activity alongside the utilization heatmap. See `Business.revenueTimeline`. Fields: - start: String! — Inclusive start of the window as `YYYY-MM-DD` (business-local). Echoed - end: String! — Inclusive end of the window as `YYYY-MM-DD` (business-local). - today: String! — Business-local "today" as `YYYY-MM-DD`. Lets clients dim or otherwise - currency: String! — ISO 4217 currency code, lowercase (e.g. `cad`). Matches the dominant - totalAmount: Int! — Sum of `amount` across all succeeded payments in the window, in - daily: [RevenueDayAmount!]! — One entry per calendar day from `start` through `end` (inclusive), - filtersIgnored: Boolean! — True when the caller supplied an entity dimension on the analytics ### BusinessRole (OBJECT) A reusable permission template for business staff: a named bundle of BusinessPermission flags plus a home layout, defined per business and assignable to many staff members. Editing a role updates the effective permissions of everyone who holds it (live RBAC, not a one-time copy). Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this role. Consume instead of building - name: String! - description: String - permissions: Int! — Combined bitmask of BusinessPermission flags this role grants. - home: BusinessHomeLayout! - defaultActivityRole: String — Default role to fill when a member holding this role is assigned to an - builtIn: Boolean! — True when this role was seeded from a built-in preset (e.g. Instructor). - staffCount: Int! — Number of active (non-deleted) staff members assigned this role. - staff: [StaffMember!]! — Active (non-deleted) staff members assigned this role, ordered by name. - createdAt: DateTime! ### BusinessRoleResult (OBJECT) Fields: - role: BusinessRole - errors: [OperationError!]! ### BusinessSearchResults (OBJECT) Mixed-resource search results returned by `Business.search`. Each list is independently scoped and capped at the requested `first`; an empty list means no matches in that category. Callers can OR the four lists to detect "any results" without an explicit aggregate count. Fields: - activities: [Activity!]! - participants: [Participant!]! - staff: [StaffMember!]! - locations: [Location!]! - products: [Product!]! — Products (passes, memberships, gift cards, physical products) whose name ### BusinessSeo (OBJECT) Operator-editable SEO and social-sharing metadata for a business's public page. Each field is null when the page falls back to its computed default (`title` → the business name; `description` → a generated summary). These power the ``, `<meta name="description">`, Open Graph, and Twitter card tags rendered on `go.sessions.website/<handle>`. The social-share image defaults to the business's brand icon and is not separately configurable. Fields: - title: String — Operator-provided page-title override, or null to fall back to the - description: String — Operator-provided meta-description override, or null to fall back to a ### BusinessSessionAnalytics (OBJECT) Session-level demand breakdowns for a contiguous date range in the business's local timezone. See `Business.sessionAnalytics`. Fields: - start: String! — Inclusive start of the window as `YYYY-MM-DD` (business-local). Echoed - end: String! — Inclusive end of the window as `YYYY-MM-DD` (business-local). - byStaff: [RankedRegistrationCount!]! — Staff ranked by confirmed registrations on the sessions they were - byLocation: [RankedRegistrationCount!]! — Locations ranked by confirmed registrations on sessions held there, - byWeekday: [RegistrationCountBucket!]! — Confirmed registrations bucketed by the session's local weekday. Seven - byTimeOfDay: [RegistrationCountBucket!]! — Confirmed registrations bucketed by the session's local time of day. - attendance: AttendanceSummary! — Check-in totals across confirmed registrations on sessions that have ### BusinessSessionUtilizationHeatmap (OBJECT) Per-day session utilization for a contiguous date range in the business's local timezone. Shape mirrors `BusinessUpcomingSessionStats` but covers a caller-specified window so contribution-graph-style heatmaps can show past + future utilization in one query. See `Business.sessionUtilizationHeatmap`. Fields: - start: String! — Inclusive start of the window as `YYYY-MM-DD` (business-local). Echoed - end: String! — Inclusive end of the window as `YYYY-MM-DD` (business-local). - today: String! — Business-local "today" as `YYYY-MM-DD`. Lets callers mark today's - daily: [SessionUtilizationDay!]! — One entry per calendar day from `start` through `end` (inclusive), ### BusinessStripe (OBJECT) Stripe Connect integration state for a business. Fields: - status: StripeConnectionStatus! - onboardingStatus: StripeOnboardingStatus! - paymentsMode: BusinessPaymentsMode! ### BusinessTaxRegistration (OBJECT) A jurisdiction the business is registered to collect tax in. Mirrors a `tax.registration` object on the connected Stripe account; created and expired through `addBusinessTaxRegistration` / `removeBusinessTaxRegistration`. Fields: - id: ID! — Stripe registration id (`taxreg_...`). - country: String! — ISO 3166-1 alpha-2 country code (uppercase). - region: String — ISO 3166-2 sub-region code (uppercase) when applicable — US state, - status: BusinessTaxRegistrationStatus! - activeFrom: DateTime! - expiresAt: DateTime — Set when the registration has been scheduled to expire (or has - jurisdictionLabel: String! — Display label for the jurisdiction, e.g. `"Ontario, Canada"` or ### BusinessTaxRegistrationStatus (ENUM) Values: - active - scheduled - expired ### BusinessTaxSettings (OBJECT) Sales-tax collection configuration for a business. Local switches (enabled, display mode, default code, origin) live in our database; per-jurisdiction registrations live on the connected Stripe account and are surfaced through `registrations`. Fields: - enabled: Boolean! — Effective master toggle. False unless the saved tax switch is on and - displayMode: TaxDisplayMode! - defaultTaxCode: String — Default Stripe tax code (e.g. `txcd_10000000`) applied to items - suggestedDefaultTaxCode: String — Server's suggestion for `defaultTaxCode` derived from the business's - originLocation: Location — Origin location used as `ship_from_details` when calculating tax. - registrations: [BusinessTaxRegistration!]! — Active and scheduled tax registrations on the connected Stripe ### BusinessTopActivities (OBJECT) The most-booked activities for a contiguous date range in the business's local timezone. See `Business.topActivities`. Fields: - start: String! — Inclusive start of the window as `YYYY-MM-DD` (business-local). Echoed - end: String! — Inclusive end of the window as `YYYY-MM-DD` (business-local). - activities: [TopActivityEntry!]! — Activities ordered by confirmed-registration count descending. May be ### BusinessUpcomingSessionStats (OBJECT) Aggregate stats about a business's upcoming sessions, shaped for KPI and chart consumers. See `Business.upcomingSessionStats`. Fields: - totalCount: Int! — Total count of upcoming sessions across all activities. Status is - daily: [SessionDayCount!]! — Per-day counts for the next `daysAhead` days, in business timezone. ### BusinessViewerAccess (OBJECT) The current user's effective access to a business: their resolved permission bitmask, assigned role (if any), home layout, and convenience booleans for gating navigation and actions on the client without re-deriving the bitmask. Fields: - permissions: Int! — Effective (expanded) bitmask of BusinessPermission flags. - home: BusinessHomeLayout! - isAdmin: Boolean! - canManageSchedule: Boolean! - canManageParticipants: Boolean! - canManageProducts: Boolean! - canManageMarketing: Boolean! - canManageStaff: Boolean! - canManageLocations: Boolean! - canViewReports: Boolean! - canViewSchedule: Boolean! - canViewParticipants: Boolean! - canViewProducts: Boolean! - canViewMarketing: Boolean! - canViewStaff: Boolean! - canViewLocations: Boolean! - dismissedOnboardingMilestones: [OnboardingMilestone!]! — Onboarding milestone suggestions this viewer has dismissed from the - reportsDashboardLayout: [DashboardCard!]! — This viewer's personal layout of the Reports analytics dashboard — the - dashboardViews: [DashboardView!]! — This viewer's saved Reports-dashboard views for this business — named ### BusinessVisibility (ENUM) Generic visibility state used for business-level toggles (public page on Sessions Go, listing in unified search, and future channel surfaces). Values: - visible - hidden ### BusinessWebChannel (OBJECT) Configuration for the business's presence on its own website. Today this covers the Sessions embeds (widgets on the business's site); further web-specific settings will be added alongside. Fields: - embedding: BusinessWebEmbedding! ### BusinessWebEmbedding (OBJECT) Embed-related configuration for a business's web channel. Fields: - allowedOrigins: [URL!]! — Origins (scheme + host + optional port, no path) allowed to embed this ### BuyerInput (INPUT_OBJECT) Buyer details for an unauthenticated checkout. Required when the caller is not signed in and the target product or activity allows guest checkout. Ignored when the caller is signed in. The server finds an existing user by email or creates a new one inline; when `createAccount` is true (the default), a magic-link email is sent so the buyer can claim the account. Input fields: - email: String! - name: String - createAccount: Boolean — Whether to send a magic-link sign-in email to the buyer so they - country: String — Buyer's destination address, used for tax calculation. Required - region: String — ISO 3166-2 region (state / province / etc.) sub-code. - postalCode: String — Postal or ZIP code. Required for sub-region precision in the US. ### BuyPassPaymentOption (OBJECT) A "buy and use" suggestion: the viewer doesn't have a covering membership or pass, but the business sells passes that would work for this session. Carries the candidate passes the client should offer in its inline pass picker. Filtered server-side by business, visibility, sale window, and (for passes flagged `purchaseRules.introOffer`) by ownership; signed-out viewers never see this option because pass purchases require an account. Suppressed when the viewer already has a covering pass or membership option in this resolution. Fields: - passes: [Pass!]! — Candidate passes the viewer can buy to cover this session, ordered by ### CalendarUrl (OBJECT) Fields: - url: String! - googleUrl: String! ### CancelActivityRegistrationResult (OBJECT) Fields: - errors: [OperationError!]! ### CancelActivitySessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### CancelBusinessSubscriptionResult (OBJECT) Fields: - subscription: PlatformSubscription - errors: [OperationError!]! ### CancellationActor (ENUM) How the cancel was initiated, recorded on `ActivityRegistration.cancellation`. Values: - participant - staff - system ### CancelMembershipSubscriptionResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### CardPaymentDetails (OBJECT) Fields: - brand: String! - last4: String! - expMonth: Int - expYear: Int ### CardPaymentOption (OBJECT) A payment option requiring direct card payment via Stripe. Fields: - stripeRequired: Boolean! — Placeholder — no saved cards yet. - mode: BusinessPaymentsMode! — Whether checkout will charge the connected account (`live`) or route to - stripePublishableKey: String! — Stripe publishable key the client should pass to `loadStripe` when ### CardRegistrationPayment (OBJECT) Fields: - stripePayment: Boolean! — Placeholder field — all card payments are Stripe-backed. - payment: Payment! - card: CardPaymentDetails ### Challenge (OBJECT) A business-configured challenge that encourages participation over a time window — e.g. "12 classes in 21 days". Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical pages for this challenge — the public `go` URL and the - name: String! - description: String - startAt: DateTime! - endAt: DateTime! - sessionCount: Int! - active: Boolean! - registrations(first: Int, after: String): ChallengeRegistrationConnection! — Registrations for this challenge, newest first. Cursor-paginated; - registrationCount: Int! - createdAt: DateTime! ### ChallengeConnection (OBJECT) Cursor-paginated list of challenges for a business. Fields: - edges: [ChallengeEdge!]! - nodes: [Challenge!]! - pageInfo: PageInfo! - totalCount: Int! ### ChallengeEdge (OBJECT) Fields: - cursor: String! - node: Challenge! ### ChallengeProgress (OBJECT) Computed progress for a participant's challenge registration. Fields: - completedSessionCount: Int! - remainingSessionCount: Int! - percentComplete: Float! - completed: Boolean! ### ChallengeRegistration (OBJECT) A participant's registration for a challenge. Fields: - id: ID! - challenge: Challenge! - participant: Participant! - progress: ChallengeProgress! - createdAt: DateTime! ### ChallengeRegistrationConnection (OBJECT) Cursor-paginated list of challenge registrations. Used by the challenge-detail page to page through the participants who have joined a challenge. Fields: - edges: [ChallengeRegistrationEdge!]! - nodes: [ChallengeRegistration!]! - pageInfo: PageInfo! - totalCount: Int! ### ChallengeRegistrationEdge (OBJECT) Fields: - cursor: String! - node: ChallengeRegistration! ### ChangeBusinessSubscriptionPlanResult (OBJECT) Fields: - subscription: PlatformSubscription - errors: [OperationError!]! ### CheckInParticipantResult (OBJECT) Fields: - registration: ActivityRegistration - errors: [OperationError!]! ### CheckoutPreviewActivityInput (INPUT_OBJECT) Input fields: - session: EntityRef! - scope: PricingRuleScope — Whether the customer is registering as an individual or as a team. ### CheckoutPreviewInput (INPUT_OBJECT) Input fields: - product: EntityRef — The product to preview (mutually exclusive with `activity`). - activity: CheckoutPreviewActivityInput — The activity registration to preview (mutually exclusive with `product`). - discountCode: String - giftCardCode: String - destination: TaxAddressInput — Buyer's destination address, used for jurisdictional tax calculation ### CheckoutPreviewResult (OBJECT) Side-effect-free preview used by checkout UIs to show line totals as the customer types a discount code or gift-card code, before committing to purchase. Pricing rules apply first, the discount code subtracts, then tax is computed on the post-discount line; the gift card covers the resulting tax-inclusive `total` up to its `balanceRemaining`. The customer pays `amountDueCents` via Stripe. Fields: - subtotal: Int! - pricingRuleApplied: PricingRule - discountCodeApplied: DiscountCode - discountCents: Int! - taxCents: Int! — Sales tax computed on the post-discount line. Zero when the business - total: Int! — Post-discount, tax-inclusive line total — `subtotal − discountCents + taxCents`. - taxCalculationId: String — Stripe Tax calculation reference (`taxcalc_…`) that callers should - giftCardApplied: ProductPurchase - giftCardCreditCents: Int! - amountDueCents: Int! - errors: [OperationError!]! ### CheckoutSession (OBJECT) Response from creating a checkout for a payment. Fields: - clientSecret: String! — Client secret for Stripe.js `confirmPayment()`. - paymentId: ID! — The payment record ID in our database. - amount: Int — Total amount to be charged, in cents (tax- and tip-inclusive), when the ### ChildInput (INPUT_OBJECT) Input fields: - name: String! - dateOfBirth: String! — ISO 8601 calendar date (`YYYY-MM-DD`). ### ClaimBusinessResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### ClientNote (OBJECT) A practitioner-authored note about a client. Sensitive health-adjacent data: only ever returned to authorized staff of the owning business. Fields: - id: ID! - kind: ClientNoteKind! - body: String! — Markdown note body. For `soap`, the four sections are composed into one body. - author: StaffMember — The staff member who wrote the note, or null if their record was removed. - createdAt: DateTime! - updatedAt: DateTime! ### ClientNoteConnection (OBJECT) Cursor-paginated list of a participant's client notes. Fields: - edges: [ClientNoteEdge!]! - nodes: [ClientNote!]! - pageInfo: PageInfo! - totalCount: Int! ### ClientNoteEdge (OBJECT) Fields: - cursor: String! - node: ClientNote! ### ClientNoteKind (ENUM) The kind of a client-record note — a general free-form `note`, or a structured `soap` (Subjective / Objective / Assessment / Plan) visit note. Values: - note - soap ### ClientNoteResult (OBJECT) Fields: - clientNote: ClientNote - errors: [OperationError!]! ### ClockStart (ENUM) When a pass/membership purchase's validity clock (relative expiry / billing renewal) starts. `purchase` is the default (clock starts at purchase time); `firstSession` defers it until the buyer's first booked session occurs. Values: - purchase - firstSession ### ColorScheme (ENUM) Color scheme a brand renders in on its public-facing pages. Forward- compatible with a future `auto` value for brands that define both a light and a dark scheme and want the system to pick between them. Values: - light - dark ### CommunicationChannel (ENUM) A channel a session reminder can be delivered over. `push` requires the business to have a published white-label app and the participant to have a registered device; it silently no-ops otherwise. Values: - email - push ### Competitor (OBJECT) One side of a match. A league fixture pits two competitors — today always teams (e.g. volleyball); a future individual ladder (e.g. singles tennis) would pit two participants. `kind` says which the `id` refers to (a `Team` or a `Participant`); `name` is the display name for either. Fields: - id: ID! - kind: CompetitorKind! - name: String! ### CompetitorKind (ENUM) Which kind of entity a `Competitor` wraps. Values: - team - individual ### CompleteCheckoutResult (OBJECT) Result from completing a checkout after Stripe payment confirmation. Returns whichever entity was fulfilled based on the payment type. Fields: - purchase: ProductPurchase - registration: ActivityRegistration - team: Team - errors: [OperationError!]! ### CompleteSubscriptionBillingUpdateResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### ConfirmEmailChangeResult (OBJECT) Result of confirming a pending email change with the 6-digit code sent to the new email address. Fields: - user: User - errors: [OperationError!]! ### ConnectStripeAccountResult (OBJECT) Fields: - accountSession: StripeAccountSession - errors: [OperationError!]! ### Consent (OBJECT) A consent recorded on a (usually minor) member's behalf by a guardian. Fields: - id: ID! - type: ConsentType! - granted: Boolean! - grantedAt: DateTime! ### ConsentType (ENUM) Kinds of consent a guardian can grant for a member. Values: - photoMedia — Use of the child's photo/likeness in media. - pickupAuthorization — Authorization for named people to pick the child up. - medicalTreatment — Consent to administer emergency medical treatment. - selfSignout — Permission for the child to sign themselves out. ### ContractRegistrationBlock (OBJECT) Fields: - title(locale: Locale): String — Optional short title for the contract, shown as the label on the - titleTranslations: [Translation!]! — All available translations for the title field. - content(locale: Locale): String! — Resolved for the given locale, falling back to en, then first available. - contentTranslations: [Translation!]! — All available translations for the content field. - signatureRequired: Boolean! - metadataKey: String — Optional key under which the accepted contract is captured as structured - saveToParticipant: Boolean! — When true, the signed agreement is saved against the participant (their ### ContractRegistrationBlockInput (INPUT_OBJECT) Input fields: - title: [TranslatedStringInput!] - content: [TranslatedStringInput!]! - signatureRequired: Boolean! - metadataKey: String - saveToParticipant: Boolean — When true, the signed agreement is saved against the participant (their ### CopyBusinessRoleToOrganizationResult (OBJECT) Fields: - createdRoles: [BusinessRole!]! — The role copies created in sibling businesses by this call. Locations that - errors: [OperationError!]! ### CreateActivityResult (OBJECT) Fields: - activity: Activity - errors: [OperationError!]! ### CreateActivitySessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### CreateApiKeyResult (OBJECT) Fields: - apiKey: ApiKey - secret: String — The full secret key, returned exactly once at creation and never again — - errors: [OperationError!]! ### CreateBillingPortalSessionResult (OBJECT) Fields: - session: BillingPortalSession - errors: [OperationError!]! ### CreateBroadcastResult (OBJECT) Fields: - broadcast: Broadcast - errors: [OperationError!]! ### CreateBusinessClaimResult (OBJECT) Fields: - claim: BusinessClaim - errors: [OperationError!]! ### CreateBusinessResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### CreateBusinessSubscriptionResult (OBJECT) Fields: - subscription: PlatformSubscription - errors: [OperationError!]! ### CreateBusinessSubscriptionSetupIntentResult (OBJECT) Fields: - setupIntent: PaymentMethodSetupIntent - errors: [OperationError!]! ### CreateChallengeResult (OBJECT) Fields: - challenge: Challenge - errors: [OperationError!]! ### CreateCheckoutInput (INPUT_OBJECT) Input fields: - business: EntityRef! - type: PaymentType! - referenceId: ID! — ID of the related entity (activity pass, activity session, etc.). ### CreateCheckoutResult (OBJECT) Fields: - checkout: CheckoutSession - errors: [OperationError!]! ### CreateConciergeBusinessResult (OBJECT) Fields: - business: Business - claim: BusinessClaim - errors: [OperationError!]! ### CreateDiscountCodeResult (OBJECT) Fields: - discountCode: DiscountCode - errors: [OperationError!]! ### CreateFacilityResult (OBJECT) Fields: - facility: Facility - errors: [OperationError!]! ### CreateGiftCardResult (OBJECT) Fields: - giftCard: GiftCard - errors: [OperationError!]! ### CreateJourneyResult (OBJECT) Fields: - journey: Journey - errors: [OperationError!]! ### CreateLocationResult (OBJECT) Fields: - location: Location - errors: [OperationError!]! ### CreateMarketingSegmentResult (OBJECT) Fields: - segment: MarketingSegment - errors: [OperationError!]! ### CreateMatchResult (OBJECT) Fields: - match: Match - errors: [OperationError!]! ### CreateMembershipResult (OBJECT) Fields: - membership: Membership - errors: [OperationError!]! ### CreateOrganizationBillingSetupIntentResult (OBJECT) Fields: - clientSecret: String — Client secret for confirming the SetupIntent with Stripe Elements. - errors: [OperationError!]! ### CreateOrganizationResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### CreateParticipantResult (OBJECT) Fields: - participant: Participant - errors: [OperationError!]! ### CreatePassResult (OBJECT) Fields: - pass: Pass - errors: [OperationError!]! ### CreatePaymentMethodSetupIntentResult (OBJECT) Fields: - setupIntent: PaymentMethodSetupIntent - errors: [OperationError!]! ### CreatePhysicalProductResult (OBJECT) Fields: - physicalProduct: PhysicalProduct - errors: [OperationError!]! ### CreatePricingRuleResult (OBJECT) Fields: - pricingRule: PricingRule - errors: [OperationError!]! ### CreateStaffMemberResult (OBJECT) Fields: - staffMember: StaffMember - errors: [OperationError!]! ### CreateStripeAccountSessionResult (OBJECT) Fields: - accountSession: StripeAccountSession - errors: [OperationError!]! ### CreateTeamInviteResult (OBJECT) Fields: - teamInvite: TeamInvite - errors: [OperationError!]! ### CreateTeamResult (OBJECT) Fields: - team: Team - errors: [OperationError!]! ### CreateUserResult (OBJECT) Fields: - user: User - errors: [OperationError!]! ### CreateWaitlistSetupIntentResult (OBJECT) Fields: - setupIntent: WaitlistSetupIntent - errors: [OperationError!]! ### CreateWebhookEndpointResult (OBJECT) Fields: - webhookEndpoint: WebhookEndpoint - errors: [OperationError!]! ### DashboardCard (OBJECT) One analytics card on the business Reports dashboard. The array order of `BusinessViewerAccess.reportsDashboardLayout` is the display order. Fields: - kind: DashboardCardKind! - visible: Boolean! - config: DashboardCardConfig — Per-card configuration. Only the options a card kind supports are ### DashboardCardConfig (OBJECT) Constrained per-card configuration. Today only `topN` (for the ranked breakdown cards); extensible with chart type / window / metric behind the same server-side validation. Fields: - topN: Int — Rows a ranked breakdown card shows. Clamped to [1, 20]. Null for cards ### DashboardCardConfigInput (INPUT_OBJECT) Input form of `DashboardCardConfig`. Input fields: - topN: Int ### DashboardCardInput (INPUT_OBJECT) Input form of `DashboardCard` for `Mutation.updateReportsDashboardLayout`. Input fields: - kind: DashboardCardKind! - visible: Boolean! - config: DashboardCardConfigInput ### DashboardCardKind (ENUM) The analytics cards on the business Reports dashboard, each draggable and hideable. Mirrors the `ReportChartSlice` export enum (same nine charts). Values: - revenue - participants - topActivities - topInstructors - topLocations - busiestDays - busiestTimes - attendance - heatmap ### DashboardView (OBJECT) A saved Reports-dashboard view: a named snapshot of the page filter + layout the viewer can re-apply. Fields: - id: ID! - name: String! - snapshot: DashboardViewSnapshot! ### DashboardViewSnapshot (OBJECT) The captured state of a saved view. Entity ids are GraphQL GlobalIDs so they re-apply verbatim; `start`/`end` are `YYYY-MM-DD` (null = default window). `cards` is the full ordered card layout. Fields: - start: String - end: String - staff: [ID!]! - location: [ID!]! - activity: [ID!]! - activityType: [ActivityType!]! - cards: [DashboardCard!]! ### DashboardViewSnapshotInput (INPUT_OBJECT) Input form of `DashboardViewSnapshot` for `Mutation.saveDashboardView`. Input fields: - start: String - end: String - staff: [ID!] - location: [ID!] - activity: [ID!] - activityType: [ActivityType!] - cards: [DashboardCardInput!]! ### DateRangeInput (INPUT_OBJECT) Inclusive date-time range used for cross-location report roll-ups. Input fields: - from: DateTime! - to: DateTime! ### DateTime (SCALAR) An ISO 8601 date-time string (e.g. `"2026-03-27T14:30:00.000Z"`). ### DayOfWeek (ENUM) Values: - monday - tuesday - wednesday - thursday - friday - saturday - sunday ### DebugMode (OBJECT) Debug-mode claim carried on the auth JWT. Present once `?debug=<jwt>` has unlocked debug mode. Reading returns `null` outside of debug mode. Fields: - previewBranch: String — The preview branch that non-static requests should route to. Null when ### DeleteAccountResult (OBJECT) Fields: - ok: Boolean! - errors: [OperationError!]! ### DeleteActivityResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteBroadcastResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteBusinessAccountResult (OBJECT) Fields: - ok: Boolean! - errors: [OperationError!]! ### DeleteBusinessRoleResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteChallengeResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteClientNoteResult (OBJECT) Fields: - deletedId: ID - errors: [OperationError!]! ### DeleteDashboardViewResult (OBJECT) Result of `Mutation.deleteDashboardView`. Returns the refreshed business so `viewer.dashboardViews` reflects the removal. Fields: - business: Business - errors: [OperationError!]! ### DeleteFacilityResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteFamilyInviteResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteFamilyMemberResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteGiftCardResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteJourneyResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteLocationResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteMarketingSegmentResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteMembershipResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteMetadataResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteOrganizationRoleResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteParticipantResult (OBJECT) Fields: - errors: [OperationError!]! ### DeletePasskeyResult (OBJECT) Fields: - errors: [OperationError!]! ### DeletePassResult (OBJECT) Fields: - errors: [OperationError!]! ### DeletePhysicalProductResult (OBJECT) Fields: - errors: [OperationError!]! ### DeletePricingRuleResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteReviewResult (OBJECT) Fields: - deletedReviewId: ID — Id of the deleted review, echoed back so clients can evict it from - errors: [OperationError!]! ### DeleteStaffMemberResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteTeamResult (OBJECT) Fields: - errors: [OperationError!]! ### DeleteWebhookEndpointResult (OBJECT) Fields: - errors: [OperationError!]! ### DiscountCode (OBJECT) A code a customer types at checkout to lower the price of a product or activity registration. Codes are scoped to one business. Applies either a fixed-cents discount (`type: fixedAmount`, `fixedAmountCents` set), a percentage discount (`type: percentage`, `percentOff` set), or makes the line zero (`type: free`). Optional date window, usage caps, eligibility conditions, and item restrictions limit when and where the code applies. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this discount. Consume instead of building - code: String! - name: String — Optional admin-facing label (e.g. "Spring 2026 promo"). Not shown to - type: DiscountCodeType! - fixedAmountCents: Int — Cents to subtract from the line. Non-null when `type` is `fixedAmount`, - percentOff: Int — Percent to subtract from the line, from 1 to 100. Non-null when `type` - status: DiscountCodeStatus! — Lifecycle state of the code: - archivedAt: DateTime — When the code was last archived. Set whenever `status` transitions to - startsAt: DateTime - endsAt: DateTime - maxUses: Int — Total redemptions allowed across all customers. Null = unlimited. - maxUsesPerUser: Int — Redemptions allowed per customer. Null = unlimited. - conditions: [DiscountCodeCondition!]! - itemRestrictions: [DiscountCodeItemRestriction!]! — Items the code applies to. Empty list means it applies to every product - redemptions: [DiscountCodeRedemption!]! - redemptionCount: Int! — Number of redemptions counted against `maxUses`. Excludes redemptions - totalDiscountedCents: Int! — Sum of `amountAppliedCents` across all non-cancelled redemptions. Useful - createdAt: DateTime! ### DiscountCodeCondition (OBJECT) A single eligibility condition. All conditions on a code must be satisfied for the code to apply (AND logic), mirroring `PricingRuleCondition`. Fields: - id: ID! - type: DiscountCodeConditionType! - reference: DiscountCodeConditionReference — The product the user must have an active purchase of. Set only for - minimumClassesAttended: Int — Required count of attended classes (registrations with status ### DiscountCodeConditionInput (INPUT_OBJECT) Eligibility condition for a discount code. Exactly one variant must be provided. Enforced at runtime by the GraphQL server (`@oneOf`). Input fields: - hasActiveProduct: HasActiveProductConditionInput — The redeeming participant must currently own this product (active - hasAnyActiveMembership: Boolean — The redeeming participant must currently own at least one membership - hasMinimumClassesAttended: Int — The redeeming participant must have attended at least this many classes ### DiscountCodeConditionReference (UNION) Members: Pass, Membership, GiftCard, PhysicalProduct ### DiscountCodeConditionType (ENUM) Values: - hasActiveProduct - hasAnyActiveMembership - hasMinimumClassesAttended ### DiscountCodeConnection (OBJECT) Cursor-paginated list of discount codes for a business. Fields: - edges: [DiscountCodeEdge!]! - nodes: [DiscountCode!]! - pageInfo: PageInfo! - totalCount: Int! ### DiscountCodeEdge (OBJECT) Fields: - cursor: String! - node: DiscountCode! ### DiscountCodeItem (UNION) Members: Pass, Membership, GiftCard, PhysicalProduct, Activity ### DiscountCodeItemRestriction (OBJECT) Fields: - id: ID! - item: DiscountCodeItem! ### DiscountCodeItemRestrictionInput (INPUT_OBJECT) Item the discount code applies to. Exactly one variant must be provided per restriction; multiple restrictions on the same code are joined by OR. Enforced at runtime by the GraphQL server (`@oneOf`). Input fields: - pass: EntityRef - membership: EntityRef - giftCard: EntityRef - physicalProduct: EntityRef - activity: EntityRef ### DiscountCodeRedemption (OBJECT) One row per successful redemption. `productPurchase` and `activityRegistration` are mutually exclusive — exactly one is non-null, identifying what the code was applied to. Fields: - id: ID! - discountCode: DiscountCode! - participant: Participant! - amountAppliedCents: Int! - productPurchase: ProductPurchase - activityRegistration: ActivityRegistration - redeemedAt: DateTime! - cancelledAt: DateTime — Set when the parent purchase or registration was cancelled, after which ### DiscountCodeStatus (ENUM) Values: - active - inactive - archived ### DiscountCodeType (ENUM) Values: - fixedAmount - percentage - free ### DismissOnboardingMilestoneResult (OBJECT) Result of dismissing or restoring an onboarding milestone suggestion. Returns the refreshed business so the caller can read the updated `viewer.dismissedOnboardingMilestones`. Fields: - business: Business - errors: [OperationError!]! ### DisputeMatchResult (OBJECT) Fields: - session: ActivitySession - errors: [OperationError!]! ### Division (OBJECT) Fields: - id: ID! - name: String! - registration: RegistrationConfiguration! - spotsAvailable: Int - isFull: Boolean! - waitlistCount: Int! — Number of teams currently waitlisted for this division. - teams: [Team!]! - standings: [StandingsEntry!]! - createdAt: DateTime! ### DivisionInput (INPUT_OBJECT) Input fields: - name: String! - registration: RegistrationConfigurationInput ### DivisionTeamStatus (ENUM) Values: - confirmed - waitlisted - offered ### DraftActivityResult (OBJECT) The result of `draftActivityFromDescription` — an AI-generated draft the client maps onto the create-activity form for the user to review and submit. The draft is never persisted; only the subsequent `createActivity` writes anything. Fields: - draft: ActivityDraft - errors: [OperationError!]! ### DraftLeagueScheduleResult (OBJECT) Fields: - schedule: LeagueScheduleDraft - errors: [OperationError!]! ### DuplicateActivitySessionInput (INPUT_OBJECT) The admin's edits to a duplicated activity's single session, captured in the duplicate confirm sheet. Mirrors the editable fields of the multi-session "Duplicate session" flow. See `Mutation.duplicateActivity`. Input fields: - startAt: DateTime — New start instant for the copy's session (ISO 8601). - duration: Int — Session length in minutes; sets the copy session's end relative to `startAt`. - location: EntityRef — Location to carry onto the copy's session, or null to clear it. - staff: [StaffAssignmentInput!] — Staff roster for the copy's session, replacing the source's. ### Duration (OBJECT) Fields: - value: Int! - unit: DurationUnit! ### DurationInput (INPUT_OBJECT) Input fields: - value: Int! - unit: DurationUnit! ### DurationUnit (ENUM) Values: - minutes - hours - days - weeks - months - years ### EditMatchScoreResult (OBJECT) Fields: - session: ActivitySession - errors: [OperationError!]! ### EmailDispatch (OBJECT) Audit-log entry recording one transactional email Sessions sent on behalf of a participant. `resources` carries the typed domain rows the email referenced — clients write per-type fragment selections against `EmailDispatchResource` to pick just the fields they need. Fields: - id: ID! - sentAt: DateTime! - emailType: String! — Stable identifier per template, e.g. `"registrationConfirmation"`, - subject: String! - toAddress: String! - fromAddress: String! - resources: [EmailDispatchResource!]! — Domain rows the email referenced. Client writes fragment selections ### EmailDispatchConnection (OBJECT) Fields: - edges: [EmailDispatchEdge!]! - nodes: [EmailDispatch!]! - pageInfo: PageInfo! - totalCount: Int! ### EmailDispatchEdge (OBJECT) Fields: - cursor: String! - node: EmailDispatch! ### EmailDispatchFilter (INPUT_OBJECT) Filter applied to a paginated `EmailDispatchConnection`. All fields are optional and combine with `AND` semantics — `emailType` matches any of the supplied template identifiers, `sentAfter` / `sentBefore` clamp the sent-at window, and `query` is a case-insensitive substring match against the subject line and recipient address. Input fields: - emailType: [String!] — Stable template identifiers to include (e.g. `"registrationConfirmation"`, - sentAfter: DateTime — Lower bound on `sentAt`. Accepts an ISO-8601 date or datetime. Dates - sentBefore: DateTime — Upper bound on `sentAt`. Accepts an ISO-8601 date or datetime. Dates - query: String — Substring match against the subject and recipient address, ### EmailDispatchResource (UNION) Typed union of every domain row an `EmailDispatch` can reference. Add new members here as new email helpers reference new types. The resolver dispatches off the stored GID prefix, so adding a member also requires wiring the binding in `apps/web/server/graphql/bindings/email-dispatch.ts`. Members: Activity, ActivityRegistration, ActivitySession, Business, BusinessInvite, Organization, OrganizationInvite, Passkey, Payment, ProductPurchase, Team, TeamInvite, User ### EmailMarketingConsentAction (ENUM) Whether a {@link Mutation.recordParticipantEmailMarketingConsent} call grants or withdraws consent. Values: - grant - withdraw ### EmailMarketingConsentSource (ENUM) Where an email-marketing consent change originated. Values: - registration — Captured on an activity registration form. - productPurchase — Captured at product checkout. - businessAdmin — Recorded by staff on the participant's behalf. - participant — Changed by the participant themselves from their account. ### EmailMarketingConsentStatus (ENUM) Resulting state of a participant's email-marketing consent. `granted` means they affirmatively opted in; `withdrawn` means a prior consent was revoked. The absence of a status (null on {@link ParticipantEmailMarketingConsent.status}) means they were never asked — deliberately distinct from `withdrawn`. Values: - granted - withdrawn ### EmailMarketingRegistrationBlock (OBJECT) An optional email-marketing opt-in placed into a registration form by the business. Renders the standardized, compliant opt-in (unchecked, never gates submission). The shown disclosure — and the exact text frozen into the consent ledger — is built from the business's name + mailing address + this block's `descriptor` + the participant's locale. Honoured only when the business has email-marketing collection enabled (the master switch); otherwise inert. Fields: - descriptor(locale: Locale): String — Business-authored description of what subscribers receive, woven into the - descriptorTranslations: [Translation!]! — All available translations for the descriptor field. ### EmailMarketingRegistrationBlockInput (INPUT_OBJECT) Input fields: - descriptor: [TranslatedStringInput!] — Optional per-block description of what subscribers receive. Frozen into the ### EmergencyContact (OBJECT) An emergency contact for a person. Fields: - id: ID! - name: String! - phone: String! - relationship: String - isPrimary: Boolean! ### EmergencyContactInput (INPUT_OBJECT) Input fields: - name: String! - phone: String! - relationship: String - isPrimary: Boolean ### EntityRef (INPUT_OBJECT) Input fields: - id: ID! ### Facility (OBJECT) A named sub-space within a `Location` — e.g. a room, court, or studio. A facility inherits its address from the parent `location` and adds a name plus optional `instructions`. Its `booking` / `bookableSpots` override the location's when configured on the facility, and otherwise inherit from the location. Sessions can target a facility directly (see `ActivitySession.facility`). Fields: - id: ID! - business: Business! - location: Location! - name: String! - instructions: String — Optional free-text instructions specific to this facility (e.g. "Enter via - booking: Booking! — Effective booking status and capacity — the facility's own configuration - bookableSpots: BookingSpots — Effective bookable-spot layout — the facility's own layout when configured, - sessions(starting: ActivitySessionsStarting, sort: ActivitySessionSort, first: Int, includeAppointments: Boolean, source: [ActivitySessionSource!]): [ActivitySession!]! — Activity sessions taking place in this facility. Sort defaults to ### FacilityCreateInput (INPUT_OBJECT) Input form of a new `Facility`. A facility always belongs to a `location`, from which it inherits its address. Input fields: - location: ID! - name: String! - instructions: String - booking: BookingInput - bookableSpots: BookingSpotsInput ### Family (OBJECT) A household grouping people who manage activities together — a parent plus the children they enrol, and optionally co-guardians. A person (especially a child in shared custody) may belong to more than one family. Fields: - id: ID! - name: String — Optional household name; clients fall back to a derived label. - members: [FamilyMember!]! — All non-removed members of this family. - pendingInvites: [FamilyInvite!]! — Pending co-guardian invitations for this family (newest first). Empty once - createdAt: DateTime! ### FamilyInvite (OBJECT) An email invitation for another adult to join a family as a manager or guardian. Fields: - id: ID! - email: String! - role: FamilyRole! - status: FamilyInviteStatus! - familyName: String — The household name the invitee is being asked to join. - invitedBy: User — The adult who sent the invitation. - expiresAt: DateTime - createdAt: DateTime! ### FamilyInviteResult (OBJECT) Fields: - invite: FamilyInvite - errors: [OperationError!]! ### FamilyInviteStatus (ENUM) Values: - pending - accepted - declined ### FamilyMember (OBJECT) A person's membership in a `Family`, with their role. A `child` member is a managed account with no login (until "graduated"); `manager` and `guardian` are adults who can book and sign on a child's behalf. Fields: - id: ID! - role: FamilyRole! - user: User! — The underlying account for this member. - dateOfBirth: String — The member's date of birth as an ISO 8601 calendar date - age: Int — Whole-years age derived from `dateOfBirth`, or null if unknown. - healthProfile: HealthProfile — Per-person medical profile (allergies, conditions, medications, - consents: [Consent!]! — Consents recorded on this member's behalf. - emergencyContacts: [EmergencyContact!]! — Emergency contacts for this member. - canGraduate: Boolean! — Whether a guardian can graduate this member to their own login: true ### FamilyMemberResult (OBJECT) Fields: - member: FamilyMember - errors: [OperationError!]! ### FamilyMemberUpdateInput (INPUT_OBJECT) Input fields: - name: String - dateOfBirth: String — ISO 8601 calendar date (`YYYY-MM-DD`). ### FamilyResult (OBJECT) Fields: - family: Family - errors: [OperationError!]! ### FamilyRole (ENUM) Role of a person within a `Family`. Values: - manager — Billing/admin adult who created the family. - guardian — Another adult who can book and sign on a child's behalf. - child — A managed minor with no login of their own. ### FavoriteTargetInput (INPUT_OBJECT) Target for a favorite operation. Exactly one of `business`, `staff`, or `activity` must be provided — the mutation dispatches based on which field is set. Input fields: - business: EntityRef - staff: EntityRef - activity: EntityRef ### Feature (ENUM) A platform feature flag. Flag *definitions* live in code (the developer-owned registry); only the operator can flip per-subject overrides from the internal admin. Each value gates an opt-in capability that may be hidden for a launch and revealed later. Values: - leagues — League & team functionality — league activities, divisions, team - appointments — Appointment booking — per-resource availability schedules (staff, - familyAccounts — Family & child accounts — households with managed child profiles, - clientRecords — Client records — practitioner-authored per-client notes / visit history - whiteLabelApps — White-label apps — the Apps channel where a business configures and ### FeatureFlagKind (ENUM) How a feature flag's value is interpreted. `boolean` flags are simple on/off toggles (variants `"off"` / `"on"`); `variant` flags are multi-state (e.g. A/B tests) with their own set of allowed values. Values: - boolean - variant ### FeatureFlagSetting (OBJECT) The state of a single feature flag for one subject (a business or user), as seen by the internal admin. Combines the coded default with any explicit override so the admin UI can render the right control (a toggle for boolean flags, a variant picker for multi-state ones). Fields: - flag: Feature! — The flag this setting describes. - description: String! — Human-readable description of what the flag gates, from the code registry. - kind: FeatureFlagKind! — Whether this flag is a boolean toggle or a multi-state variant flag — - variants: [String!]! — The values this flag may take. Boolean flags expose `["off", "on"]`; - default: String! — The flag's coded default value when no override is set (a member of - override: String — The explicit override value for this subject (a member of `variants`), or - effective: String! — The resolved value — `override` when set, otherwise `default`. ### FinishPasskeyResult (OBJECT) Fields: - passkey: Passkey - errors: [OperationError!]! ### Float (SCALAR) The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). ### FulfillProductPurchaseResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### GameRules (OBJECT) Fields: - winAt: Int - winBy: Int! - maximum: Int - serviceScoring: ServiceScoring! - serviceRotation: ServiceRotation! ### GameRulesInput (INPUT_OBJECT) Input fields: - winAt: Int - winBy: Int! - maximum: Int - serviceScoring: ServiceScoring! - serviceRotation: ServiceRotation! ### GeneratePurchasesExportInput (INPUT_OBJECT) Input fields: - search: String — Case-insensitive substring match against product or business name. - productTypes: [ProductType!] — Limit to these product types. - businesses: [ID!] — Limit to purchases from these businesses. ### GenerateSessionsExportInput (INPUT_OBJECT) Input fields: - time: ActivityRegistrationTimeFilter — Which slice of the schedule to include. Defaults to `all`. - businesses: [ID!] — Limit to these businesses. - business: ID — Scope the export to a single business. - activityTypes: [ActivityType!] — Limit to these activity types. - search: String — Case-insensitive substring match against activity, business, or instructor name. ### GenerateUserExportResult (OBJECT) Fields: - export: UserExport - errors: [OperationError!]! ### GeocodeSuggestion (OBJECT) A physical location belonging to a business. Multiple locations can share the same address (e.g. different rooms in the same building). Fields: - address: String! - addressStreet: String - addressCity: String - addressRegion: String - addressPostalCode: String - addressCountry: String - latitude: Float! - longitude: Float! ### GeoPointInput (INPUT_OBJECT) A geographic point plus optional country used to bias and filter the public discovery feed toward a viewer's location. All fields are optional; omit `near` entirely to fall back to the request's inferred location server-side. Input fields: - latitude: Float - longitude: Float - country: String — ISO 3166-1 alpha-2 country code (e.g. `CA`). ### GiftCard (OBJECT) A gift card offered by a business. The face value is the product price. When purchased, the buyer receives a unique code that can be redeemed. Fields: - id: ID! - business: Business! - url: ResourceUrl! - name: String - description: String - featuredImage: Image - media: [Image!]! - price: Int! - visibility: ProductVisibility! - sale: ProductSalePeriod! - purchaseRules: ProductPurchaseRules! - pricingRules: [PricingRule!]! - effectivePrice: Int! - taxCode: String - sortOrder: Int! - createdAt: DateTime! - recentPurchases(limit: Int): [ProductPurchase!]! - purchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! - weeklyPurchases(weeks: Int): [ProductPurchasesInWeek!]! - purchasePageBlocks: [PurchasePageBlock!]! — Ordered list of configurable blocks rendered on this product's purchase - metadata(name: String!): String — First value of the named metadata key, or null. Accepts the `$.` alias. - metadataValues(name: String!): [String!]! — All values stored for the named metadata key, in order. - metadataEntries: [MetadataEntry!]! — All metadata stored on this product, one entry per key. - stripeSync: ProductStripeSync! — Sync state for the corresponding Stripe Product / Price on the platform ### GiftCardLedgerEntry (OBJECT) An entry in a gift card's append-only balance ledger. Negative `amountCents` is a debit (redemption); positive is a refund or admin adjustment. The card's `balanceRemaining` is the gift card's face value plus the sum of all ledger entries. Fields: - id: ID! - amountCents: Int! - reason: GiftCardLedgerReason! - paymentSplit: PaymentSplit — The split this entry corresponds to. Set only when `reason` is - refundOfLedgerEntry: GiftCardLedgerEntry — The original debit being reversed by this refund. Set only when - note: String - createdAt: DateTime! - createdBy: User ### GiftCardLedgerReason (ENUM) Values: - redemption - refund - adjustment ### GiftCardPaymentOption (OBJECT) A payment option backed by a gift card with sufficient balance. Fields: - purchase: ProductPurchase! - giftCard: GiftCard! ### GiftCardRegistrationPayment (OBJECT) Fields: - purchase: ProductPurchase! - giftCard: GiftCard! - payment: Payment — Payment row backing the gift-card redemption — present whenever ### GuestRegistrationInput (INPUT_OBJECT) Identifies the guest being registered. The booker (the caller of `registerForActivity`) is recorded as the payer; the guest is the attendee. Email is required so we can reach the guest with the registration confirmation; name is optional and defaults to the email prefix when omitted (matching `createUser` behavior). Input fields: - email: String! - name: String ### HasActiveProductConditionInput (INPUT_OBJECT) Input fields: - reference: EntityRef! ### HealthProfile (OBJECT) Per-person medical profile, surfaced to a business only for an active registration. Fields: - id: ID! - allergies: String - medicalConditions: String - medications: String - dietaryRestrictions: String - notes: String - updatedAt: DateTime! ### HealthProfileInput (INPUT_OBJECT) Input fields: - allergies: String - medicalConditions: String - medications: String - dietaryRestrictions: String - notes: String ### HomePageBlock (OBJECT) One entry in a business's configurable home-page blocks. Order in the `homePageBlocks` list is the display order. Fields: - kind: HomePageBlockKind! - visible: Boolean! - staffIds: [ID!]! — For the `booking` block only: the staff members (`BusinessStaff` IDs) ### HomePageBlockInput (INPUT_OBJECT) One entry in a home-page blocks patch. Order in the list is display order. Input fields: - kind: HomePageBlockKind! - visible: Boolean! - staffIds: [ID!] — For the `booking` block only: the staff members (`BusinessStaff` IDs) ### HomePageBlockKind (ENUM) A built-in block on the public business home page. New kinds are added as blocks are built. Values: - hero - schedule - reviews - booking ### ID (SCALAR) The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. ### Image (OBJECT) An uploaded image stored in R2, with pre-computed dimensions and thumbhash. Fields: - id: ID! - url(width: Int, height: Int): String! — Absolute URL for this image. Pass `width` and/or `height` to get a - filename: String! - contentType: String! - width: Int! - height: Int! - aspectRatio: Float! — Source image width divided by height. Useful for reserving layout - thumbhash: String — Base64-encoded ThumbHash for instant blurred placeholders. ### InferredLocation (OBJECT) Best-guess geolocation for the current request, inferred from Cloudflare's edge geo-IP. Every field is nullable — coarse and spoofable (a VPN/proxy resolves to the exit node), so treat it as a hint, never authoritative. Used to prefill optional location fields like the create-business country. Fields: - country: String — ISO 3166-1 alpha-2 country code (e.g. `CA`), or null. - region: String — ISO 3166-2 region code (e.g. `ON`) or region name, or null. - city: String ### Int (SCALAR) The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. ### IntervalUnit (ENUM) Values: - day - week - month ### InviteToBusinessResult (OBJECT) Fields: - businessInvite: BusinessInvite - errors: [OperationError!]! ### InviteToOrganizationResult (OBJECT) Fields: - organizationInvite: OrganizationInvite - errors: [OperationError!]! ### Journey (OBJECT) A custom marketing automation: a trigger plus an ordered, linear list of steps the runner walks per enrolled participant. Consent, suppression, and frequency rules are enforced by the runner at send time. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this journey. Consume instead of building - name: String! - description: String - status: JourneyStatus! - triggerType: JourneyTriggerType! - triggerEventType: String — For `event` triggers, the catalog key being matched (e.g. - reentryPolicy: JourneyReentryPolicy! - steps: [JourneyStep!]! — The journey's steps in run order (ascending position). - enrollmentCounts: JourneyEnrollmentCounts! — Participant enrolment counts bucketed by status. - createdAt: DateTime! - updatedAt: DateTime! ### JourneyConnection (OBJECT) Fields: - edges: [JourneyEdge!]! - nodes: [Journey!]! - pageInfo: PageInfo! - totalCount: Int! ### JourneyEdge (OBJECT) Fields: - cursor: String! - node: Journey! ### JourneyEnrollmentCounts (OBJECT) Counts of a journey's participant enrolments by status. Each bucket defaults to 0 when no enrolment is in that state. Fields: - active: Int! - completed: Int! - exited: Int! - canceled: Int! ### JourneyReentryPolicy (ENUM) Whether a participant who already ran through a journey may enter again. `once` = at most one enrolment ever; `reEnroll` = may re-enter once a prior enrolment has ended. Values: - once - reEnroll ### JourneyStatus (ENUM) Lifecycle of a journey. `active` is live and enrolling; `paused` halts enrolment + the runner without losing state; `archived` is retired. Values: - draft - active - paused - archived ### JourneyStep (OBJECT) One ordered action within a journey. v1 advances strictly by ascending `position`. The type-specific fields are populated only for the relevant `type` (e.g. `waitSeconds` for `wait`, `emailSubject`/`emailBody` for `sendEmail`). Fields: - id: ID! - position: Int! - type: JourneyStepType! - waitSeconds: Int — For `wait` steps, the delay before the next step runs, in seconds. - emailSubject: String — For `sendEmail` steps, the email subject line. - emailBody: String — For `sendEmail` steps, the body (plain text / markdown, like a broadcast). ### JourneyStepInput (INPUT_OBJECT) One step in a journey's ordered list. `type` selects which of the optional fields apply: `waitSeconds` for `wait`, `emailSubject` + `emailBody` for `sendEmail`. v1 authors `wait`, `sendEmail`, and `exit`. Input fields: - type: JourneyStepType! - waitSeconds: Int - emailSubject: String - emailBody: String ### JourneyStepType (ENUM) The kind of action a journey step performs. v1 authors `wait`, `sendEmail`, and `exit`; the remaining kinds are reserved for later releases. Values: - wait - sendEmail - condition - tag - callWebhook - exit ### JourneyTriggerType (ENUM) What starts an enrolment. `event` matches a domain event by key; `segmentEntry` enrols on segment membership; `schedule` is a date-relative rule evaluated by the cron runner. Values: - event - segmentEntry - schedule ### JSONPath (SCALAR) A JSON path selector, as specified by [RFC 9535](https://datatracker.ietf.org/doc/html/rfc9535). @example "$.credential" @example "$.matches[0].homeTeam" @see https://datatracker.ietf.org/doc/html/rfc9535 ### LeagueRules (OBJECT) Fields: - winAt: Int - winBy: Int! - setRules: SetRules! ### LeagueRulesInput (INPUT_OBJECT) Input fields: - winAt: Int - winBy: Int! - setRules: SetRulesInput! ### LeagueScheduleDraft (OBJECT) A proposed league schedule produced by `draftLeagueSchedule`. Not persisted — the client reviews it, then replays `createActivitySession` (one session per matchup, with its two competitors) to commit the matches it wants. Fields: - sessions: [LeagueScheduleDraftSession!]! - assumptions: [String!]! — Notes on choices the generator made (cadence, byes, rematches). ### LeagueScheduleDraftMatchup (OBJECT) Fields: - homeTeam: LeagueScheduleDraftTeam! - awayTeam: LeagueScheduleDraftTeam! ### LeagueScheduleDraftSession (OBJECT) Fields: - date: String — Proposed session date as YYYY-MM-DD, or null if the model omitted it. - label: String — Optional short round label, e.g. "Week 1". - matchups: [LeagueScheduleDraftMatchup!]! ### LeagueScheduleDraftTeam (OBJECT) A team referenced in a generated (not-yet-persisted) league schedule. Fields: - id: ID! - name: String! ### LeagueScoreEntryMode (ENUM) Per-activity confirmation behaviour for reported league match results. Values: - immediate - adminApproval ### Locale (SCALAR) A BCP 47 locale tag (e.g. "en", "fr", "fr-CA"). See https://www.rfc-editor.org/info/bcp47 ### Location (OBJECT) Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical pages for this location — the public `go` URL and the - name: String! - address: String! - addressStreet: String - addressLine2: String - addressCity: String - addressRegion: String — ISO 3166-2 region code (e.g. "ON", "NY"). - addressPostalCode: String - addressCountry: String — ISO 3166-1 alpha-2 country code (e.g. "CA", "US"). - latitude: Float - longitude: Float - booking: Booking! - bookableSpots: BookingSpots — Bookable-spot layout for this location, or null when no layout has been - activities: [Activity!]! - facilities: [Facility!]! — Named sub-spaces (rooms, courts, studios) within this location. Empty - sessions(starting: ActivitySessionsStarting, sort: ActivitySessionSort, first: Int, includeAppointments: Boolean, source: [ActivitySessionSource!]): [ActivitySession!]! — Activity sessions taking place at this location. Sort defaults to ### LocationConnection (OBJECT) Cursor-paginated list of locations for a business. Fields: - edges: [LocationEdge!]! - nodes: [Location!]! - pageInfo: PageInfo! - totalCount: Int! ### LocationCreateInput (INPUT_OBJECT) Input form of a new `Location`. Shared between `createLocation` and the `locations` seed on `createBusiness`. Input fields: - name: String! - address: String! - addressStreet: String - addressLine2: String - addressCity: String - addressRegion: String - addressPostalCode: String - addressCountry: String - latitude: Float - longitude: Float - booking: BookingInput - bookableSpots: BookingSpotsInput ### LocationEdge (OBJECT) Fields: - cursor: String! - node: Location! ### MapBox (OBJECT) Fields: - token: String! ### MarkBusinessMigrationImportedResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### MarketingSegment (OBJECT) A saved, named, consent-aware participant filter — the targeting unit for broadcasts and journey segment-entry triggers. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this segment. Consume instead of building - name: String! - description: String - definition: SegmentDefinition! - memberCount: Int! — Live count of participants currently matching this segment, with the - members(first: Int, after: String): ParticipantConnection! — Participants currently matching this segment, consent-gated, newest first. - createdAt: DateTime! - updatedAt: DateTime! ### MarketingSegmentConnection (OBJECT) Fields: - edges: [MarketingSegmentEdge!]! - nodes: [MarketingSegment!]! - pageInfo: PageInfo! - totalCount: Int! ### MarketingSegmentEdge (OBJECT) Fields: - cursor: String! - node: MarketingSegment! ### Match (OBJECT) Fields: - id: ID! - type: ActivityType! - startedAt: DateTime! - endedAt: DateTime - winner: MatchTeam — Null until the match has been played/scored — the "no result yet" state of a - sets: [MatchSet!]! - user: User - session: ActivitySession — The league session this match is played in (a session *is* one match), or - homeCompetitor: Competitor — The two competitors (a league fixture). Null for a casual match with no - awayCompetitor: Competitor - reviewStatus: MatchReviewStatus! - reportedBy: User — The user who submitted the current (reported/pending) result. - dispute: MatchDispute — The open dispute on this result, or null when not disputed. - url: ResourceUrl! ### MatchConnection (OBJECT) Cursor-paginated list of matches recorded by the viewer. Sort order is `startedAt DESC, id ASC` so the most recently played match appears first. Fields: - edges: [MatchEdge!]! - nodes: [Match!]! - pageInfo: PageInfo! - totalCount: Int! ### MatchDispute (OBJECT) Details of a contested match result, present only while disputed. Fields: - reason: String - by: User - at: DateTime ### MatchEdge (OBJECT) Fields: - cursor: String! - node: Match! ### MatchGame (OBJECT) Fields: - id: ID! - gameIndex: Int! - startedAt: DateTime! - endedAt: DateTime - scoreUs: Int! - scoreThem: Int! - winner: MatchTeam - scores: [MatchGameScore!]! — Per-rally cumulative scores. Empty for matches saved before this field was introduced. ### MatchGameInput (INPUT_OBJECT) Input fields: - startedAt: DateTime! - endedAt: DateTime - scoreUs: Int! - scoreThem: Int! - winner: MatchTeam - scores: [MatchGameScoreInput!] ### MatchGameScore (OBJECT) Cumulative score after a single rally. One entry per rally, in order. Flat steps (same score as previous entry) reflect sideouts in sideOut-scoring sports. Fields: - us: Int! - them: Int! ### MatchGameScoreInput (INPUT_OBJECT) Input fields: - us: Int! - them: Int! ### MatchReviewStatus (ENUM) Review state of a reported result: `none` (nothing pending), `pending` (awaiting admin approval under `adminApproval` scoring), `disputed` (a completed result was contested). A result counts in standings when the match has a `winner` and is not `pending`. Values: - none - pending - disputed ### MatchSet (OBJECT) Fields: - id: ID! - setIndex: Int! - startedAt: DateTime! - endedAt: DateTime - winner: MatchTeam - games: [MatchGame!]! ### MatchSetInput (INPUT_OBJECT) Input fields: - startedAt: DateTime! - endedAt: DateTime - winner: MatchTeam - games: [MatchGameInput!]! ### MatchTeam (ENUM) Values: - us - them ### MaterializeClassSessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### Me (OBJECT) Fields: - user: User! - accountDeletionPreview: AccountDeletionPreview! — Counts used by account settings before deleting the viewer's account. - passkeys: [Passkey!]! - sessions: [UserSession!]! — The viewer's active sign-in sessions, most-recently-used first. Viewer-owned. - teams: [Team!]! - businesses: [Business!]! - participatingBusinesses: [Business!]! — Businesses the viewer has a participant record with (has registered or - organizations: [Organization!]! — Organizations the current user staffs or owns. - purchases(first: Int, after: String): ProductPurchaseConnection! — Every product purchase owned by the viewer, across all the - availableProductsByBusiness: [BusinessAvailableProducts!]! - giftCards: [ProductPurchase!]! — Gift cards the current user owns with `balanceRemaining > 0` — either - registrations(first: Int, after: String, time: ActivityRegistrationTimeFilter, payment: ActivityRegistrationPaymentFilter, status: [ActivitySessionStatus!], businesses: [ID!], activityTypes: [ActivityType!], sort: ActivitySessionSort): ActivityRegistrationConnection! — Activity registrations that belong on the viewer's account schedule — - registrationBusinesses: [Business!]! — Businesses the viewer has at least one registration with — the stable - registrationActivityTypes: [ActivityType!]! — Activity types appearing across the viewer's registrations — the - challengeRegistrations(first: Int, after: String): ChallengeRegistrationConnection! — Challenge registrations that belong to the viewer through linked - registration(id: ID!): ActivityRegistration — Look up a single activity registration by ID. Returns null when the - calendar: CalendarUrl! - paymentMethods: [SavedPaymentMethod!]! — Saved Stripe `PaymentMethod`s attached to the viewer's customer - observer: User — If the current session was initiated by an admin observer, the admin user. - accountUrl: String! — URL for the user's account page, on the `accounts` subdomain. - internalAdmin: Boolean! — Whether the current user holds the `InternalPermission.Admin` flag — - features: [Feature!]! — User-scoped platform feature flags currently enabled for the viewer. - families: [Family!]! — Households the viewer belongs to (as a manager, guardian, or — in - managedChildren: [FamilyMember!]! — Every child the viewer manages, across all the families they're a ### Membership (OBJECT) A recurring membership offered by a business. Sessions reset or accumulate each billing period. Fields: - id: ID! - business: Business! - url: ResourceUrl! - name: String - description: String - featuredImage: Image - media: [Image!]! - price: Int! - visibility: ProductVisibility! - sale: ProductSalePeriod! - purchaseRules: ProductPurchaseRules! - pricingRules: [PricingRule!]! - effectivePrice: Int! - taxCode: String - sortOrder: Int! - createdAt: DateTime! - recentPurchases(limit: Int): [ProductPurchase!]! - purchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! - weeklyPurchases(weeks: Int): [ProductPurchasesInWeek!]! - purchasePageBlocks: [PurchasePageBlock!]! — Ordered list of configurable blocks rendered on this product's purchase - metadata(name: String!): String — First value of the named metadata key, or null. Accepts the `$.` alias. - metadataValues(name: String!): [String!]! — All values stored for the named metadata key, in order. - metadataEntries: [MetadataEntry!]! — All metadata stored on this product, one entry per key. - sessionCount: Int — Sessions granted per billing period. Null means the membership grants - billingCycle: BillingCycle! - minimumBillingIntervals: Int — Optional minimum commitment, as a number of billing intervals the member - sessionsAccumulate: Boolean! - renewalReminderEnabled: Boolean! — Whether members get an advance pre-renewal reminder email before each - renewalReminderLeadDays: Int — How many days before a renewal the reminder fires. Null falls back to a - guestSessionCount: Int! — Number of guest passes granted per billing period. Guest passes let a - guestSessionsAccumulate: Boolean! — Whether unused guest passes carry over across billing periods. - expiration: ProductExpiration — When the membership expires, either as a duration after purchase - activityScope: ProductActivityScope! — How this membership's activity coverage is scoped. - activityRules: [ProductActivityRule!]! — Per-activity rules: exclusions and per-activity credit-cost overrides. - clockStart: ClockStart! — When the membership's validity clock starts. With `firstSession`, the buyer - stripeSync: ProductStripeSync! — Sync state for the corresponding Stripe Product / recurring Price on the ### MembershipGuestPassPaymentOption (OBJECT) A payment option backed by an active membership purchase's guest-pass balance. Returned for guest registrations only, when the membership has guest passes remaining for the current billing period. Fields: - purchase: ProductPurchase! - membership: Membership! - creditCost: Int! — Guest-pass credits this activity consumes (the resolved `creditCost`, ### MembershipPaymentOption (OBJECT) A payment option backed by an active membership purchase, consumed against the member's own session balance. Returned for self registrations only. Fields: - purchase: ProductPurchase! - membership: Membership! - creditCost: Int! — Credits this activity consumes from the membership per session/increment ### MembershipRegistrationPayment (OBJECT) Fields: - purchase: ProductPurchase! - membership: Membership! ### MetadataEntry (OBJECT) A single named metadata field on an entity, with its ordered list of values. Scalar fields carry exactly one value. Fields: - name: String! - values: [String!]! ### MetadataFilterInput (INPUT_OBJECT) Matches entities that have any of `values` stored under metadata key `name`. Key accepts the `$.` shorthand for the `sessions.` namespace. Input fields: - name: String! - values: [String!]! ### MigrationSourcePlatform (ENUM) A competitor platform a business can be migrated away from. Selects the CSV mappers the import step uses and the branding shown on the claim page. Values: - mindbody - marianatek ### MonthlyMode (ENUM) Values: - dayOfMonth - nthWeekday ### MonthlyWeek (ENUM) Values: - first - second - third - fourth - fifth - last ### OAuthApp (OBJECT) A registered OAuth client's self-presentation, shown on the consent screen. Fields: - name: String! - logoUrl: URL — App icon URL, if the client registered one. - homepageUrl: URL — App homepage / marketing site, if registered. - description: String — One-line description of what the app does, if registered. ### OAuthConsentError (ENUM) Why a pending OAuth authorization request couldn't be shown for consent. Values: - unknownClient — The `client_id` doesn't match a registered, active client. - invalidRedirectUri — The `redirect_uri` isn't registered for this client. - invalidRequest — The request is malformed (unsupported `response_type` or PKCE method). - invalidScope — None of the requested scopes are grantable to this client. ### OAuthConsentRequest (OBJECT) Everything the consent screen needs to render a valid authorization request. Fields: - app: OAuthApp! — The app requesting access, as it presents itself. - scopes: [String!]! — The scope keys being requested (already intersected to what's grantable). - businesses: [Business!]! — Businesses the viewer may authorize the app against (the consent picker). ### OAuthConsentRequestResult (OBJECT) Result of {@link Query.oauthConsentRequest}: exactly one of `request` (valid) or `error` (rejected) is set. Fields: - request: OAuthConsentRequest - error: OAuthConsentError ### OnboardingMilestone (ENUM) A business-onboarding milestone surfaced on the home-page getting-started checklist. Completion is derived from live business state (see each entry's predicate on the client); this enum is the stable id space shared by the checklist, the celebratory milestone toasts, and the dismissal mutations. Values: - importFromLegacyPlatform - activityCreated - websiteCustomized - paymentsConfigured - productsConfigured - businessPublished - staffInvited - locationAdded - segmentCreated - broadcastSent ### OperationError (OBJECT) Fields: - field: JSONPath — The field in the input that caused the operation error. - message: String! ### Organization (OBJECT) A grouping of `Business` locations that share a single operator and cross-location reporting. Organizations are thin — they own child businesses, but customer-facing resources (schedules, Stripe, participants, memberships, passes) stay scoped to each business. Fields: - id: ID! - handle: String! — URL-safe handle used as the path prefix for the organization admin - name: String! - owner: User! — The single owner of this organization. Exactly one user per org — - businesses: [Business!]! — Child businesses of this organization, in creation order. - staffMembers: [OrganizationStaff!]! - invites: [OrganizationInvite!]! - roles: [OrganizationRole!]! — Reusable permission roles defined for this organization (active, - viewer: OrganizationViewerAccess! — The current user's effective access to this organization. Powers - billing: OrganizationBilling! — Consolidated platform-billing surface across this organization's child - brand: OrganizationBrand! — Brand configuration including icon and computed theming tokens. - localization: OrganizationLocalization! — Localization configuration. Anchors org-level calendar and reporting - createdAt: DateTime! - revenue(range: DateRangeInput!): Int! — Total revenue (in subunits) across all child businesses for the given - activitySessionsCount(range: DateRangeInput!): Int! — Total activity session count across all child businesses for the given - url: URL! — Admin URL for this organization on the business host ### OrganizationBilling (OBJECT) Consolidated platform-billing state across an organization's child businesses. Sessions subscriptions stay one-per-business (each location keeps its own plan, entitlements, and Stripe Connect payouts); this surface aggregates them and holds the organization's shared billing payment method, which can be applied to every location's subscription in one step. Fields: - subscriptions: [PlatformSubscription!]! — Platform subscriptions of the organization's child businesses (only - monthlyTotals: [OrganizationBillingTotal!]! — Effective monthly platform spend per billing currency, in subunits. - paymentMethod: PlatformSubscriptionPaymentMethod — Card on file at the organization level, or null when none has been ### OrganizationBillingTotal (OBJECT) Aggregated platform spend in one billing currency. Fields: - currency: PlatformCurrency! - amount: Int! — Effective monthly amount in currency subunits. ### OrganizationBrand (OBJECT) Organization brand configuration. Mirrors `BusinessBrand` exactly so the org admin gets the same controls as a business. Fields: - icon: Image - colorScheme: ColorScheme! - primaryColor: String — Convenience shortcut for the OKLCH string of `colors.surfaces.primary.background`. - accentColor: String — Convenience shortcut for the OKLCH string of `colors.accent.value`. - colors: BrandColors! - typography: BrandTypography! - radii: BrandRadiiScale! - spacing: BrandSpacingScale! - shadows: BrandShadowsScale! - components: BrandComponents! - theming: [ThemingToken!]! - integrationCss: String! ### OrganizationConnection (OBJECT) Cursor-paginated list of organizations. Fields: - edges: [OrganizationEdge!]! - nodes: [Organization!]! - pageInfo: PageInfo! - totalCount: Int! ### OrganizationEdge (OBJECT) Fields: - cursor: String! - node: Organization! ### OrganizationFilter (INPUT_OBJECT) Input fields: - query: String ### OrganizationInvite (OBJECT) Fields: - id: ID! - organization: Organization! - email: String! - status: OrganizationInviteStatus! - invitedBy: User - role: OrganizationRole — The role the invitee is assigned when they accept, or null for invites - createdAt: DateTime! ### OrganizationInviteStatus (ENUM) Values: - pending - accepted - declined ### OrganizationLocalization (OBJECT) Localization settings for an organization. Falls back to each child business's `BusinessLocalization` for business-scoped surfaces; this group covers org-level admin and reporting surfaces. Fields: - timezone: Timezone! — IANA timezone (e.g. `"America/Toronto"`) anchoring org-level calendar ### OrganizationRole (OBJECT) A reusable permission template for organization staff, mirroring `BusinessRole` at the organization tier: a named bundle of OrganizationPermission flags (what members may do on org-scoped surfaces) plus a BusinessPermission bitmask conferred on every child business of the organization. Editing a role updates the effective permissions of everyone who holds it (live RBAC, not a one-time copy). Fields: - id: ID! - organization: Organization! - name: String! - description: String - permissions: Int! — Combined bitmask of OrganizationPermission flags this role grants on - childBusinessPermissions: Int! — Combined bitmask of BusinessPermission flags this role confers on every - builtIn: Boolean! — True when this role was seeded from a built-in preset (e.g. Regional - staffCount: Int! — Number of staff members assigned this role. - staff: [OrganizationStaff!]! — Staff members assigned this role, ordered by name. - createdAt: DateTime! ### OrganizationRoleResult (OBJECT) Fields: - role: OrganizationRole - errors: [OperationError!]! ### OrganizationStaff (OBJECT) A staff member belonging to an organization. Effective permissions come from the assigned role (legacy rows without a role fall back to a stored bitmask). A role's child-business permissions govern what the member may do inside each child business — no `businessStaff` row is materialized for that inheritance. Fields: - id: ID! - organization: Organization! - user: User — Linked user account, or null for invite-only entries without login access. - name: String! - email: String - permissions: Int! — Effective (expanded) bitmask of OrganizationPermission flags, resolved - role: OrganizationRole — Assigned permission role, or null for legacy rows that still resolve from - isAdmin: Boolean! - canViewAllReports: Boolean! - createdAt: DateTime! ### OrganizationViewerAccess (OBJECT) The current user's effective access to an organization: their resolved permission bitmask plus convenience booleans for gating organization-admin navigation and actions on the client without re-deriving the bitmask. Fields: - permissions: Int! — Effective (expanded) bitmask of OrganizationPermission flags. - childBusinessPermissions: Int! — Effective (expanded) bitmask of BusinessPermission flags the viewer holds - isAdmin: Boolean! - canViewAllReports: Boolean! - canManageLocations: Boolean! - canManageStaff: Boolean! - canManageBrand: Boolean! - canManageBilling: Boolean! - canManageSettings: Boolean! ### PageInfo (OBJECT) Cursor pagination over a collection. `nodes` exposes the items directly for queries that only need the data; `edges` exposes a per-item `cursor` for queries that need to resume from a specific position. `pageInfo` describes the slice that was returned. Fields: - startCursor: String - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! ### Participant (OBJECT) A person known to a business — the primary entity for all business interactions. The optional `user` field links the participant to a real user account. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical pages for this participant — the public `go` URL and the - name: String! - email: String - user: User — Linked user account, or null for business-local participants. - teams(first: Int, after: String): TeamConnection! — Teams this participant belongs to. Cursor-paginated; default page size - registrations(first: Int, after: String, filter: ActivityRegistrationFilter, sort: ActivitySessionSort): ActivityRegistrationConnection! — Activity registrations for this participant. Cursor-paginated; default - registrationCount: Int! — Number of confirmed activity registrations for this participant. - challengeRegistrations(first: Int, after: String): ChallengeRegistrationConnection! — Challenge registrations for this participant, newest first. Includes - reviews: [Review!]! — Reviews this participant has written (about the business or its staff), - activeMemberships: [Membership!]! — Memberships with an active purchase for this participant. - activePasses: [Pass!]! — Passes with an active purchase for this participant. - activeGiftCards: [GiftCard!]! — Gift cards with an active purchase for this participant. - activeProductPurchases: [ProductPurchase!]! — All active product purchases for this participant, across memberships, - productPurchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! — Every product purchase for this participant regardless of status or - unfulfilledProductPurchases: [ProductPurchase!]! — Physical product purchases that have not yet been fulfilled (handed over - emailDispatches(first: Int, after: String, filter: EmailDispatchFilter): EmailDispatchConnection! — Transactional emails Sessions has dispatched on this participant's - emailMarketingConsent: ParticipantEmailMarketingConsent! — Current email-marketing consent state for this participant within this - emailConsentEvents(first: Int, after: String): ParticipantEmailConsentEventConnection! — Immutable history of every email-marketing consent change for this - metadata(name: String!): String — Returns the first value of the named metadata key, or null if not set. - metadataValues(name: String!): [String!]! — Returns every value stored for the named metadata key, in order. A scalar - metadataEntries: [MetadataEntry!]! — All metadata stored on this participant, one entry per key (each carrying - blockMetadata: [BlockMetadataEntry!]! — Structured block metadata persisted onto this participant by - clientNotes(first: Int, after: String): ClientNoteConnection! — Practitioner-authored client notes / visit history for this participant - createdAt: DateTime! ### ParticipantConnection (OBJECT) Cursor-paginated list of participants for a business. See `PageInfo` for pagination semantics. `totalCount` is computed only when selected. Fields: - edges: [ParticipantEdge!]! - nodes: [Participant!]! - pageInfo: PageInfo! - totalCount: Int! ### ParticipantDateRangeFilter (INPUT_OBJECT) Input fields: - start: String - end: String ### ParticipantEdge (OBJECT) Fields: - cursor: String! - node: Participant! ### ParticipantEmailConsentEvent (OBJECT) One immutable email-marketing consent change for a participant — the legal record of a single grant or withdrawal. Rows are never updated or deleted. Fields: - id: ID! - action: EmailMarketingConsentStatus! — Whether this event granted or withdrew consent. - source: EmailMarketingConsentSource! - disclosureText: String — The exact consent disclosure the participant was shown, snapshotted verbatim - disclosureVersion: ID — Version of the platform disclosure template that produced `disclosureText`. - disclosureLocale: String — BCP-47 locale the disclosure was shown in (e.g. `en`, `fr`). - recordedBy: User — Staff member who recorded an admin change; null for other sources. - recordedAt: DateTime! ### ParticipantEmailConsentEventConnection (OBJECT) Fields: - edges: [ParticipantEmailConsentEventEdge!]! - nodes: [ParticipantEmailConsentEvent!]! - pageInfo: PageInfo! - totalCount: Int! ### ParticipantEmailConsentEventEdge (OBJECT) Fields: - cursor: String! - node: ParticipantEmailConsentEvent! ### ParticipantEmailMarketingConsent (OBJECT) Current email-marketing consent for a participant within a business. A null `status` means the participant has never been asked (distinct from `withdrawn`). Fields: - status: EmailMarketingConsentStatus - at: DateTime — When `status` last changed; null if the participant was never asked. ### ParticipantFilter (INPUT_OBJECT) Filter applied to a paginated participant list. `query` matches the participant's name or email. `created` filters on the participant signup date; `lastActivity` filters on the latest confirmed session start time. Date ranges use `YYYY-MM-DD` strings interpreted in UTC; bounds are inclusive. Input fields: - query: String - created: ParticipantDateRangeFilter - lastActivity: ParticipantDateRangeFilter ### ParticipantsDayCount (OBJECT) Participant signups and confirmed registrations for a single local-business-timezone day. Fields: - date: String! — Local-business-timezone date as `YYYY-MM-DD`. - newParticipants: Int! — Count of `business_participants` rows whose `createdAt` falls on this - registrations: Int! — Count of `activity_registrations` rows with `status = confirmed` ### ParticipantSort (INPUT_OBJECT) Input fields: - field: ParticipantSortField - direction: ParticipantSortDirection ### ParticipantSortDirection (ENUM) Values: - asc - desc ### ParticipantSortField (ENUM) Values: - name - createdAt - registrationCount - lastActivityAt ### Pass (OBJECT) A session pass offered by a business. Grants registration for a fixed number of sessions, with an optional expiration window. Fields: - id: ID! - business: Business! - url: ResourceUrl! - name: String - description: String - featuredImage: Image - media: [Image!]! - price: Int! - visibility: ProductVisibility! - sale: ProductSalePeriod! - purchaseRules: ProductPurchaseRules! - pricingRules: [PricingRule!]! - effectivePrice: Int! - taxCode: String - sortOrder: Int! - createdAt: DateTime! - recentPurchases(limit: Int): [ProductPurchase!]! - purchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! - weeklyPurchases(weeks: Int): [ProductPurchasesInWeek!]! - purchasePageBlocks: [PurchasePageBlock!]! — Ordered list of configurable blocks rendered on this product's purchase - metadata(name: String!): String — First value of the named metadata key, or null. Accepts the `$.` alias. - metadataValues(name: String!): [String!]! — All values stored for the named metadata key, in order. - metadataEntries: [MetadataEntry!]! — All metadata stored on this product, one entry per key. - sessionCount: Int — Number of sessions the pass grants. Nullable for type-system parity - expiration: ProductExpiration — When the pass expires, either as a duration after purchase - activityScope: ProductActivityScope! — How this pass's activity coverage is scoped. - activityRules: [ProductActivityRule!]! — Per-activity rules: exclusions and per-activity credit-cost overrides. - clockStart: ClockStart! — When the pass's validity clock starts. With `firstSession`, a relative - stripeSync: ProductStripeSync! — Sync state for the corresponding Stripe Product / Price on the platform ### Passkey (OBJECT) Fields: - id: ID! - name: String - deviceLabel: String — Friendly label for the authenticator that registered this passkey - deviceKind: PasskeyDeviceKind — Coarse vendor classification used to pick a row icon. `null` when the - createdAt: DateTime! ### PasskeyDeviceKind (ENUM) Coarse classification of the authenticator that registered a passkey, derived from the WebAuthn AAGUID. Drives the per-row icon in account settings without leaking the raw AAGUID to the client. Values: - apple - google - microsoft - chrome - samsung - onePassword - bitwarden - dashlane - yubiKey ### PassPaymentOption (OBJECT) A payment option backed by an active pass purchase. Fields: - purchase: ProductPurchase! - pass: Pass! - creditCost: Int! — Credits this activity consumes from the pass per session/increment (the ### PassRegistrationPayment (OBJECT) Fields: - purchase: ProductPurchase! - pass: Pass! ### Payment (OBJECT) A payment processed through Stripe on behalf of a business. Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin transaction page for this payment. Consume instead of - participant: Participant! - stripeCustomerId: String — Stripe Customer ID for the buyer on the platform account. - card: CardPaymentDetails — Card details captured after a successful Stripe card payment. Null for - amount: Int! — Total charge amount in cents — includes `tax` when present. - platformFee: Int! — Platform fee collected by Sessions, in cents. - platformFeeBps: Int — Platform-fee rate in basis points (e.g. `600` = 6%) that was in - tax: Int — Tax portion of `amount` in cents. Null when the seller didn't have - taxBreakdown: [TaxBreakdownLine!]! — Per-jurisdiction tax breakdown. Empty list when `tax` is null or - currency: String! — ISO 4217 currency code, lowercase (e.g. `cad`). - status: PaymentStatus! - type: PaymentType! - createdAt: DateTime! ### PaymentConnection (OBJECT) Cursor-paginated list of payments for a business. Sort order is `createdAt DESC, id ASC` — most recent transactions surface first. Fields: - edges: [PaymentEdge!]! - nodes: [Payment!]! - pageInfo: PageInfo! - totalCount: Int! ### PaymentEdge (OBJECT) Fields: - cursor: String! - node: Payment! ### PaymentFilter (INPUT_OBJECT) Filter applied to `Business.payments`. All fields AND together. `query` matches the participant's name, email, the Stripe payment intent id, and the Stripe customer id (case-insensitive substring). `statuses` / `types` narrow to a set of `PaymentStatus` / `PaymentType` values; an omitted or empty array applies no filter. `start` / `end` are `YYYY-MM-DD` strings interpreted in UTC; bounds are inclusive on the `createdAt` column. Input fields: - query: String - statuses: [PaymentStatus!] - types: [PaymentType!] - start: String - end: String ### PaymentMethodSetupIntent (OBJECT) SetupIntent client secret for adding a saved card to the viewer's account from the Account → Payment methods surface. Reusable from any add-card flow (waitlist join, offer accept, future settings). Fields: - clientSecret: String! ### PaymentOption (UNION) One of the ways a user can pay for an activity session. Members: MembershipPaymentOption, MembershipGuestPassPaymentOption, PassPaymentOption, GiftCardPaymentOption, BuyPassPaymentOption, CardPaymentOption ### PaymentResolution (OBJECT) Resolved payment options for the current user and a specific activity session. Returns null when the user is not authenticated. Fields: - options: [PaymentOption!]! — Ordered list of payment options, best first. - price: Int! — Session price in cents. - covered: Boolean! — Whether at least one option fully covers the session price. ### PaymentSplit (OBJECT) A single funding source contributing to one product purchase or activity registration. A purchase with no gift card has one `stripe` split; a purchase split between a gift card and Stripe has one `giftCard` split plus one `stripe` split; a purchase fully paid by gift card has only a `giftCard` split. Fields: - id: ID! - source: PaymentSplitSource! - amountCents: Int! - payment: Payment — The Stripe payment that funded this split. Set only when - giftCardPurchase: ProductPurchase — The gift-card purchase whose balance funded this split. Set only when ### PaymentSplitSource (ENUM) Values: - stripe - giftCard ### PaymentStatus (ENUM) Values: - pending - succeeded - failed - refunded ### PaymentType (ENUM) Values: - passPurchase - registration - membership - item - giftCard - giftCardRedemption - physicalProduct - appointment ### PhysicalProduct (OBJECT) A physical product (merchandise, equipment, etc.) offered by a business. Has finite inventory and must be fulfilled by staff handing the item to the purchaser after payment. Fields: - id: ID! - business: Business! - url: ResourceUrl! - name: String - description: String - featuredImage: Image - media: [Image!]! - price: Int! - visibility: ProductVisibility! - sale: ProductSalePeriod! - purchaseRules: ProductPurchaseRules! - pricingRules: [PricingRule!]! - effectivePrice: Int! - taxCode: String - sortOrder: Int! - createdAt: DateTime! - recentPurchases(limit: Int): [ProductPurchase!]! - purchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! - weeklyPurchases(weeks: Int): [ProductPurchasesInWeek!]! - purchasePageBlocks: [PurchasePageBlock!]! — Ordered list of configurable blocks rendered on this product's purchase - metadata(name: String!): String — First value of the named metadata key, or null. Accepts the `$.` alias. - metadataValues(name: String!): [String!]! — All values stored for the named metadata key, in order. - metadataEntries: [MetadataEntry!]! — All metadata stored on this product, one entry per key. - inventory: Int — Current stock on hand. Null means inventory is untracked (unlimited). - allowOverselling: Boolean! — When true, purchases succeed even at zero inventory (inventory can go - fulfillmentInstructions: String — Free-form copy shown to buyers and staff describing how the product will - soldOut: Boolean! — Whether the product is currently unavailable because inventory is ### PlatformBillingInterval (ENUM) Billing cadence for a platform subscription. Annual plans bill the discounted yearly rate (ten months — two months free). Values: - month - year ### PlatformCurrency (ENUM) Currency a platform subscription is billed in. Chosen from the business's tax-origin country (US → USD, otherwise CAD). Values: - usd - cad ### PlatformSubscription (OBJECT) Sessions platform subscription for a business. Fields: - id: ID! - business: Business! - plan: PlatformSubscriptionPlan! - billingInterval: PlatformBillingInterval! - currency: PlatformCurrency! - status: PlatformSubscriptionStatus! - trialEndsAt: DateTime - billingPaymentMethodAttachedAt: DateTime - currentPeriodEnd: DateTime! - cancelAt: DateTime - createdAt: DateTime! - paymentMethod: PlatformSubscriptionPaymentMethod — Card on file with Stripe for this subscription's renewals. Null until a - invoices: [PlatformSubscriptionInvoice!]! — Invoices issued by Stripe for this subscription, most-recent first. - invoice(id: ID!): PlatformSubscriptionInvoice — Lookup a single invoice for this subscription. Used by the invoice detail ### PlatformSubscriptionInvoice (OBJECT) An invoice issued by Stripe Billing against the Sessions platform subscription. Fields: - id: ID! - number: String — Stripe's human-readable invoice number (e.g. `SES-0042`), null while the - status: PlatformSubscriptionInvoiceStatus! - total: Int! — The full invoice amount in currency subunits — the canonical "what this - amountDue: Int! - amountPaid: Int! - currency: String! — ISO 4217 currency code, lowercase. - createdAt: DateTime! - hostedInvoiceUrl: URL! — Stripe-hosted invoice page URL. Surfaced on internal admin views; not - pdfUrl: URL — Direct link to the Stripe-rendered PDF for this invoice. - lines: [PlatformSubscriptionInvoiceLine!]! — Per-line breakdown shown on the invoice detail page. ### PlatformSubscriptionInvoiceLine (OBJECT) A single line item on a platform subscription invoice. Fields: - id: ID! - description: String! - amount: Int! - currency: String! - periodStart: DateTime - periodEnd: DateTime ### PlatformSubscriptionInvoiceStatus (ENUM) Status of a Sessions platform invoice. Mirrors Stripe's invoice statuses. Values: - draft - open - paid - uncollectible - void ### PlatformSubscriptionPaymentMethod (OBJECT) Payment-method snapshot for the platform subscription. Mirrors what the `PaymentCardLabel` UI component needs to display a card row. Fields: - brand: String! - last4: String! - expiryMonth: Int! - expiryYear: Int! ### PlatformSubscriptionPlan (ENUM) Values: - start - grow - scale ### PlatformSubscriptionStatus (ENUM) Values: - active - pastDue - cancelled - unpaid - trialing ### PrepareSubscriptionBillingUpdateResult (OBJECT) Fields: - billingUpdate: SubscriptionBillingUpdate - purchase: ProductPurchase - errors: [OperationError!]! ### PreviewBranchPullRequest (OBJECT) GitHub pull request metadata resolved from a preview branch name. Fields: - number: Int! - title: String! - url: URL! ### PricingRule (OBJECT) A pricing rule attaches to a `subject` — either a `Product` (pass, membership, gift card) or an `Activity`. When the subject is an activity, `scope` distinguishes whether the rule applies to individual or team registrations. Fields: - id: ID! - subject: PricingRuleSubject! - scope: PricingRuleScope — Non-null when `subject` is an `Activity`; null otherwise. - price: Int! — The adjusted price in cents when this rule matches. - name: String - priority: Int! — Priority when multiple rules match. Lowest number wins. - active: Boolean! - conditions: [PricingRuleCondition!]! - createdAt: DateTime! ### PricingRuleCondition (OBJECT) Fields: - id: ID! - type: PricingRuleConditionType! - reference: PricingRuleConditionReference — The entity this condition references. For `hasActiveProduct`, this is ### PricingRuleConditionInput (INPUT_OBJECT) Input fields: - type: PricingRuleConditionType! - reference: EntityRef ### PricingRuleConditionReference (UNION) Members: Pass, Membership, GiftCard, PhysicalProduct ### PricingRuleConditionType (ENUM) Values: - hasActiveProduct - hasAnyActiveMembership ### PricingRuleScope (ENUM) Values: - individualRegistration - teamRegistration ### PricingRuleSubject (UNION) Members: Pass, Membership, GiftCard, PhysicalProduct, Activity ### Product (INTERFACE) Fields: - id: ID! - business: Business! - url: ResourceUrl! — Canonical staff-admin page for this product. Consume instead of building - name: String - description: String — Optional Markdown description shown to customers on storefront listings - featuredImage: Image — The lead image for this product — visually emphasized on customer-facing - media: [Image!]! — All images attached to this product, ordered (lowest `sortOrder` first). - price: Int! - visibility: ProductVisibility! - sale: ProductSalePeriod! - purchaseRules: ProductPurchaseRules! - pricingRules: [PricingRule!]! - effectivePrice: Int! — The effective price for the current user, after evaluating pricing rules. - taxCode: String — Stripe tax code (e.g. `txcd_10000000`) used when computing tax at - sortOrder: Int! - createdAt: DateTime! - recentPurchases(limit: Int): [ProductPurchase!]! — Most recent purchases of this product, newest first. Intended for admin - purchases(first: Int, after: String, filter: ProductPurchaseFilter): ProductPurchaseConnection! — Paginated history of every purchase of this product. Cursor-paginated; - weeklyPurchases(weeks: Int): [ProductPurchasesInWeek!]! — Weekly purchase counts for this product over the last N weeks, oldest - purchasePageBlocks: [PurchasePageBlock!]! — Ordered list of configurable blocks rendered on this product's purchase - metadata(name: String!): String — Returns the first value of the named metadata key, or null if not set. - metadataValues(name: String!): [String!]! — Returns every value stored for the named metadata key, in order. A - metadataEntries: [MetadataEntry!]! — All metadata stored on this product, one entry per key (each carrying its ### ProductActivityRule (OBJECT) A per-activity rule on a pass or membership: whether the pass/membership may be used for the activity (combined with the product's `activityScope`) and, when `creditCost` is set, how many credits that activity consumes. Fields: - id: ID! - activity: Activity — The activity this rule targets. Null if the activity was since deleted. - access: ProductActivityRuleAccess! - creditCost: Int — Credits this activity consumes from the pass/membership. Null falls back to ### ProductActivityRuleAccess (ENUM) Whether a per-activity rule includes or excludes the activity. Values: - included - excluded ### ProductActivityRuleInput (INPUT_OBJECT) A single per-activity rule when creating or updating a pass/membership. `access: included` adds the activity to coverage (under `selected` scope) or just carries a `creditCost` override (under `all` scope); `access: excluded` blocks the activity. `creditCost` is the number of credits the activity consumes (null = default 1; must be >= 0 when provided; ignored when excluded). Input fields: - activity: EntityRef! - access: ProductActivityRuleAccess! - creditCost: Int ### ProductActivityScope (ENUM) How a pass/membership's activity coverage is scoped. Values: - all — Usable for every activity, except those with an `excluded` rule. - selected — Usable only for activities with an `included` rule. ### ProductAvailability (ENUM) Which products a `Business.products` list includes, relative to the current viewer. Values: - available — Only products the viewer could purchase right now. Intro offers are - all — Every active product, regardless of the viewer's purchase history — for ### ProductConnection (OBJECT) Cursor-paginated list of products. Used by the business product list page and any other admin surface that wants a full paginated view across product subtypes. Fields: - edges: [ProductEdge!]! - nodes: [Product!]! - pageInfo: PageInfo! - totalCount: Int! ### ProductEdge (OBJECT) Fields: - cursor: String! - node: Product! ### ProductExpiration (OBJECT) How a Pass or Membership purchase expires. At most one of `after` / `at` is set: `after` is relative to the purchase date, `at` is a fixed calendar date that applies regardless of when the product was bought. Null on the parent product means it never expires. Fields: - after: Duration - at: DateTime ### ProductExpirationInput (INPUT_OBJECT) Input fields: - after: DurationInput - at: DateTime ### ProductFilter (INPUT_OBJECT) Filter applied to a paginated `ProductConnection`. Fields combine with `AND` semantics. Input fields: - query: String — Substring match against the product's display name. Stored on the - types: [ProductType!] — Restrict to one or more product subtypes. Omit (or pass `null`) for ### ProductFulfillmentStatus (ENUM) Fulfillment state for purchases that require handoff (currently physical products). Null for virtual product purchases that self-fulfill at payment time. Additional states (e.g. `shipped`, `cancelled`) may be added later. Values: - unfulfilled - fulfilled ### ProductPurchase (OBJECT) Fields: - id: ID! - product: Product! - participant: Participant! - sessionsRemaining: Int - sessionsUsed: Int! — Number of confirmed activity registrations this purchase has covered. - guestSessionsRemaining: Int — Guest passes remaining for the current billing period (memberships only). - balanceRemaining: Int - giftCardCode: String - expiresAt: DateTime - currentPeriodEnd: DateTime - clockStartsAt: DateTime — When the validity clock started, for purchases of products whose `clockStart` - subscriptionCancellation: ProductPurchaseSubscriptionCancellation — Pending Stripe subscription cancellation for membership purchases. Null when - recurringTermsSnapshot: RecurringTermsSnapshot — Recurring-billing terms disclosed to the buyer at purchase time (for - blockResponses: [PurchaseBlockResponse!]! — Buyer responses to the product's purchase-page blocks, captured at - blockMetadata: [BlockMetadataEntry!]! — Structured values captured from purchase-page blocks the business tagged - agreementDocument: PurchaseAgreementDocument — Immutable PDF record of the buyer's agreed-to blocks (contract, signature, - receiptDocument: ReceiptDocument — Immutable PDF receipt for this purchase. Null until generated (eagerly at - status: ProductPurchaseStatus! - billingIssue: ProductPurchaseBillingIssue — Latest billing issue for recurring membership purchases. Null when billing - fulfillmentStatus: ProductFulfillmentStatus — Fulfillment state. Null for virtual products (passes, memberships, gift - fulfilledAt: DateTime — When the purchase was fulfilled (handed over). Null while unfulfilled or - fulfilledBy: StaffMember — Staff member who recorded the fulfillment. - fulfillmentNote: String — Free-form note captured at fulfillment time (e.g. size, colour). - pricePaid: Int - payment: Payment - paymentSplits: [PaymentSplit!]! — Funding sources for this purchase. A direct card purchase has a single - ledgerEntries: [GiftCardLedgerEntry!]! — Append-only balance history for gift-card purchases (each redemption, - registrations(first: Int, after: String, sort: ActivityRegistrationSort): ActivityRegistrationConnection! — Activity registrations funded by this purchase. Includes guest - discountRedemptions: [DiscountCodeRedemption!]! — Discount-code redemptions applied to this purchase. Each redemption - gift: ProductPurchaseGift - url: ResourceUrl! — Canonical URLs for this purchase. `business` is the staff admin - purchasedAt: DateTime! - createdAt: DateTime! ### ProductPurchaseBillingIssue (OBJECT) Fields: - reason: String - detectedAt: DateTime! - emailSentAt: DateTime ### ProductPurchaseConnection (OBJECT) Cursor-paginated list of product purchases. Used by participant- and account-level admin pages to page through a participant's full purchase history (memberships, passes, gift cards, physical products). Fields: - edges: [ProductPurchaseEdge!]! - nodes: [ProductPurchase!]! - pageInfo: PageInfo! - totalCount: Int! ### ProductPurchaseEdge (OBJECT) Fields: - cursor: String! - node: ProductPurchase! ### ProductPurchaseFilter (INPUT_OBJECT) Filter applied to a paginated `ProductPurchaseConnection`. Fields combine with `AND` semantics. Input fields: - scope: ProductPurchaseScope — Restricts the visible slice of the buyer's purchase history. `all` ### ProductPurchaseGift (OBJECT) Fields: - id: ID! - recipientName: String! - recipientEmail: String! - message: String - scheduledSendAt: DateTime - sentAt: DateTime - createdAt: DateTime! ### ProductPurchaseGiftInput (INPUT_OBJECT) Input fields: - recipientName: String! - recipientEmail: String! - message: String - scheduledSendAt: DateTime ### ProductPurchaseRules (OBJECT) Fields: - introOffer: Boolean! — Whether this product is an intro offer (can only be purchased once, and - maxCount: Int — Maximum number of times a single user can purchase this product. - gifting: ActivityPassGifting! — Whether this product supports gifting. ### ProductPurchaseScope (ENUM) Lifecycle scope for a `ProductPurchaseFilter`. Values: - all - active - billingIssue — Memberships whose recurring billing needs owner/member attention ### ProductPurchasesInWeek (OBJECT) A weekly purchase bucket returned by `Product.weeklyPurchases`. `weekStart` is the first instant (UTC midnight, Monday) of the week; `count` is the number of purchases that occurred in the week. Fields: - weekStart: DateTime! - count: Int! ### ProductPurchaseStatus (ENUM) Values: - active - pastDue — Membership purchase whose backing Stripe Subscription is in retry/dunning. - paymentActionRequired — Membership purchase whose latest invoice requires customer action, such as - unpaid — Membership purchase whose backing Stripe Subscription is no longer payable - incomplete — Membership purchase whose first Stripe invoice has not completed payment. - expired - exhausted - redeemed - cancelled — Membership purchase whose backing Stripe Subscription has been canceled — ### ProductPurchaseSubscriptionCancellation (OBJECT) Fields: - at: DateTime! ### ProductSalePeriod (OBJECT) The window during which a product can be purchased. Both bounds are optional — null `startsAt` means available immediately; null `endsAt` means available indefinitely. The wrapper is always present so callers can read a consistent shape across product types. Fields: - startsAt: DateTime - endsAt: DateTime ### ProductSalePeriodInput (INPUT_OBJECT) Input fields: - startsAt: DateTime - endsAt: DateTime ### ProductStripeSync (OBJECT) Tracks how a product (pass, membership, or gift card) is materialized in Stripe. Sessions creates Stripe Product + Price objects on the platform account (destination charges) so payments can reference real Stripe ids. The fields surface admin-visible state for the most recent sync attempt; all are null when the product has never been synced. Fields: - productId: String — Stripe Product id (e.g. `prod_…`) on the platform account, or null if the - productDashboardUrl: URL — URL into the Stripe Dashboard for this product. Null when `productId` is - priceId: String — Stripe Price id for the product's current price (and, for memberships, - priceDashboardUrl: URL — URL into the Stripe Dashboard for the current Price. Null when - syncedAt: DateTime — When the most recent successful sync happened, or null if no sync has - attemptCount: Int! — Number of consecutive failed sync attempts. Resets to 0 on success. - error: String — Last error returned from Stripe, or null if the most recent sync ### ProductType (ENUM) Discriminator for the concrete product subtype. Matches the `products.type` column on the database. Values: - pass - membership - giftCard - physicalProduct ### ProductVisibility (ENUM) Whether a product is currently for sale on the business's storefront. Hidden products remain in admin views but are excluded from public listings and cannot be purchased. Values: - visible - hidden ### PromoteFromWaitlistResult (OBJECT) Fields: - registration: ActivityRegistration - errors: [OperationError!]! ### PromoteTeamFromWaitlistResult (OBJECT) Fields: - team: Team - errors: [OperationError!]! ### PurchaseAgreementDocument (OBJECT) The immutable PDF record of the buyer's agreed-to purchase-page blocks (contract text, acknowledgements, form answers, and the captured signature), generated at agreement time and stored in object storage. Null when the purchase captured no document-worthy responses. Fields: - url: URL! — Authenticated download URL for the PDF (buyer or business staff only). - generatedAt: DateTime! — When the document was generated. ### PurchaseBlockResponse (OBJECT) A buyer's response to a single purchase-page block, captured as an immutable snapshot at checkout. `payload` is interpreted per `kind` (e.g. accepted contract text + timestamp, signature URL + hash, form value) and is encoded as a JSON string. Fields: - id: ID! - blockId: ID! - kind: PurchasePageBlockKind! - payload: String! - recordedAt: DateTime! ### PurchaseBlockResponseInput (INPUT_OBJECT) One buyer response to persist for a purchase-page block. `payload` is a JSON-encoded string interpreted per `kind`. Input fields: - blockId: ID! - kind: PurchasePageBlockKind! - payload: String! ### PurchasePageBlock (OBJECT) A single configurable block rendered on a product's purchase page. Required blocks gate checkout submission. Fields: - id: ID! - kind: PurchasePageBlockKind! - order: Int! - required: Boolean! - config: String! — Kind-specific configuration, encoded as a JSON string (e.g. the contract ### PurchasePageBlockInput (INPUT_OBJECT) One configurable block to persist on a product's purchase page. `config` is a JSON-encoded string interpreted per `kind`. Input fields: - id: ID! - kind: PurchasePageBlockKind! - order: Int! - required: Boolean! - config: String! - metadataKey: String ### PurchasePageBlockKind (ENUM) The kind of a configurable purchase-page block. Each kind interprets its `config` (and, at checkout, its captured response) differently. Values: - richText - contract - signature - acknowledgement - formField - recurringSummary - emailMarketing — Optional email-marketing opt-in. Renders the standardized, compliant opt-in ### PurchaseProductResult (OBJECT) Fields: - purchase: ProductPurchase - checkout: CheckoutSession — Returned when payment is required. The client should present - errors: [OperationError!]! ### PushEnvironment (ENUM) Which push environment a device token was issued for. Development / TestFlight builds get `sandbox` tokens; App Store builds get `production`. The server must talk to the matching APNs host. Values: - sandbox - production ### QuoteTaxInput (INPUT_OBJECT) Input to `quoteTax`. Mirrors `CheckoutPreviewInput` with the addition of a destination address used by Stripe Tax. When neither destination nor service location can be resolved, the result is zero tax with an informational error. Input fields: - product: EntityRef - activity: CheckoutPreviewActivityInput - discountCode: String - giftCardCode: String - destination: TaxAddressInput — Destination address for the buyer. Required for digital products ### QuoteTaxResult (OBJECT) Result of `quoteTax`. The `calculationId` is a stable Stripe Tax calculation reference (`taxcalc_...`) that callers should pass back into `purchaseProduct` / `registerForActivity` so the same numbers the buyer saw are the ones charged. Null when no tax was computed. Fields: - calculationId: String - expiresAt: DateTime - subtotal: Int! - tax: Int! - total: Int! - currency: String! - lines: [TaxBreakdownLine!]! - errors: [OperationError!]! ### RankedRegistrationCount (OBJECT) A named entity (staff member or location) with its confirmed- registration count, for the ranked `BusinessSessionAnalytics` lists. Fields: - id: ID! — Global ID of the entity (e.g. `gid://Sessions/BusinessStaff/<id>` or - url: ResourceUrl! — Canonical staff-admin page for this entity (staff member or location). - name: String! — The entity's display name at query time. - registrations: Int! — Count of confirmed registrations attributed to this entity. ### ReceiptDocument (OBJECT) Immutable PDF receipt for a purchase (a card or non-card activity registration, or a product purchase). Linked from the purchase/registration detail pages for both the buyer and business staff. Fields: - url: URL! — Authenticated download URL for the PDF (buyer or business staff only). Always - generatedAt: DateTime — When the receipt PDF was generated, or null if it hasn't been built yet (it ### RecordParticipantCheckInResult (OBJECT) Fields: - registration: ActivityRegistration - alreadyCheckedIn: Boolean! — True when the registration was already checked in before this call, - errors: [OperationError!]! ### RecordParticipantEmailMarketingConsentResult (OBJECT) Fields: - participant: Participant - errors: [OperationError!]! ### RecordPaymentMethodAttachedResult (OBJECT) Fields: - paymentMethod: SavedPaymentMethod - errors: [OperationError!]! ### RecordPurchaseBlockResponsesInput (INPUT_OBJECT) Input fields: - purchase: ID! - responses: [PurchaseBlockResponseInput!]! ### RecordPurchaseBlockResponsesResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### RecurrenceSchedule (OBJECT) A generalized recurrence rule for an activity. Null when the activity is marked recurring but has no specific schedule set, or when the activity is a single session. Fields: - intervalUnit: IntervalUnit! - intervalCount: Int! - daysOfWeek: [DayOfWeek!] — Only set when `intervalUnit` is `week`. - monthlyMode: MonthlyMode — Only set when `intervalUnit` is `month`. Selects which monthly variant the - monthlyDayOfMonth: Int — Day-of-month (1..31) or -1 for "last day of month". Only set when - monthlyWeek: MonthlyWeek — Week index within the month. Only set when `monthlyMode` is `nthWeekday`. - monthlyDayOfWeek: DayOfWeek — Weekday to target. Only set when `monthlyMode` is `nthWeekday`. - startTimes: [String!]! — Times-of-day (HH:mm) at which sessions should be generated. ### RecurrenceScheduleInput (INPUT_OBJECT) Input fields: - intervalUnit: IntervalUnit! - intervalCount: Int! - daysOfWeek: [DayOfWeek!] - monthlyMode: MonthlyMode - monthlyDayOfMonth: Int - monthlyWeek: MonthlyWeek - monthlyDayOfWeek: DayOfWeek - startTimes: [String!]! ### RecurringTermsSnapshot (OBJECT) Snapshot of the recurring-billing terms disclosed to a buyer at purchase time. Frozen on the purchase so the buyer's consent is against what they actually saw, not later product edits. Amounts are in cents. Fields: - amount: Int! - currency: String! - interval: String! - intervalCount: Int! - startsAt: DateTime! - capturedAt: DateTime! - mandateText: String — The recurring-charge authorization (mandate) text the buyer agreed to at - mandateId: String — The Stripe mandate id created when the buyer authorized the recurring ### RedeemGiftCardResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### RefreshBusinessStripeStatusResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### RefundDecision (ENUM) The outcome of running the refund pipeline for a cancelled `ActivityRegistration`. - `fullRefund`: every monetary split (and any pass session credit) was refunded in full. - `partialRefund`: the policy issued less than 100% of the monetary refund. - `noRefund`: policy was outside the refund window — no money was returned. Pass / membership session credit may still have been restored independently of this decision. - `notApplicable`: the registration was free or had nothing to refund. Values: - fullRefund - partialRefund - noRefund - notApplicable ### RegisterForActivityResult (OBJECT) Fields: - registration: ActivityRegistration - checkout: CheckoutSession — Returned when payment is required. The client should present - errors: [OperationError!]! ### RegisterForChallengeResult (OBJECT) Fields: - registration: ChallengeRegistration - errors: [OperationError!]! ### RegisterPushDeviceInput (INPUT_OBJECT) Input for {@link Mutation.registerPushDevice}. Input fields: - token: String! — APNs device token (hex) or FCM registration token. - platform: AppPlatform! - environment: PushEnvironment! - appBundleId: String! — The app build's bundle id (APNs topic). - businessHandle: String! — Handle of the business this white-label app is pinned to. - locale: String - appVersion: String ### RegisterPushDeviceResult (OBJECT) Fields: - success: Boolean! - errors: [OperationError!]! ### RegistrationBlock (UNION) Members: TextRegistrationBlock, ContractRegistrationBlock, SelectRegistrationBlock, EmailMarketingRegistrationBlock ### RegistrationBlockInput (INPUT_OBJECT) Exactly one field must be provided. Input fields: - text: TextRegistrationBlockInput - contract: ContractRegistrationBlockInput - select: SelectRegistrationBlockInput - emailMarketing: EmailMarketingRegistrationBlockInput ### RegistrationConfiguration (OBJECT) Registration settings for an activity or individual activity session. Embedded value object (no ID) — lives on Activity or ActivitySession. Fields: - status: RegistrationStatus! - scope: RegistrationScope! - opensAt: RegistrationTiming - closesAt: RegistrationTiming - restrictions: RegistrationRestrictions! - price: RegistrationPrice - waitlist: WaitlistConfiguration! - participants: RegistrationParticipantPolicy! ### RegistrationConfigurationInput (INPUT_OBJECT) Input fields: - status: RegistrationStatus - scope: RegistrationScope - opensAt: RegistrationTimingInput - closesAt: RegistrationTimingInput - restrictions: RegistrationRestrictionsInput - price: RegistrationPriceInput - waitlist: WaitlistConfigurationInput - participants: RegistrationParticipantPolicyInput ### RegistrationCountBucket (OBJECT) A keyed bucket of confirmed registrations for the categorical `BusinessSessionAnalytics` breakdowns. Fields: - key: String! — Stable machine key for the bucket (e.g. `monday`, `morning`). Clients - registrations: Int! — Count of confirmed registrations in this bucket. ### RegistrationDataInput (INPUT_OBJECT) Input fields: - key: String! — Metadata key (reverse-DNS format). - value: String! ### RegistrationLimitSource (ENUM) Values: - manual - location ### RegistrationOffset (OBJECT) A duration offset. Exactly one field should be set. The value is relative to the activity start — positive means before, negative means after. Fields: - minutes: Int - hours: Int - days: Int ### RegistrationOffsetInput (INPUT_OBJECT) Input fields: - minutes: Int - hours: Int - days: Int ### RegistrationParticipantMode (ENUM) Values: - selfOnly - guestOnly - both ### RegistrationParticipantPolicy (OBJECT) Whether the public registration flow accepts self registrations, guest registrations, or both. Admin-side registrations (added by staff on the session sheet) are unaffected by this policy. Fields: - mode: RegistrationParticipantMode! ### RegistrationParticipantPolicyInput (INPUT_OBJECT) Input fields: - mode: RegistrationParticipantMode ### RegistrationPrice (OBJECT) Per-registration-type price configuration. Fields: - team: Int - individual: Int ### RegistrationPriceInput (INPUT_OBJECT) Input fields: - team: Int - individual: Int ### RegistrationRestrictions (OBJECT) Fields: - teams: RegistrationTypeRestriction! - individuals: RegistrationTypeRestriction! - age: AgeRequirement — Participant age limits, or null when the activity has no age requirement. ### RegistrationRestrictionsInput (INPUT_OBJECT) Input fields: - teams: RegistrationTypeRestrictionInput - individuals: RegistrationTypeRestrictionInput - age: AgeRequirementInput — Participant age limits. Pass an object with null `minimumAge` and ### RegistrationScope (ENUM) Whether registration applies to the whole schedule or each individual activity session. Values: - schedule — A single registration covers the entire schedule (e.g. league season signup). - session — Each individual activity session has its own registration (e.g. drop-in classes, bookable slots). ### RegistrationStatus (ENUM) Values: - open - closed ### RegistrationTiming (OBJECT) When a registration window opens or closes. Either a fixed date/time, or a duration relative to the activity start time. Fields: - fixed: DateTime — A fixed ISO date/time string. - beforeStart: RegistrationOffset — An offset relative to the activity start time. Positive values mean before start, negative means after. ### RegistrationTimingInput (INPUT_OBJECT) Input fields: - fixed: DateTime - beforeStart: RegistrationOffsetInput ### RegistrationTypeRestriction (OBJECT) Fields: - allowed: Boolean! - limit: Int - limitSource: RegistrationLimitSource! ### RegistrationTypeRestrictionInput (INPUT_OBJECT) Input fields: - allowed: Boolean - limit: Int - limitSource: RegistrationLimitSource ### RemoveBusinessTaxRegistrationResult (OBJECT) Fields: - registration: BusinessTaxRegistration - errors: [OperationError!]! ### RemoveFavoriteResult (OBJECT) Fields: - user: User - errors: [OperationError!]! ### RemoveFromOrganizationResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### RemoveLocationFromActivityResult (OBJECT) Fields: - errors: [OperationError!]! ### RemovePaymentMethodResult (OBJECT) Fields: - errors: [OperationError!]! ### RemoveStaffFromActivityResult (OBJECT) Fields: - errors: [OperationError!]! ### RemoveStaffFromActivitySessionResult (OBJECT) Fields: - errors: [OperationError!]! ### RemoveTeamResult (OBJECT) Fields: - errors: [OperationError!]! ### RenameLocationResult (OBJECT) Fields: - location: Location - errors: [OperationError!]! ### RenameProductResult (OBJECT) Fields: - product: Product - errors: [OperationError!]! ### ReplayWebhookDeliveryResult (OBJECT) Fields: - webhookEndpoint: WebhookEndpoint — The delivery's endpoint, so callers can re-read its refreshed delivery log. - errors: [OperationError!]! ### ReportMatchScoreResult (OBJECT) Fields: - session: ActivitySession - errors: [OperationError!]! ### RequestAuthCodeResult (OBJECT) Result of requesting a sign-in or account-creation email. The response is intentionally opaque — it returns the same shape regardless of whether the email matched an existing account, to avoid leaking account existence. Fields: - errors: [OperationError!]! ### RequestCountrySupportResult (OBJECT) Fields: - errors: [OperationError!]! ### RequestEmailChangeResult (OBJECT) Result of requesting an email change. Returns an opaque success shape — the client should never learn whether the target email is already in use via this response. Fields: - errors: [OperationError!]! ### ReservedCard (OBJECT) A card on file reserved for charging if a waitlist spot is promoted. Fields: - brand: String - last4: String ### ResourceKind (ENUM) The kind of resource that owns an appointment availability schedule or fulfills an appointment type: a staff member, a facility, or a location. Values: - staff - facility - location ### ResourceOwner (OBJECT) A reference to a bookable resource — a staff member, facility, or location — by its kind and node `ID`. Fields: - type: ResourceKind! - id: ID! ### ResourceUrl (OBJECT) Fields: - go: URL! - business: URL ### ResumeBusinessSubscriptionResult (OBJECT) Fields: - subscription: PlatformSubscription - errors: [OperationError!]! ### ResumeMembershipSubscriptionResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### RevenueDayAmount (OBJECT) Gross revenue for a single local-business-timezone day. Fields: - date: String! — Local-business-timezone date as `YYYY-MM-DD`. - amount: Int! — Sum of `amount` across succeeded payments whose `createdAt` falls on ### Review (OBJECT) A star rating (1–5) and optional written review left by a verified attendee about a business or one of its staff members. Fields: - id: ID! - business: Business! — The business being reviewed. Always present — staff reviews are scoped - staff: StaffMember — The staff member being reviewed, or null when the review is about the - author: ReviewAuthor! — Public author identity. Intentionally narrow (display name + avatar) so - session: ActivitySession — The session the author attended that anchors this review, when known. - rating: Int! — Star rating, an integer from 1 to 5. - body: String — Optional written review. - status: ReviewStatus! - response: ReviewResponse — The business's public reply to this review, or null when none. - createdAt: DateTime! - updatedAt: DateTime ### ReviewAuthor (OBJECT) Public-facing identity of a review's author. Deliberately minimal so the reviewer's account, email, and other participants are never exposed. Fields: - name: String! - avatar: Image ### ReviewConnection (OBJECT) Cursor-paginated list of reviews. See `PageInfo` for pagination semantics. `totalCount` is computed only when selected. Fields: - edges: [ReviewEdge!]! - nodes: [Review!]! - pageInfo: PageInfo! - totalCount: Int! ### ReviewEdge (OBJECT) Fields: - cursor: String! - node: Review! ### ReviewMatchDecision (ENUM) Staff decision when adjudicating a reported/disputed result. Values: - approve - reject - dismissDispute ### ReviewMatchResult (OBJECT) Fields: - session: ActivitySession - errors: [OperationError!]! ### ReviewResponse (OBJECT) A business's public reply to a review. Fields: - body: String! - at: DateTime! ### ReviewStarCount (OBJECT) Fields: - stars: Int! - count: Int! ### ReviewStatus (ENUM) Moderation state of a `Review`. Reviews auto-publish from verified attendees; a business can `flagged` one to report it for platform moderation (it stays visible while flagged), and the platform operator can ultimately set it `removed` (hidden from everyone). Values: - published - flagged - removed ### ReviewSummary (OBJECT) Aggregate rating summary for a business or staff member, computed across its visible (non-removed) reviews. Fields: - average: Float — Mean rating, or null when there are no reviews yet. - count: Int! — Number of reviews contributing to the summary. - distribution: [ReviewStarCount!]! — Count of reviews at each star level, always five entries ordered 1→5. ### ReviewTargetInput (INPUT_OBJECT) Target for a review write operation. Exactly one of `business` or `staff` must be provided — the mutation dispatches based on which field is set. A staff review is always implicitly scoped to that staff member's business. Input fields: - business: EntityRef - staff: EntityRef ### RevokeApiKeyResult (OBJECT) Fields: - apiKey: ApiKey - errors: [OperationError!]! ### RevokeOtherSessionsResult (OBJECT) Fields: - revokedCount: Int! — Number of other sessions that were signed out. - errors: [OperationError!]! ### RevokeSessionResult (OBJECT) Fields: - errors: [OperationError!]! ### RotateWebhookSigningSecretResult (OBJECT) Fields: - webhookEndpoint: WebhookEndpoint - errors: [OperationError!]! ### SaveDashboardViewResult (OBJECT) Result of `Mutation.saveDashboardView`. Fields: - view: DashboardView - errors: [OperationError!]! ### SavedPaymentMethod (OBJECT) A saved Stripe `PaymentMethod` attached to the viewer's customer record. Listed and managed via `Me.paymentMethods` so customers can add, remove, and pick a default card before any charge happens. Fields: - id: ID! - brand: String - last4: String - expiryMonth: Int - expiryYear: Int - isDefault: Boolean! — True when this is the customer's `invoice_settings.default_payment_method`. ### ScheduleBroadcastResult (OBJECT) Fields: - broadcast: Broadcast - errors: [OperationError!]! ### SearchResults (OBJECT) Mixed-entity search results returned by `Query.search`. Currently surfaces matching businesses; the type's shape will grow over time to include favorite instructors, activities, and other public entities without breaking the field name. Each list is independently scoped and capped at the requested `first`. Fields: - businesses: [Business!]! — Public businesses whose name or handle matches the query. Restricted ### SegmentCondition (OBJECT) One condition in a segment filter. `field` and `operator` are stable string keys from a server-owned catalog (kept as strings, not enums, so the vocabulary can grow without a schema change). Examples: - `field: "metadata.tier"`, `operator: "eq"`, `value: "gold"` - `field: "metadata.tier"`, `operator: "in"`, `values: ["gold", "platinum"]` - `field: "metadata.newsletter"`, `operator: "exists"` - `field: "signupDate"`, `operator: "after"`, `value: "2026-01-01"` - `field: "registrationCount"`, `operator: "gte"`, `value: "5"` `value` carries single-operand operators; `values` carries set operators like `in`. Unary operators (`exists`) need neither. Fields: - field: String! - operator: String! - value: String - values: [String!]! ### SegmentConditionInput (INPUT_OBJECT) Input fields: - field: String! - operator: String! - value: String - values: [String!] ### SegmentDefinition (OBJECT) The filter tree of a segment: a match mode plus its conditions. Always evaluated with a marketing-consent gate applied on top, so a segment only ever resolves to participants who may be emailed. Fields: - match: SegmentMatch! - conditions: [SegmentCondition!]! ### SegmentDefinitionInput (INPUT_OBJECT) Input fields: - match: SegmentMatch! - conditions: [SegmentConditionInput!]! ### SegmentMatch (ENUM) How a segment's conditions combine. `all` = every condition must match (AND); `any` = at least one (OR). v1 segments are a single flat group; nesting is reserved for a later release. Values: - all - any ### SelectRegistrationBlock (OBJECT) Fields: - key: String! - label(locale: Locale): String! — Resolved for the given locale, falling back to en, then first available. - labelTranslations: [Translation!]! — All available translations for the label field. - options: [SelectRegistrationBlockOption!]! - required: Boolean! - saveToParticipant: Boolean! — When true, the answer is saved against the participant (their user) so it ### SelectRegistrationBlockInput (INPUT_OBJECT) Input fields: - key: String! - label: [TranslatedStringInput!]! - options: [SelectRegistrationBlockOptionInput!]! - required: Boolean! - saveToParticipant: Boolean — When true, the answer is saved against the participant (their user) and ### SelectRegistrationBlockOption (OBJECT) Fields: - value: String! - label(locale: Locale): String! — Resolved for the given locale, falling back to en, then first available. - labelTranslations: [Translation!]! — All available translations for the label field. ### SelectRegistrationBlockOptionInput (INPUT_OBJECT) Input fields: - value: String! - label: [TranslatedStringInput!]! ### SendBroadcastResult (OBJECT) Fields: - broadcast: Broadcast - errors: [OperationError!]! ### SendTestWebhookDeliveryResult (OBJECT) Fields: - delivery: WebhookDelivery — The queued test delivery, so the caller can watch it in the delivery log. - errors: [OperationError!]! ### ServiceRotation (ENUM) Values: - none - lastWinner ### Services (OBJECT) Third-party service configuration available to the client. Fields: - mapBox: MapBox! - stripe: Stripe! ### ServiceScoring (ENUM) Values: - rally - sideOut ### SessionDayCount (OBJECT) Session count for a single local-business-timezone day. Fields: - date: String! — Local-business-timezone date as a `YYYY-MM-DD` string. The starting - count: Int! ### SessionUtilizationDay (OBJECT) Aggregate utilization metrics for a single local-business-timezone day. Fields: - date: String! — Local-business-timezone date as a `YYYY-MM-DD` string. - sessionCount: Int! — Number of sessions whose start time falls on this date. Excludes - registrationCount: Int! — Sum of confirmed registrations across the day's sessions. Drives the - capacity: Int! — Sum of effective capacity (session-level limit, falling back to - hasUncappedSession: Boolean! — `true` when at least one session on this day has no capacity set ### SetBusinessMigrationResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### SetDebugPreviewBranchResult (OBJECT) Fields: - debug: DebugMode - errors: [OperationError!]! ### SetDefaultPaymentMethodResult (OBJECT) Fields: - paymentMethod: SavedPaymentMethod - errors: [OperationError!]! ### SetEmailMarketingResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### SetJourneyStatusResult (OBJECT) Fields: - journey: Journey - errors: [OperationError!]! ### SetJourneyStepsResult (OBJECT) Fields: - journey: Journey - errors: [OperationError!]! ### SetMetadataResult (OBJECT) Fields: - value: String - errors: [OperationError!]! ### SetMyEmailMarketingConsentResult (OBJECT) Fields: - business: Business — The business, so the client can re-read `viewerEmailMarketingConsent`. - errors: [OperationError!]! ### SetPurchasePageBlocksInput (INPUT_OBJECT) Input fields: - product: ID! - blocks: [PurchasePageBlockInput!]! ### SetPurchasePageBlocksResult (OBJECT) Fields: - product: Product - errors: [OperationError!]! ### SetRules (OBJECT) Fields: - winAt: Int - winBy: Int! - maximum: Int - gameRules: GameRules! ### SetRulesInput (INPUT_OBJECT) Input fields: - winAt: Int - winBy: Int! - maximum: Int - gameRules: GameRulesInput! ### SetTeamCaptainResult (OBJECT) Fields: - team: Team - errors: [OperationError!]! ### SignInResult (OBJECT) Fields: - user: User - token: String — JWT token — also set as the `auth` HttpOnly cookie. - redirectUrl: String — Post-sign-in destination resolved from the `redirect` argument (or the - errors: [OperationError!]! ### SignOutResult (OBJECT) Fields: - errors: [OperationError!]! ### SignUpTeamResult (OBJECT) Fields: - team: Team - checkout: CheckoutSession — When team registration has a price, callers must complete a Stripe checkout - errors: [OperationError!]! ### SocialLink (OBJECT) A link to a person's profile on an external service. Fields: - platform: SocialPlatform! - content: String! — Bare handle (no leading `@`) for handle-based platforms, or the origin - url: String! — Canonical absolute URL for this social link, derived from `platform` ### SocialLinkInput (INPUT_OBJECT) Input form of a `SocialLink`. The server trims whitespace, strips any leading `@` for handle-based platforms, and reduces `website` input to its origin before storage. Input fields: - platform: SocialPlatform! - content: String! ### SocialPlatform (ENUM) Supported platforms for a `SocialLink`. For handle-based platforms the stored `content` is the bare handle (no `@` prefix); for `website` it is the origin. Values: - instagram - tiktok - x - facebook - youtube - mastodon - bluesky - threads - website ### SpotStyle (ENUM) Values: - square - circle ### StaffAssignment (OBJECT) A staff member assigned to an activity or individual session, along with the role they fill. Fields: - id: ID! - staffMember: StaffMember! - role: String! ### StaffAssignmentInput (INPUT_OBJECT) Input fields: - staff: EntityRef! - role: String! ### StaffCancellationPenalty (ENUM) Staff-side penalty choice when cancelling a reservation. Drives both the refund and the penalty: - `applyPolicy`: honor the configured cancellation policy (default). The refund and any penalty come from the policy / the `refund` override. - `none`: waive the penalty — refund in full and forfeit no credits. - `custom`: refund in full, then withhold an exact flat charge given by `penaltyAmountCents`. For card / gift-card bookings the charge is taken from the refund; credit-only bookings can't be charged cash yet, so the recorded penalty is capped at the refundable amount. Values: - applyPolicy - none - custom ### StaffCredential (OBJECT) An optional professional credential shown on a staff member's public profile (license, certification, etc.) — a trust signal for practitioner-led health & wellness businesses. Descriptive only: never verified by the platform and never gating any behaviour. Fields: - kind: String! — Stable machine kind for grouping / iconography (e.g. `license`, - title: String! — Human-facing title, e.g. "Registered Massage Therapist". - issuer: String — Optional issuing body, e.g. "College of Massage Therapists of Ontario". - identifier: String — Optional license / registration number. - expiresAt: String — Optional ISO-8601 calendar date the credential expires. ### StaffCredentialInput (INPUT_OBJECT) Input form of a `StaffCredential`. The server trims whitespace and drops entries without a `kind` + `title`. Input fields: - kind: String! - title: String! - issuer: String - identifier: String - expiresAt: String ### StaffMember (OBJECT) A staff member belonging to a business. Combines the staff directory (name, email, bio) with optional login access (user + permissions). Fields: - id: ID! - business: Business! - name: String! - pronouns: String — Optional free-form pronouns to display alongside the staff member's name. - initials: String! — Initials derived from the staff member's name (e.g. "JD" for "Jane Doe"). - email: String - bio: String - url: ResourceUrl! - user: User — Linked user account, or null for staff-only entries without login access. - profileImage: Image — Profile picture for the staff member. Falls back to the linked user's - defaultRole: String — Default role to fill when assigning this staff member to activities, derived - images: [Image!]! — Additional gallery images for this staff member. - permissions: Int! — Effective (expanded) bitmask of BusinessPermission flags — resolved from the - isAdmin: Boolean! - canManageActivities: Boolean! - canViewReports: Boolean! - role: BusinessRole — Assigned permission role (template), or null when the member uses their own - socialLinks: [SocialLink!]! — Per-business social links for this staff member. - credentials: [StaffCredential!]! — Optional professional credentials (license, certification, etc.) shown on - sessions(starting: ActivitySessionsStarting, sort: ActivitySessionSort, first: Int, after: String, includeAppointments: Boolean, source: [ActivitySessionSource!]): ActivitySessionConnection! — Activity sessions this staff member is assigned to. Cursor-paginated; - reviews(first: Int, after: String): ReviewConnection! — Reviews about this staff member, newest first. Cursor-paginated; - reviewSummary: ReviewSummary! — Aggregate rating summary across this staff member's visible reviews. - viewerReview: Review — The signed-in viewer's own review of this staff member, or null. - viewerCanReview: Boolean! — Whether the signed-in viewer may leave a (new) review for this staff - createdAt: DateTime! ### StaffMemberConnection (OBJECT) Cursor-paginated list of staff members for a business. Fields: - edges: [StaffMemberEdge!]! - nodes: [StaffMember!]! - pageInfo: PageInfo! - totalCount: Int! ### StaffMemberEdge (OBJECT) Fields: - cursor: String! - node: StaffMember! ### StaffMemberFilter (INPUT_OBJECT) Filter applied to a paginated staff list. `query` matches the staff member's name. Input fields: - query: String ### StaffRefundOverride (ENUM) Staff-side refund override. Bypasses the resolved cancellation policy. - `applyPolicy`: defer to the resolved policy (default for participant cancels, no-op when supplied by staff). - `forceFull`: refund every monetary split in full, regardless of the cutoff window. Used as the default for staff-initiated session cancels — the cancel wasn't the customer's fault. - `forceNone`: cancel without issuing any refund. The audit trail is still recorded; pass / membership session credit is still restored. Values: - applyPolicy - forceFull - forceNone ### StandingsEntry (OBJECT) Fields: - team: Team! - wins: Int! - losses: Int! - played: Int! ### StartPasskeyResult (OBJECT) Fields: - options: String — JSON-encoded PublicKeyCredentialCreationOptions or RequestOptions. - errors: [OperationError!]! ### StopObservingResult (OBJECT) Fields: - errors: [OperationError!]! ### String (SCALAR) The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. ### Stripe (OBJECT) Fields: - publishableKey: String! ### StripeAccountSession (OBJECT) Response from creating or refreshing a Stripe Connect account session. Contains the client secret needed to initialize Connect embedded components. Fields: - clientSecret: String! — Client secret for initializing Connect.js embedded components. ### StripeConnectionStatus (ENUM) Values: - notConnected — No Stripe Connect account has been created for this business. - connected — A Stripe Connect account exists for this business. ### StripeOnboardingStatus (ENUM) Values: - notStarted — Onboarding has not been started (no Stripe account). - incomplete — Stripe account exists but the merchant hasn't yet finished the - submitted — The merchant finished the onboarding form but Stripe is still - complete — Onboarding is complete and the business can accept real card payments. ### SubscriptionBillingUpdate (OBJECT) Fields: - clientSecret: String - amount: Int! - currency: String! ### TaxAddressInput (INPUT_OBJECT) Input fields: - country: String! - region: String - postalCode: String - city: String - line1: String ### TaxBreakdownLine (OBJECT) Per-jurisdiction tax line collected on a single payment. Surfaced on receipts and aggregated by the tax-collected report. Fields: - jurisdiction: String! — Display label, e.g. `"Ontario HST"` or `"VAT (United Kingdom)"`. - amount: Int! — Tax amount in cents (always positive). - rateBasisPoints: Int! — Effective rate in basis points, e.g. `1300` = 13%. - taxabilityReason: String — Stripe taxability reason code, when present. ### TaxCollectedJurisdictionRow (OBJECT) A single jurisdiction row in the tax-collected report. Fields: - jurisdiction: String! - country: String! - region: String - totalTax: Int! - totalRevenue: Int! - transactionCount: Int! ### TaxCollectedReport (OBJECT) Fields: - start: DateTime! - end: DateTime! - currency: String! - totalTax: Int! - totalRevenue: Int! - rows: [TaxCollectedJurisdictionRow!]! ### TaxDisplayMode (ENUM) Whether displayed prices already include tax (`inclusive`, EU/UK style) or have it added on at checkout (`exclusive`, NA style). Values: - exclusive - inclusive ### Team (OBJECT) Fields: - id: ID! - name: String! - types: [ActivityType!]! - minPlayers: Int - maxPlayers: Int - playerCount: Int! - registrationCount: Int! - members: [TeamMember!]! - invites: [TeamInvite!]! - createdAt: DateTime! - url: ResourceUrl! ### TeamConnection (OBJECT) Cursor-paginated list of teams. Used wherever a list of teams could in principle grow large enough that one-shot fetches are wasteful — e.g. the participant-detail teams tab. Fields: - edges: [TeamEdge!]! - nodes: [Team!]! - pageInfo: PageInfo! - totalCount: Int! ### TeamEdge (OBJECT) Fields: - cursor: String! - node: Team! ### TeamInvite (OBJECT) Fields: - id: ID! - team: Team! - token: String! - email: String - status: TeamInviteStatus! - invitedBy: User - createdAt: DateTime! ### TeamInviteStatus (ENUM) Values: - pending - accepted - declined ### TeamMember (OBJECT) Fields: - id: ID! - participant: Participant! - role: TeamMemberRole! - status: TeamMemberStatus! - createdAt: DateTime! ### TeamMemberRole (ENUM) Values: - regular - substitute - captain — The team captain — may report and dispute league match results. ### TeamMembersInput (INPUT_OBJECT) Input fields: - min: Int - max: Int ### TeamMemberStatus (ENUM) Values: - active - alumnus ### TextBlockInputType (ENUM) Values: - text - email - tel - number ### TextRegistrationBlock (OBJECT) Fields: - key: String! - label(locale: Locale): String! — Resolved for the given locale, falling back to en, then first available. - labelTranslations: [Translation!]! — All available translations for the label field. - placeholder(locale: Locale): String - placeholderTranslations: [Translation!]! — All available translations for the placeholder field. - inputType: TextBlockInputType! - required: Boolean! - saveToParticipant: Boolean! — When true, the answer is saved against the participant (their user) so it ### TextRegistrationBlockInput (INPUT_OBJECT) Input fields: - key: String! - label: [TranslatedStringInput!]! - placeholder: [TranslatedStringInput!] - inputType: TextBlockInputType! - required: Boolean! - saveToParticipant: Boolean — When true, the answer is saved against the participant (their user) and ### ThemingToken (OBJECT) A single CSS custom property name–value pair computed from business brand colors. Fields: - name: String! - value: String! ### Timezone (SCALAR) An IANA timezone identifier (e.g. `"America/Toronto"`). Validated at the GraphQL layer with `Intl.DateTimeFormat`; values that the runtime can't resolve to a known zone are rejected. @example "America/Toronto" @example "Asia/Tokyo" ### TopActivityEntry (OBJECT) A single ranked activity within `BusinessTopActivities`. Fields: - id: ID! — Global ID of the activity (`gid://Sessions/Activity/<id>`). - url: ResourceUrl! — Canonical staff-admin page for this activity. Consume instead of decoding - name: String! — The activity's display name at query time. - registrations: Int! — Count of `activity_registrations` rows with `status = confirmed` ### TransferBusinessOwnershipResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### TransferOrganizationOwnershipResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### TranslatedStringInput (INPUT_OBJECT) Input fields: - locale: Locale! - value: String! ### Translation (OBJECT) A single locale–value pair within a translated field. Fields: - locale: Locale! - value: String! ### UncancelActivitySessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### UnfulfillProductPurchaseResult (OBJECT) Fields: - purchase: ProductPurchase - errors: [OperationError!]! ### UnscheduleBroadcastResult (OBJECT) Fields: - broadcast: Broadcast - errors: [OperationError!]! ### UpdateActivityRegistrationSpotResult (OBJECT) Fields: - registration: ActivityRegistration - errors: [OperationError!]! ### UpdateActivityResult (OBJECT) Fields: - activity: Activity - errors: [OperationError!]! ### UpdateActivitySessionResult (OBJECT) Fields: - activitySession: ActivitySession - errors: [OperationError!]! ### UpdateApiKeyResult (OBJECT) Fields: - apiKey: ApiKey - errors: [OperationError!]! ### UpdateBrandThemeInput (INPUT_OBJECT) One-of input for updating a brand's theme. Exactly one of the three variants must be set: - `json`: structured deep-partial patch, deep-merged into the stored theme. - `css`: a CSS-like blob with `--sessions-*` declarations, parsed server-side into a patch, then deep-merged. - `reset`: when `true`, wipes the stored theme back to the default. Input fields: - json: BrandThemePatchInput - css: String - reset: Boolean ### UpdateBroadcastResult (OBJECT) Fields: - broadcast: Broadcast - errors: [OperationError!]! ### UpdateBusinessAppChannelInput (INPUT_OBJECT) Patch input for the `app` channel — store metadata for one platform's listing. The listing is created on first write. Credentials are connected separately via {@link Mutation.connectAppDeveloperAccount}, and builds are requested via {@link Mutation.submitAppBuild}. Omitted fields are left unchanged. Input fields: - platform: AppPlatform! - appName: String - subtitle: String - marketingDescription: String - keywords: [String!] - bundleId: String - supportUrl: URL - marketingUrl: URL - privacyPolicyUrl: URL - primaryCategory: String - ageRating: String - reviewContact: AppReviewContactInput - reviewNotes: String ### UpdateBusinessBrandResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### UpdateBusinessCancellationPolicyResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### UpdateBusinessChannelsInput (INPUT_OBJECT) Patch input for {@link Mutation.updateBusiness}'s `channels` argument. Omitted channels are left unchanged. Input fields: - public: UpdateBusinessPublicChannelInput - web: UpdateBusinessWebChannelInput - app: UpdateBusinessAppChannelInput ### UpdateBusinessContactInput (INPUT_OBJECT) Patch input for {@link Mutation.updateBusiness}'s `contact` argument. Put-style: omitted fields are left unchanged; explicit null clears the field (email then falls back to the owner's email at render time). Input fields: - email: String - phone: String ### UpdateBusinessLocalizationResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### UpdateBusinessPoliciesInput (INPUT_OBJECT) Patch input for {@link Mutation.updateBusiness}'s `policies` argument. Omitted policy entries are left unchanged. Input fields: - privacy: UpdateBusinessPolicyInput - terms: UpdateBusinessPolicyInput - cancellationRefund: UpdateBusinessPolicyInput - californiaPrivacy: UpdateBusinessPolicyInput - consumerHealthData: UpdateBusinessPolicyInput ### UpdateBusinessPolicyInput (INPUT_OBJECT) Patch input for one policy entry. `default` clears custom values, `externalUrl` requires `url`, and `hostedContent` requires `contentMarkdown`. Input fields: - mode: BusinessPolicyMode! - url: URL - contentMarkdown: String ### UpdateBusinessPublicChannelInput (INPUT_OBJECT) Patch input for the `public` channel. Omitted fields are left unchanged. Input fields: - privacy: BusinessPrivacy - visibility: BusinessVisibility - searchVisibility: BusinessVisibility - seo: UpdateBusinessSeoInput - homePageBlocks: [HomePageBlockInput!] — Replace the home-page blocks (order + visibility). The full list is ### UpdateBusinessResult (OBJECT) Fields: - business: Business - errors: [OperationError!]! ### UpdateBusinessSeoInput (INPUT_OBJECT) Patch input for the public page's SEO overrides. Omitted fields are left unchanged; pass an empty (or whitespace-only) string to clear an override and fall back to the computed default. Input fields: - title: String - description: String ### UpdateBusinessTaxSettingsResult (OBJECT) Fields: - taxSettings: BusinessTaxSettings - errors: [OperationError!]! ### UpdateBusinessWebChannelInput (INPUT_OBJECT) Patch input for the `web` channel. Omitted fields are left unchanged. Input fields: - embedding: UpdateBusinessWebEmbeddingInput ### UpdateBusinessWebEmbeddingInput (INPUT_OBJECT) Patch input for the `web.embedding` section. Omitted fields are left unchanged. Pass an empty list to `allowedOrigins` to disable embed sign-in entirely. Input fields: - allowedOrigins: [URL!] ### UpdateChallengeResult (OBJECT) Fields: - challenge: Challenge - errors: [OperationError!]! ### UpdateDiscountCodeResult (OBJECT) Fields: - discountCode: DiscountCode - errors: [OperationError!]! ### UpdateFacilityResult (OBJECT) Fields: - facility: Facility - errors: [OperationError!]! ### UpdateGiftCardResult (OBJECT) Fields: - giftCard: GiftCard - errors: [OperationError!]! ### UpdateJourneyResult (OBJECT) Fields: - journey: Journey - errors: [OperationError!]! ### UpdateLocationResult (OBJECT) Fields: - location: Location - errors: [OperationError!]! ### UpdateMarketingSegmentResult (OBJECT) Fields: - segment: MarketingSegment - errors: [OperationError!]! ### UpdateMembershipResult (OBJECT) Fields: - membership: Membership - errors: [OperationError!]! ### UpdateMeResult (OBJECT) Fields: - user: User - errors: [OperationError!]! ### UpdateOrganizationBrandResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### UpdateOrganizationLocalizationResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### UpdateOrganizationResult (OBJECT) Fields: - organization: Organization - errors: [OperationError!]! ### UpdatePasskeyResult (OBJECT) Fields: - passkey: Passkey - errors: [OperationError!]! ### UpdatePassResult (OBJECT) Fields: - pass: Pass - errors: [OperationError!]! ### UpdatePhysicalProductResult (OBJECT) Fields: - physicalProduct: PhysicalProduct - errors: [OperationError!]! ### UpdatePricingRuleResult (OBJECT) Fields: - pricingRule: PricingRule - errors: [OperationError!]! ### UpdateReportsDashboardLayoutResult (OBJECT) Result of `Mutation.updateReportsDashboardLayout`. Returns the refreshed business so the viewer's `reportsDashboardLayout` reflects the save. Fields: - business: Business - errors: [OperationError!]! ### UpdateReviewInput (INPUT_OBJECT) Input fields: - review: ID! - rating: Int! - body: String ### UpdateReviewResult (OBJECT) Fields: - review: Review - errors: [OperationError!]! ### UpdateStaffMemberResult (OBJECT) Fields: - staffMember: StaffMember - errors: [OperationError!]! ### UpdateWebhookEndpointResult (OBJECT) Fields: - webhookEndpoint: WebhookEndpoint - errors: [OperationError!]! ### URL (SCALAR) An absolute URL with an `http` or `https` scheme. Inputs are parsed with the WHATWG URL parser; values that don't parse, or that use a different scheme, are rejected at the GraphQL layer. @example "https://example.com" @example "https://www.example.com:8443/embed" ### User (OBJECT) Fields: - id: ID! - name: String! - pronouns: String — Optional free-form pronouns to display alongside the user's name. - gender: String — Optional free-form gender self-description. Never required; users may - email: String — Login email. Null for a managed child account, which has no email and - avatar: Image - teams: [Team!]! - featureFlagSettings: [FeatureFlagSetting!]! — Every feature flag's setting for this user, for the internal-admin - socialLinks: [SocialLink!]! — Personal social links for this user. - favoriteBusinesses: [Business!]! — Businesses the user has favorited, newest first. - favoriteInstructors: [StaffMember!]! — Staff members (instructors) the user has favorited, newest first. - favoriteActivities: [Activity!]! — Activities the user has favorited, newest first. - reviews: [Review!]! — Reviews this user has written, newest first. Excludes reviews the user - createdAt: DateTime! ### UserConnection (OBJECT) Cursor-paginated list of users. Used by internal admin search. Fields: - edges: [UserEdge!]! - nodes: [User!]! - pageInfo: PageInfo! - totalCount: Int! ### UserEdge (OBJECT) Fields: - cursor: String! - node: User! ### UserExport (OBJECT) A persisted CSV export a user generated of their own account data. The file lives in R2; `url` resolves to an authenticated download endpoint on the account host that streams the CSV only to its owner. The user-side analog of {@link BusinessReport}. Produced by the `generate*Export` mutations on the public/account schema. Fields: - id: ID! - type: UserExportType! - rowCount: Int! - generatedAt: DateTime! - url: URL! ### UserExportType (ENUM) Which slice of a user's account data an export covers. Values: - purchases - reviews - sessions ### UserFilter (INPUT_OBJECT) Filter applied to a paginated user list. `query` matches the user's name or email. Input fields: - query: String ### UserSession (OBJECT) An active sign-in session for the viewer, backing a single issued auth token. Used to show a user where their account is signed in and to let them revoke a session. Viewer-owned — a user's sessions are never exposed to a business. Fields: - id: ID! - deviceLabel: String — Friendly device/browser label derived from the User-Agent (e.g. "Chrome on - ipAddress: String — Approximate IP address captured for this session. `null` when unknown. - createdAt: DateTime! - lastUsedAt: DateTime! - current: Boolean! — `true` for the session making the current request — the device you're ### WaitlistConfiguration (OBJECT) Fields: - enabled: Boolean! - automatic: Boolean! - countVisibility: WaitlistCountVisibility! - offerExpiry: Duration ### WaitlistConfigurationInput (INPUT_OBJECT) Input fields: - enabled: Boolean - automatic: Boolean - countVisibility: WaitlistCountVisibility - offerExpiry: DurationInput ### WaitlistCountVisibility (ENUM) Values: - visible - hidden ### WaitlistPromotionPaymentMethod (ENUM) Values: - pass — Pass-reserved waitlist row — the slot was decremented at join - membership — Membership-reserved waitlist row — same flow as a pass; the - free — Free activity — no payment required, promotion goes straight to - card — Card-on-file flow — either auto-charged (when a reserved or ### WaitlistPromotionPlan (OBJECT) What `promoteFromWaitlist` will do for a registration based on its intended payment method, the activity price, and any saved card on file. Returned by `ActivityRegistration.waitlistPromotionPlan` so the business UI can preview the effect of promotion before firing the mutation. Null when the registration is not waitlisted. Fields: - kind: WaitlistPromotionPlanKind! - method: WaitlistPromotionPaymentMethod! — How the registration will be paid for when promotion happens. - chargeAmount: Int — Amount that will be charged when `kind = autoCharge`. In subunits. - chargeCard: ReservedCard — Card the charge will be attempted against when `kind = autoCharge`. ### WaitlistPromotionPlanKind (ENUM) Values: - directConfirm — Free activity, or a registration that was already paid for via a - autoCharge — A saved card on file (reserved at join time or the customer's - emailOffer — An offer email will be sent and the participant must accept the ### WaitlistSetupIntent (OBJECT) SetupIntent client secret for capturing a card to reserve a paid waitlist spot. The card is attached to the customer's Stripe Customer record so it can be charged off-session if the spot is later promoted. Fields: - clientSecret: String! ### WebhookDelivery (OBJECT) One delivery of a domain event to a webhook endpoint. A row is created per subscribed endpoint when an event is emitted, then signed and POSTed by the delivery worker; the fields below capture the outcome of the latest attempt. Fields: - id: ID! - eventType: String! — Catalog event `type` key this delivery carries. - status: WebhookDeliveryStatus! - attempt: Int! — 1-based attempt counter — how many times delivery has been tried. - responseStatusCode: Int — HTTP status returned by the endpoint on the latest attempt, when one was - responseSummary: String — Short preview of the latest response body, or the error reason. - nextAttemptAt: DateTime — When the next retry is due, for a `failed` delivery awaiting backoff. - lastAttemptedAt: DateTime — When the latest attempt was made, if any. - createdAt: DateTime! ### WebhookDeliveryConnection (OBJECT) Fields: - edges: [WebhookDeliveryEdge!]! - nodes: [WebhookDelivery!]! - pageInfo: PageInfo! - totalCount: Int! ### WebhookDeliveryEdge (OBJECT) Fields: - cursor: String! - node: WebhookDelivery! ### WebhookDeliveryStatus (ENUM) Lifecycle of a single webhook delivery attempt. `pending` has not yet been sent; `failed` is awaiting a backed-off retry; `deadLettered` exhausted all retries (or its endpoint was disabled/deleted) and will not be retried. Values: - pending - succeeded - failed - deadLettered ### WebhookEndpoint (OBJECT) A partner-registered URL that receives signed deliveries for a chosen subset of the domain event catalog — the same event keys that drive journey triggers. Each endpoint has its own rotatable HMAC `signingSecret` used to sign deliveries. Fields: - id: ID! - business: Business! - url: URL! — Destination URL deliveries POST to. - managementUrl: ResourceUrl! — Canonical staff-admin page for managing this endpoint (distinct from `url`, - description: String — Owner-facing label for the endpoint. - signingSecret: String! — Per-endpoint HMAC signing secret (`whsec_…`). Verify the `Sessions-Signature` - subscribedEventTypes: [String!]! — Catalog event `type` keys this endpoint receives. - status: WebhookEndpointStatus! - apiVersion: String! — Payload schema version this endpoint receives, e.g. `2026-06-01`. - createdAt: DateTime! - updatedAt: DateTime! - deliveries(first: Int, after: String): WebhookDeliveryConnection! — Recent delivery attempts to this endpoint, newest first — the per-endpoint ### WebhookEndpointConnection (OBJECT) Fields: - edges: [WebhookEndpointEdge!]! - nodes: [WebhookEndpoint!]! - pageInfo: PageInfo! - totalCount: Int! ### WebhookEndpointEdge (OBJECT) Fields: - cursor: String! - node: WebhookEndpoint! ### WebhookEndpointStatus (ENUM) Whether a webhook endpoint is receiving deliveries. `disabled` keeps the row and its delivery history but pauses fan-out. Values: - enabled - disabled ## Embeddable components ### <sessions-schedule> Renders the same schedule shown on a business’s public Sessions page. Includes filters, day/week/month toggles, and a sign-in flow that lets visitors register without leaving the host page when an `auth` token is supplied. Set `structure="booking"` to present booking mode — a “what to book” chooser over a drag-to-select availability grid — for businesses that take appointments. Script: https://go.sessions.website/embeds/unstable/schedule.js Auth mode: optional-token Attributes: - business (required): Handle of the business whose schedule should be shown, without the leading `@`. - structure (default: schedule): Which surface to present. `schedule` (default) shows the session calendar. `booking` shows booking mode — a “what to book” chooser over a drag-to-select availability grid with Day, Week, and Month views — for businesses that take appointments. - auth: Optional embed-scoped JWT issued via the business-pinned sign-in flow. When set, registration actions are taken on behalf of the token holder. - persist (default: storage): How active filters are remembered across navigation. `storage` (default) uses sessionStorage; `url` writes filter state to the host page’s query string. ### <sessions-products> Lists the storefront products for a business. Each product card opens an embedded checkout when clicked. Filter by product type with the `type` attribute. Script: https://go.sessions.website/embeds/unstable/products.js Auth mode: optional-token Attributes: - business (required): Handle of the business whose products should be listed. - auth: Optional embed-scoped JWT. When omitted, the embed behaves like an anonymous shopper. - type: When set, restricts the catalogue to a single product kind. Values match the GraphQL `__typename` exactly. ### <sessions-reservations> Lists the current viewer’s registrations against all sessions on the parent business. Supports an inline cancel flow; pass `type="previous"` to render the historical view instead. Script: https://go.sessions.website/embeds/unstable/reservations.js Auth mode: required-token Attributes: - auth (required): Required embed-scoped JWT identifying the viewer. Issued by the business-pinned sign-in flow. - type (default: upcoming): Which slice of registrations to render. - page-size (default: 10): Maximum number of registrations to fetch in one page. ### <sessions-account> A condensed account dashboard for embedding inside a host’s member area. Combines user details, upcoming registrations, and active passes/memberships into a single component. Script: https://go.sessions.website/embeds/unstable/account.js Auth mode: required-token Attributes: - auth (required): Required embed-scoped JWT identifying the viewer. The embed renders nothing for unauthenticated requests. ### <sessions-active-products> A focused view of the viewer’s currently active purchases (passes and memberships only), grouped by business. Useful as a header strip on a member portal. Script: https://go.sessions.website/embeds/unstable/active-products.js Auth mode: required-token Attributes: - auth (required): Required embed-scoped JWT identifying the viewer. ### <sessions-user> A small visual element — typically placed in a header — that reflects whether the viewer is signed in via the embed-scoped auth flow. When the `auth` token is omitted or invalid, the element exposes a sign-in button that opens the business-pinned passkey ceremony. Script: https://go.sessions.website/embeds/unstable/user.js Auth mode: optional-token Attributes: - auth: Optional embed-scoped JWT. When omitted, the element renders the sign-in button instead of the user details.