User guide for organizations that run bookable workshops and services.
The tenant web app helps a business that sells bookable workshops or services (shown in the UI as Services) to:
Each organization uses its own subdomain (for example https://your-studio.wbc-digital.cloud in production, or https://your-studio.localhost locally). You sign in on the accounts host first, then open a workspace; you are redirected to that tenant’s URL.
In the tenant app header you get: page title, optional Switch Workspace (only if your account has more than one active workspace), your profile menu (account settings, a Notifications item, Workspaces to open the account workspace picker, and Log out), plus banners when impersonation or organization deletion applies. The Notifications entry may not yet link to a full inbox—use your organization’s real notification channels where it matters.
Customers who only book public workshops typically use your public booking or e-commerce flow. This guide focuses on people who use the management application.
The product does not hard-code only two job titles. It uses profiles (roles) and fine-grained permissions (for example booking:view, workshop:edit). What you see in the sidebar depends on your permissions.
| Typical administrator | Typical staff member |
|---|---|
| Organization Settings (name, contact, defaults) | Bookings list and calendar |
| Users (invite, edit, deactivate) | Customers (view, create, or edit as allowed) |
| Profiles (define roles and permissions) | Day-to-day booking updates |
| Locations, Services, Sessions, Resources setup | Often narrower access to services and locations |
| API keys or advanced options (often global owner only) | Operates within assigned locations and services |
Some capabilities are tied to the global owner flag on your user record: API Keys and Support Access tabs in Settings appear only for global owners. Delete Organization (in Settings → Organization Profile → Danger Zone) requires both global owner and the settings:delete permission; the UI describes a 30-day grace period before deletion.
On Users → Invite user (/users/new), you choose a profile (role), then scope locations and services with “all” or specific checkboxes. Optionally you can create a linked staff resource for capacity. The invitee must accept using the emailed link before they can sign in.
Identity and workspace selection happen on the accounts host (for example locally https://accounts.localhost, or in production https://accounts.wbc-digital.cloud). Your workspace runs on its own subdomain; you usually reach it after you choose an organization on the accounts site.
?redirect=... (for example after the tenant app sent you back to authenticate), that URL is kept and used after sign-in.
After onboarding submits successfully, the browser is sent to your new tenant subdomain with an auth callback so you arrive signed in.
Account routes (on the accounts host) include: /login, /register, /verify, /select-tenant, /onboarding, /forgot-password, /reset-password, /confirm-invitation, /accept-invitation.
Invitation links use a token on the accounts site:
| Flow | Purpose |
|---|---|
| Confirm invitation (new user) | Validate the token, then set name and password. If the email already has an account, you may be redirected to the “existing user” acceptance flow. |
| Accept invitation (existing user) | Review and accept. The app then sends you to the accounts /login page to sign in; after that, use Select workspace or your bookmarked tenant URL. If the token was meant for a brand-new user, you are redirected to Confirm invitation instead. |
An accept invitation route may also exist on your tenant subdomain when the invitation link points there.
Edge case: ?skip_session_check=1 on login can skip the “already signed in?” check (for example after logout flows).
Every area below is gated by permissions (for example location:create, settings:view). If a sidebar item is missing, your profile does not grant it. The Settings page itself requires settings:view; saving changes requires settings:edit.
/settings, Defaults tab): set default language, currency, and timezone for the whole organization./locations): add every site or room where sessions run—services and bookings depend on these./resources) and Capacity Management (/resources/capacity): define resources and rules before you rely on resource-based capacity on services./services): create bookable services (add sessions, variants, pricing, and scheduling rules)./sessions): optional central list of scheduled instances; many teams also manage sessions from within each service./profiles): define roles (which permissions each role has)./users/new): invite staff and assign profile, locations, and services.Main Navigation: Dashboard — Bookings (All Bookings, Calendar) — Customers — Services — Sessions.
Management: Resources (All Resources, Capacity Management) — Locations — Profiles — Users — Settings.
Open Settings from the sidebar. Tab strip depends on whether you are the global owner:
settings:view: Organization Profile (organization name, email, phone, Organization ID; includes Danger Zone for delete) and Defaults (app language, currency, timezone).settings:delete; you must type the organization name to confirm; a 30-day grace applies per the on-screen description; pending deletion can show a banner below the header.
Create and edit profiles; assign permissions by module (booking, customer, workshop or service, session, resource, capacity rule, location, profile, user, settings, dashboard). Granting create, edit, or delete usually implies view for that module where the UI enforces it.
Invite by email, choose a profile, assign locations and services (all or selected). Optionally configure a staff resource for capacity.
Maintain places where services run; used in services, sessions, and bookings.
Routes live under /services (list, new, view, edit). In the UI, Service type is offered as Class (the catalog is defined in code as that option). Booking type is shown as Regular Booking or Instant Booking.
View and manage scheduled instances across the business (subject to session permissions).
Define resources and capacity rules. Services can reference rules when capacity is resource-based. Changing capacity may show impact warnings if existing bookings would be over capacity.
Customer records for bookings; capabilities depend on customer permissions.
All bookings (/bookings): search, filters, saved column layouts, bulk actions where enabled, and Export. New booking is at /bookings/new if you have booking:create. Calendar (/bookings/calendar): schedule view. If Shopify is integrated, a Sync Shopify control can appear on the bookings screen. Status values are PENDING, CONFIRMED, CANCELLED, COMPLETED. Bookings can include guests, line items, notes, tags, and private bookings.
With dashboard permission: summary metrics and charts (customers, revenue, bookings, trends, activity—depending on data).
A public booking widget loads a service by id and lets customers pick date, optional location, session, and quantities. A demo route exists at /widget-demo/:id in the app shell; production embedding depends on your site and API base URL. Configure services, sessions, and capacity so slots and “remaining spots” match reality.
Merchants may use URL parameters such as ?shop=.... Ensure the integration is installed and bookings sync as expected for your workflow.
Staff often have booking, customer, and calendar access, and may have view-only or limited edit rights on services. The sidebar only lists modules your profile allows.
Visiting the site root (/) does this automatically: if you have dashboard:view, you go to /dashboard; otherwise the app picks the first matching route in this order—Customers (view or create), Bookings (view or create), Services, Sessions, Resources (including capacity views), Locations, Users, Profiles, Settings—using the first path your permissions allow. If none apply, you land on /unauthorized (“Access Denied”).
Switch Workspace in the header appears only when your account has more than one workspace. Otherwise use Workspaces in the profile menu to open the accounts Select workspace page.
/bookings) to find reservations (filters and search)./bookings/calendar) for a visual schedule./bookings/:id).booking:edit, per your business rules.booking:create, use New booking (/bookings/new) for walk-ins or phone bookings.
Search before creating duplicates. Create or edit records if your role allows.
View services to answer customer questions. Escalate configuration errors to an administrator if you cannot edit services.
You may have view access or none; capacity setup is usually administrative.
Often not available to pure staff. Ask an administrator to change your profile or assignments.
Open your avatar menu for Account Settings, Notifications (placeholder may not list messages yet), Workspaces (opens the accounts site to pick another organization), and Log out (returns you toward the accounts login flow). Banners below the header can warn about user or organization pending deletion—follow internal procedures.
To sign in again you normally use the accounts URL for your environment. If an on-screen button says “Go to Login” but nothing happens, use Log out or open your saved accounts link manually.
During impersonation, an Exit control and banner can appear; workspace switching may be hidden. Support sessions can grant broad access—follow your organization’s policy.
| Issue | What to check |
|---|---|
| Kicked to accounts login or “Validating session…” forever | Session cookie invalid or expired. Sign in again on the accounts host. If you changed domains, clear site data for the old host. |
/unauthorized (“Access Denied”) |
You are signed in but this URL or your landing page needs a permission you lack. Ask an admin to update your profile, or use Workspaces / Switch workspace if you meant another organization. |
| Missing sidebar items | Your profile does not grant any permission in that module (for example workshop:view for Services). |
| Cannot open Settings at all | You need settings:view. Editing values needs settings:edit. API Keys / Support Access require global owner. Delete Organization needs global owner + settings:delete. |
| Wrong times on bookings | Organization timezone and clarity between local time and stored time. |
| Public widget shows no slots | Service status, sessions in range, cutoff and look-ahead, and capacity. |
| Failed to load tenants on accounts site | Session invalid; sign in again. Check network and correct accounts URL. |
| Invitation link invalid or expired | Request a new invitation from your administrator. |
| Verification code expired | Request a new code from the verify screen (resend) or start registration again. |