TemplateOpen sourceAPI
Bali Villa Rentals — open-source villa booking template
The seventh open-source Opencals template is live, and the first one built around nightly stays. Bali Villa Rentals is a villa-rental website for a demo resort, Lumbung Sidemen: ten villas in the rice fields of East Bali. The same Storefront API and typed TypeScript SDK as the other templates, with a warm, quiet design and every nightly rate on show.- Booked by the night — each villa is one staffless product with a one-night base duration,
allowCustomDuration, and fixed check-in 15:00 / check-out 11:00, on a continuous 24/7 schedule - Calendar on live availability — reads
getCurrentAvailabilitiesMergedand checks on the client that check-in → check-out fits inside one range - Turnover days — a check-out day can be the next guest’s check-in day
- Guest details as custom attributes — adults, children, infants, arrival time, flight number and occasion
- Per-stay extras (airport transfer, floating breakfast, early check-in request), checkout questions and promo codes
- Trip-aware customer accounts: dates in the resort timezone, night count, change dates (same number of nights) or cancel up to 14 days before check-in
- Passwordless login and one-time email links
LodgingBusiness,VacationRentalandFAQPagestructured data, Open Graph,robots.txtandsitemap.xmlconfigured- Stack: Next.js 15, TypeScript, Tailwind v4, Framer Motion,
@opencals/storefront-sdkv0.3.17 - MIT licensed — clone, rebrand, deploy. One-click Vercel deploy.
Villa-resort seed dataset
New Dev Stores can choose the Bali Villa Rentals dataset (category Villa resort,villa_resort). It seeds ten villas on a 24/7 schedule with fixed
check-in and check-out, four collections, per-stay extras, checkout questions
and sample stays, so the template matches the demo out of the box.Fixed check-in and check-out are now enforced
Products with custom duration and fixed times (fixedTimes,
fixedStartTime, fixedEndTime) now have those times enforced by the server.
A customer booking must start at fixedStartTime and end at fixedEndTime in
the product’s schedule timezone (the store timezone if the product has no
schedule), or the API returns 400. This applies to creating an appointment
(POST /storefront/appointments, with or without a cart) and to customer
reschedules (PUT /storefront/appointments/{appointmentId}/reschedule). Bookings and reschedules made by the
merchant in the dashboard are exempt, so you can still give a guest an early
check-in or a late check-out.A fixed-times stay is priced by whole nights: a 15:00 → 11:00 stay of N nights
is shorter than N × 24 hours and is charged as N nights. No SDK changes. If your
site already sends check-in → check-out slots built from the product’s fixed
times, nothing changes for you.Live demo ↗ ·
GitHub ↗ ·
Template docs