Multi-location enterprise: location-locked users and embeds
How to run 5, 20, or 40 branches under a single account: per-location users, per-branch website embed, central location picker
Multi-location enterprise
Use this layout when one business brand operates many physical branches (e.g. 40 standalone massage studios or hair salons), each with its own website that takes bookings, plus a central owner who oversees everyone.
The base setup
- 1 account (tenant) runs everyone. Data is shared (one customer base, one service catalog) but bookings can be split per location.
- 1 OWNER user (the central owner): sees everything, switches between branches, reports are aggregate.
- N location users: each sees only their own branch's calendar, bookings, customers. Other branches are invisible.
- Per-location embed: each branch's website hosts its own iframe snippet that only shows that branch's slots.
- Central location picker:
bookinda.hu/{tenant-slug}/locations— visitors pick a branch and book.
Use cases
Case 1: Network operator with 40 branches
A nationwide business, each branch with a manager and mixed staff. Owner wants central visibility, branches manage their own data only. → Exact fit.
Case 2: 2 cities, 4 locations
A brand operating in two cities, 2 branches per city. Add a regional MANAGER, then a SELECTED-location user per branch. The MANAGER sees their region, the branch user only their branch. → Works.
Case 3: Per-branch websites
Each branch has its own subdomain or website. Each must embed the booking widget locked to that branch — visitors must never reach another branch's slots by accident. → That's what location-locked embeds are for.
Step-by-step setup
1. Create locations
Settings → Locations → add each branch with name, code, address, phone, hours. Detailed article
2. Assign staff to locations
Team → staff member → Locations tab. Assign each person to their branch. A staff member can belong to multiple locations if they rotate.
3. Create a location-scoped user
For the branch manager:
- Team → add new staff (e.g. "Branch Downtown manager")
- Their profile → Access tab → Locations
- Select Selected locations only
- Tick the one branch they belong to
- Save
When this user logs in, the location switcher in the top bar shows only their branch name and is read-only. Calendar, bookings, reports filter to their branch automatically, even if they try direct URLs.
4. Copy per-location embed code
Settings → Online booking → Widget → scroll to "Per-location embed codes". Each branch has a separate <iframe> snippet with locationId and lockLocation=1. Copy and paste into the matching branch website.
5. Central location picker
Send visitors to https://bookinda.hu/{tenant-slug}/locations — they see a card list of all branches and pick to start booking pre-filtered to that branch.
What a location-locked user sees
- Calendar: only their branch's appointments
- Team list: only staff at their branch (filtered)
- Customer history: only the customer's appointments at their branch (backend filters automatically)
- Reports: only their branch's numbers
- Cash register, invoices: branch-specific data
Switcher is read-only. If they try to URL-hack another branch, the backend returns 404 / empty.
Tips
- No per-location email sender: notification emails go from one central address (e.g.
[email protected]); the branch name appears in the email body. - Owner gets every notification: the OWNER user receives alerts for all branches.
- Staff can work at multiple locations: tick multiple branches in their location assignment.
- Booking link supports a location parameter:
?location={locationId}— deep-link to a specific branch's booking page. - Embed's
lockLocation=1is critical: without it visitors could switch branches inside the iframe. Always keep it. - Launching a new branch: create the Location, assign staff, generate the embed snippet, create a SELECTED-location user. ~5 minutes.
- Scale: tested through 40+ branches. For 100+, consider regional MANAGER + per-branch STAFF tiers.
Limits
- A customer is shared tenant-wide: if a customer books at branch A then B, B sees their history. Intentional: customer data is brand-wide.
- Service catalog is shared too: services are tenant-level. If a service runs only at one branch, mark it as available there only via LocationService overrides.
- Currency and timezone can differ per branch: both are settable on the Location record.