Run these queries to collect site data for informed defaults.
Warn the user if a service with a similar name already exists.
Note: Staff queries are optional for CLASS services since staffMemberIds is ignored by the API. However, querying staff can still be useful for context (e.g., mentioning instructors in the description).
For any fields the user did not explicitly specify:
| Field | Default | Notes |
|---|---|---|
| Capacity | 10 | defaultCapacity — required for CLASS |
| Online booking | Enabled | onlineBooking.enabled: true |
rateType: "FIXED" (per session)rateType: "NO_FEE", options.inPerson: true, options.online: falseCRITICAL: CLASS services do NOT use staffMemberIds or sessionDurations. These fields are ignored. Use defaultCapacity instead.
Paid class:
Free class:
staffMemberIds — it is ignored for CLASS servicesschedule.availabilityConstraints.sessionDurations — not used for CLASSdefaultCapacity is required — sets max participants per sessionbulkCreateEvents using the returned service.schedule.id (see Create and Update Booking Services)Save the serviceId from the response: results[0].item.service.id
Provide a summary including:
Example:
I created "Vinyasa Yoga Class":
I assumed a capacity of 10 since you didn't specify. You can review and adjust the details in the service form.
Next step: You'll need to set up the class schedule (days and times) in the service form.
| Error | Cause | Action |
|---|---|---|
| 400 "INVALID_PAYMENT_OPTIONS" | Payment misconfigured | Free: inPerson: true, online: false. Paid: price > 0 |
| 403 | Permission denied | Inform user they lack permission |
| rateType | options.online | options.inPerson | Valid? |
|---|---|---|---|
| FIXED | true | false | ✓ |
| FIXED | false | true | ✓ |
| FIXED | true | true | ✓ |
| NO_FEE | false | true | ✓ |
| NO_FEE | true | false | ✗ |
| Any | false | false | ✗ |
staffMemberIds is ignored for CLASS. Staff association is managed through calendar events.Last updated: 22 June 2026