Staff Management
Overview
Staff members are the people in your organization who provide services to clients. Each staff member:
- Has their own schedule and availability
- Can be assigned to specific services
- Has a role (owner or staff)
- Has their own public profile page on the booking site
Inviting Staff
Generate an invite code
POST /api/org/invite-code/generate
Authorization: Bearer your-owner-token
Share the returned code with the person you're inviting. They use it to join your organization.
Invite by email
You can also invite directly by email:
POST /api/org/auth/invite
Authorization: Bearer your-owner-token
Content-Type: application/json
{
"email": "[email protected]"
}
Joining via invite code
The invitee registers or logs in, then submits a join request:
POST /api/org/join-requests
Authorization: Bearer their-token
Content-Type: application/json
{
"invite_code": "ABC123"
}
As an owner, approve or reject pending join requests:
GET /api/org/join-requests # list pending requests
POST /api/org/join-requests/{joinRequest}/approve # approve
POST /api/org/join-requests/{joinRequest}/reject # reject
Managing Staff
List staff
GET /api/org/staff
Authorization: Bearer your-token
Create a staff member directly (owner only)
If you want to create a staff account without the invite flow:
POST /api/org/staff
Authorization: Bearer your-owner-token
Content-Type: application/json
{
"name": "Alex Johnson",
"email": "[email protected]",
"phone": "+998901234567",
"role": "staff",
"bio": "Experienced barber with 5 years of experience",
"position": "Senior Stylist"
}
Update a staff member
PUT /api/org/staff/{staff}
Authorization: Bearer your-token
Content-Type: application/json
{
"name": "Alex Johnson",
"position": "Lead Stylist",
"bio": "Updated bio"
}
Activate / Deactivate
Deactivating a staff member removes them from the booking flow — clients can't book with them, but existing appointments are preserved.
POST /api/org/staff/{staff}/activate
POST /api/org/staff/{staff}/deactivate
When to deactivate: when a staff member goes on leave or leaves the company. Don't delete — deactivate to keep appointment history intact.
Staff Roles
| Role | Capabilities |
|---|---|
owner | Full access: manage staff, settings, billing, payment credentials, invite codes |
staff | Manage appointments and their own availability; view-only on most org settings |
Roles are set per-organization — a person can be an owner in one org and staff in another.
Assigning Services to Staff
Each staff member must be assigned to the services they can provide. Without an assignment, they won't appear in the booking flow for that service.
# View current service assignments
GET /api/org/staff/{staff}/services
# Assign services (replaces existing assignments)
POST /api/org/staff/{staff}/services
Authorization: Bearer your-token
Content-Type: application/json
{
"service_ids": [1, 2, 3]
}
Alternatively, assign staff from the service side:
POST /api/org/services/{service}/staff
Content-Type: application/json
{
"staff_ids": [1, 2]
}
Tip: When you add a new service, immediately assign it to the relevant staff members — otherwise it won't show up as bookable.
Staff Availability
Each staff member needs a schedule for slots to be generated. Manage schedules under the schedule endpoints (see Services & Scheduling).
You can view a staff member's computed availability:
GET /api/org/staff/{staff}/availability
Staff Profiles
Each staff member has a public profile page visible to clients. Encourage staff to fill in:
- Photo — essential for trust
- Bio — briefly describe expertise and experience
- Position — their role/title at the business
Clients can filter by staff member when booking, so a complete profile increases bookings.
Batch Operations
Update or remove multiple staff members at once:
POST /api/org/staff/batch-update
Content-Type: application/json
{
"ids": [2, 3],
"data": { "is_active": false }
}
POST /api/org/staff/batch-destroy
Content-Type: application/json
{
"ids": [4, 5]
}
Use batch-destroy with caution — it's permanent. Prefer deactivation when you want to preserve history.