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 COURSE services since staffMemberIds is ignored by the API. However, querying staff can still be useful for context (e.g., mentioning the instructor in the description).
For any fields the user did not explicitly specify:
| Field | Default | Notes |
|---|---|---|
| Capacity | 10 | defaultCapacity — required for COURSE |
| Online booking | Enabled | onlineBooking.enabled: true |
rateType: "FIXED" (for the entire course)rateType: "NO_FEE", options.inPerson: true, options.online: falseCRITICAL: COURSE services do NOT use staffMemberIds or sessionDurations. These fields are ignored. Use defaultCapacity instead.
Do not put session dates under course.sessions, CourseSession, or any similar nested field in the Services V2 create/update payload. Services V2 creates the course service and returns a service.schedule.id; it does not create bookable course sessions from nested course data. A course with no Calendar events can be created successfully but appear as ended or unavailable on the service page.
Paid course:
Free course:
staffMemberIds — it is ignored for COURSE servicesschedule.availabilityConstraints.sessionDurations — not used for COURSEcourse.sessions or inferred CourseSession objects in the service payload — accepted or ignored nested course data does not make sessions bookabledefaultCapacity is required — sets max participants for the entire coursebulkCreateEvents using the returned service.schedule.id (see Create and Update Booking Services)bulkCreateServices; continue by creating the Calendar events, then verify the service has future events before telling the user it is readySave the serviceId from the response: results[0].item.service.id
Save the service.schedule.id from the response for the follow-up bulkCreateEvents request.
If the user specified session dates, times, or a session count, create the course events immediately after the service exists:
results[0].item.schedule.id from the service create response.resourceId.bulkCreateEvents (POST https://www.wixapis.com/calendar/v3/bulk/events/create) with one event per course session.event.scheduleId to the course service's service.schedule.idevent.type to COURSEevent.resources to at least one resource object using a valid resourceIdIf the session details are missing, create only the service and clearly tell the user that the course still needs session events before it can be booked.
Provide a summary including:
Example:
I created "Yoga Teacher Training":
I assumed a capacity of 10 since you didn't specify. The price of $300 covers the entire course — customers pay once for all sessions. You can review and adjust the details in the service form.
Next step: You'll need to set up the course schedule (specific session dates and times) before customers can book it.
| Error | Cause | Action |
|---|---|---|
| 400 "INVALID_PAYMENT_OPTIONS" | Payment misconfigured | Free: inPerson: true, online: false. Paid: price > 0 |
| Course page says "Ended", "Beendet", or "This service is not available" after service creation | Service exists but no future course events were created on service.schedule.id | Create course events via Calendar Events bulkCreateEvents, then verify future events exist |
| 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 COURSE. Staff association is managed through calendar events.Last updated: 16 July 2026