Bookings
Calendar Export (iCal Subscription)
Last updated 19 May 2026
Calendar Export (iCal Subscription)
Subscribe your personal Google Calendar, Apple Calendar, Outlook, or any iCal-compatible app to your OpenChair bookings via a signed feed URL. Read-only, per-staff, with optional client-name privacy. Distinct from the two-way Calendar Sync — this is a lightweight one-way mirror.
Where to find it — Web: Settings → Calendar sync → Other ways to subscribe (collapsed accordion below the primary Calendar Sync card). Mobile: Calendar sync screen → same accordion.
TL;DR
- One-way read-only mirror of your bookings to your personal calendar.
- Each staff member has their own signed iCal URL.
- Optional Include client names toggle (off by default for privacy).
- 30 days back to 12 months ahead window. All plans.
- For two-way sync (push bookings out + block bookable slots from external events), use Calendar Sync instead.
iCal Subscription vs Calendar Sync
| Feature | iCal Subscription (this doc) | Calendar Sync |
|---|---|---|
| Direction | One-way (OpenChair → your calendar) | Two-way (push bookings out + pull external events to block slots) |
| Supported apps | Any iCal-compatible app — Apple Calendar, Google, Outlook, Fantastical, Thunderbird | Google + Microsoft Outlook only |
| Auth | HMAC-signed URL | OAuth |
| Read/write | Read-only | Read + write |
| Refresh | Your calendar app polls (hours to a day) | Live push notifications + cron fallback |
| Tier | All plans | Google FREE, Microsoft PRO |
| Use case | Lightweight glance at your schedule from your own calendar | Full two-way integration with conflict detection |
Most operators want Calendar Sync. iCal Subscription is for:
- Calendar apps that aren't Google or Outlook
- Lightweight one-way visibility (e.g. a stylist who just wants to see their roster in Apple Calendar without bidirectional sync)
- Backup view if Calendar Sync OAuth lapses
Getting your iCal URL
- Open Settings → Calendar sync.
- Expand Other ways to subscribe.
- Copy your personal URL:
https://openchairpro.com/api/calendar/{staffId}/{token}.ics - Paste into your calendar app's "Subscribe to calendar" dialog.
The URL is per-staff, not per-venue. Each team member gets their own URL with their own bookings only.
Apple Calendar (macOS / iOS)
- Mac: File → New Calendar Subscription → paste URL → Subscribe
- iOS: Settings → Calendar → Accounts → Add Account → Other → Add Subscribed Calendar → paste URL
Google Calendar
- Open Google Calendar on web (not the app — Google forces the add-by-URL flow through the web UI).
- Other calendars → + → From URL → paste → Add calendar.
- Mobile Google Calendar app then picks up the subscribed calendar automatically.
Outlook
- Outlook desktop / web → Add calendar → Subscribe from web → paste URL → save.
Any other iCal app
If the app supports "Subscribe to calendar from URL", paste your URL. The feed is RFC 5545-compliant iCal.
Privacy: client names
Toggle Include client names under your iCal feed config:
| Setting | Event summary on your personal calendar |
|---|---|
| Off (default) | Balayage (service name only) |
| On | Sarah J — Balayage (redacted name + service) |
Names are redacted to first name + last initial when on (redactName helper) — not full names. The UI warns: "Only enable this if your personal calendar is private" since iCal URLs are sometimes scraped by enterprise calendar systems or shared accidentally.
If your personal calendar is shared with family, colleagues, or company management, leave it off — they don't need to see your salon's client roster.
Regenerating your URL
If your URL is compromised (you shared it accidentally, posted on a public forum, etc.):
- Settings → Calendar sync → Regenerate iCal URL
- Confirm — old URL stops working immediately.
- Copy the new URL and update your calendar app subscription.
Regenerating issues a new salt that invalidates every previously-distributed URL for your staff record.
What's in the feed
- Window: 30 days back to 12 months ahead. Older / further-out bookings not included.
- Status filter: includes
pending,confirmed,arrived,cancelled,no_show. - Status mapping:
pending→ TENTATIVE;cancelled/no_show→ CANCELLED; others → CONFIRMED. - Timezone: each event has
DTSTART;TZID={venueTimezone}plus a properVTIMEZONEblock with DST transitions, so apps display the correct local time wherever you are. - Title: service name (+ redacted client name if toggle is on).
- Status changes: the next time your calendar app polls, updated bookings update on your side too.
Caching and refresh
We send Cache-Control: no-cache, no-store, must-revalidate so your calendar app doesn't cache the feed. But how often it asks for an update is up to the app:
- Apple Calendar: hourly by default (configurable in Calendar → Preferences → Accounts → Refresh Calendars)
- Google Calendar: every few hours; controlled by Google, no user setting
- Outlook: variable; typically every 1-6 hours
- Fantastical, Thunderbird: configurable in each app
If you need real-time sync, use Calendar Sync (two-way OAuth integration).
Read-only
The iCal feed is one-way. You can't:
- Drag an event in your personal calendar to reschedule the booking
- Cancel a booking from your calendar
- Add events to OpenChair from your calendar (use Calendar Sync for that)
If your calendar app lets you "edit" the event, the edit stays local — it doesn't sync back to OpenChair, and the next refresh overwrites it.
Tier
All plans. No PRO requirement.
Multi-venue
If you have access to multiple OpenChair venues, each venue generates a separate iCal URL for your staff record at that venue. Subscribe each separately.
Security
- HMAC-SHA-256 signed with platform secret
- Per-staff salt makes URLs unguessable
- Regenerate at any time to invalidate compromised URLs
- UUID-shape pre-check rejects bot probes before the database
- Timing-safe signature comparison
Common mistakes
| Problem | What to check |
|---|---|
| Subscription added but no events show | Confirm the URL was pasted correctly. Try the URL in your browser — it should return iCal text. Wait for your calendar app's next refresh. |
| Old bookings still show after cancellation | Cancelled bookings stay in the feed as CANCELLED until they age out of the window. Most calendar apps strike them through. |
| Events show wrong time | Check the time zone on your calendar app. Each event has a venue-timezone TZID; your app needs to honour it. |
| Want to see other staff's bookings | iCal feed is per-staff. To see venue-wide bookings, use the OpenChair web/mobile calendar directly. |
| URL doesn't work in browser | Confirm the URL is complete — copy from the settings page, don't reconstruct. |
| Refresh is too slow | Calendar apps decide their own refresh cadence. For real-time, use Calendar Sync (two-way OAuth). |
FAQ
How is this different from Calendar Sync?
Calendar Sync is two-way (Google + Outlook) — bookings push out and external events block your bookable slots. iCal Subscription is one-way read-only — you subscribe your personal calendar to OpenChair's feed and see bookings mirrored, but nothing flows back. For most operators, Calendar Sync is the better choice; iCal is for when you want a lightweight one-way mirror or when you're using a non-Google/non-Outlook calendar app.
Where do I get my iCal URL?
Settings → Calendar sync → expand 'Other ways to subscribe'. Each staff member has their own personal URL (signed with their staff ID + a salt). Copy the URL and paste it into your calendar app's 'Add subscription' or 'Subscribe to calendar' dialog.
Will my customer's name show up on my personal calendar?
Only if you toggle 'Include client names' on for your feed. Off by default — your subscribed calendar shows just the service name ('Balayage'). Toggle on to see 'Sarah J — Balayage'. The privacy hint says 'Only enable this if your personal calendar is private.'
How often does the calendar refresh?
Depends on your calendar app. Google Calendar polls roughly every few hours; Apple Calendar hourly by default (configurable); Outlook variable. The feed itself is fresh on every request — we just can't force your app to refresh faster than it wants to.
Can I subscribe my customers to my schedule?
No — the feed is private to you (signed per-staff). For sharing your schedule with customers, use your storefront's booking page — they see real-time availability there.
What if my iCal URL leaks?
Regenerate from Settings → Calendar sync → Regenerate iCal URL. The old URL stops working immediately. Update your calendar app with the new URL.