Below are the recommended steps to successfully configure default business hours for Wix Bookings, which control the base availability shown in the "Set default hours" dashboard. This recipe covers the correct API usage, common pitfalls, and cleanup procedures for managing business schedule events.
13d21c63-b5ec-5912-8397-c3a5ddb27a97)Note: If you receive errors from Bookings APIs, the Wix Bookings app may not be installed on the site. Use List Installed Apps to verify, and Install Wix Apps to install it if missing.
Wix Bookings default business hours define the base availability for your booking system and appear in the Bookings dashboard under "Set default hours". These hours:
IMPORTANT: When Wix Bookings is first installed on a site, it automatically creates DEFAULT business hours — one recurring event per default working day. The exact days and times vary by site and template: a bare install creates Monday–Friday 10 AM–6 PM (per About Business Schedules), but template-created sites can differ (e.g. include Saturday). You CANNOT simply create new hours without handling these existing default hours first.
You MUST either:
Failure to handle existing hours will result in:
❌ WRONG API: Site Properties API (/site-properties/v4/properties/business-schedule)
✅ CORRECT API: Calendar Events V3 API (/calendar/v3/events)
WORKING_HOURS events on the business scheduleMASTER event creates one time slot in the dashboard4e0579a5-491e-4e70-a872-d097eed6e520VERIFIED: The business schedule external ID "4e0579a5-491e-4e70-a872-d097eed6e520" is universal across all Wix sites — documented in About Business Schedules ("The business schedule always uses the externalId value 4e0579a5-491e-4e70-a872-d097eed6e520").
This has also been tested and confirmed on multiple different Wix sites:
"business"id varies per site, the externalId is constant"4e0579a5-491e-4e70-a872-d097eed6e520" is verified to work across all Wix sites"recurrenceType": ["MASTER"] to focus on the primary recurring event definitions. ⚠️ It is a top-level request field, a sibling of query — placing it inside query.filter is silently ignored (the call succeeds and returns INSTANCE events), so a wrong placement produces confusing results rather than an error4e0579a5-491e-4e70-a872-d097eed6e520 only in the externalId filter of querySchedules. Passing it as an event's scheduleId fails with 404 Schedule with 4e0579a5-... ID not found (and as a resources[].id, with a similar Resource ... not found) — events take the schedule's real id returned by that queryQuery the business schedule that controls default hours using the fixed external ID.
Endpoint: POST https://www.wixapis.com/calendar/v3/schedules/query
Use querySchedules API (REST) with filter:
externalId: "4e0579a5-491e-4e70-a872-d097eed6e520"Keep the returned schedule.id for creating events.
🚨 CRITICAL STEP: You MUST query for existing WORKING_HOURS events because Wix Bookings automatically creates default hours upon installation.
Endpoint: POST https://www.wixapis.com/calendar/v3/events/query
Use queryEvents API (REST):
Query pattern:
Important: Always query for MASTER events specifically to see actual recurring schedules.
Expected Result: One MASTER event per default working day. Don't assume which days: a bare Bookings install has Monday–Friday, but template-created sites can carry a different set (e.g. Monday–Saturday), and times vary by site — this query is what tells you what's actually there. The response fields this flow reads (trimmed — real responses carry more):
events[].id; updates also need that event's current revision.recurrenceRule.days tells you which weekday each event covers; start/end localDate carry the current hours in the schedule's timeZone.Based on the existing hours found in Step 2, choose one approach:
If you want to modify the times but keep the same days, update the existing events.
If you want completely different days/times, delete existing events and create new ones.
Endpoint: POST https://www.wixapis.com/calendar/v3/bulk/events/update
Use bulkUpdateEvents API (REST) with fieldmask pattern:
Update fields:
start/end: New timesrevision: Current revision number (from Step 2 query)fieldmask: "start,end"Example: Change Monday hours to 8 AM-4 PM (use a Monday that is today or in the future — a past start is rejected for recurring events):
Cancelling is irreversible — a cancelled event can only be replaced by creating a new one. When the user names their complete desired schedule (e.g. "Monday through Friday, 8-4"), replacing all existing hours — including days outside that set — is part of the request. If it's ambiguous whether hours on other days should be kept, ask the user instead of assuming.
Cancel existing MASTER events using bulkCancelEvents API (POST https://www.wixapis.com/calendar/v3/bulk/events/cancel) (REST):
Create WORKING_HOURS events for each day using bulkCreateEvents API (POST https://www.wixapis.com/calendar/v3/bulk/events/create) (REST). Note the request envelope: each event is wrapped in an event object — a flat event fails with 400 event must not be empty.
scheduleId is the business schedule's real id from Step 1 — not the universal external ID (that constant is only the querySchedules lookup key; used here it 404s).scheduleOwnerId/externalScheduleId are derived by the server; you do not need to send them.recurrenceRule.days takes exactly one full uppercase day name (MONDAY…SUNDAY); create a separate event per weekday, with start/end today or in the future.results[i].itemMetadata.success (and bulkActionMetadata.totalFailures) before reporting the hours as set.Query the business schedule events again to confirm:
"App not installed" Error (428):
Duplicate time slots in dashboard:
Updates not reflecting in dashboard:
fieldmask includes the fields you're changingCannot create events in the past:
start.localDate to current date or futureBusiness schedule not found:
4e0579a5-491e-4e70-a872-d097eed6e520Working hours not affecting staff/services:
usesDefaultWorkingHours: trueLast updated: 10 September 2026