Help · Schedule.software

Everything you need to run this, on one page.

This is one thick reference, not nine thin stubs. Each section below composes from the same material the rest of the site draws on — nothing here is written twice.

Onboarding today is a guided conversation, not a self-serve wizard: general self-serve tenant provisioning is in active development.

Getting started

The ten-step checklist for a new tenant.

Admin setup

SSO, rostering, and module toggles for a school or ops admin.

Embedding

Inline and popup booking-widget snippets for your site.

White-label

Branding at the Pro tier — not paywalled to the top.

Per-surface how-to

All eight booking surfaces, one at a time.

FAQ

Common questions, answered once.

Troubleshooting

Edge cases and the 409 reasons.

Data & privacy

What a booking record holds, for a district DPO.

Getting started

Ten steps, honestly staged.

  1. Book a conversation — mailto:[email protected].
  2. Pick the one surface that hurts most.
  3. Connect SSO / rostering; roster import routes through the consent chokepoint.
  4. Confirm the consent posture: identity stripped at the server, the family wall.
  5. Publish availability.
  6. Test a booking — the partial-unique index and capacity-under-lock hold from the first one.
  7. Subscribe to the .ics feed (opaque labels, no names).
  8. Add a custom domain, and white-label branding if you are on Pro or above.
  9. Embed the booking widget on your own site.
  10. Reserve early access for the in-development pieces you will want next.

The full /start walkthrough →

Admin setup

SSO, rostering, and module toggles.

Clever and ClassLink SSO connect at the district or school level; roster import always routes through the consent chokepoint — never a raw paste of student names. Each booking surface is a module toggle: enable conference booking without enabling the master schedule, or vice versa. District → school scope hierarchy governs who can toggle what.

Embedding

Put a booking surface on your own site.

An inline embed renders the booking widget directly in a page region; a popup snippet opens it in an overlay from a button or link. Both point at the same availability engine as the hosted booking page — no separate integration to keep in sync.

White-label

Branding at the Pro tier, not the top tier.

Custom domain and branding are not locked behind an enterprise contract. A solo professional on the Personal tier gets a custom domain; a business on the Pro tier gets white-label branding — your logo, colors, and the “Powered by” badge gone. The platform is also designed to be licensed as an engine at Enterprise: one codebase, no separate fork. These tiers are the planned launch pricing, not a live checkout today.

Custom domain

On every plan, the free tier included.

Most scheduling tools reserve a custom domain for a paid — often enterprise — tier. In the planned pricing here it sits on the free Personal tier instead of behind an upsell. These figures are the planned launch tiers, not a live checkout today. Claim a hostname, verify it, and your booking pages and .ics feed serve from your own domain.

Per-surface how-to

All eight booking surfaces, one at a time.

Who books on each surface, and what the record holds
SurfaceWho booksWhat the record holds
Picture-day family bookingA guardian, for their own childSlot, capacity, booking state
Parent-teacher conferencesA guardian, against staff-published hoursPublished-minus-booked slots, an opaque .ics feed
Admissions interviews & toursAn admissions owner, for a prospective familyAn opaque lead reference — no student census
Academic master scheduleA scheduler, reviewed by a human before it commitsA proposed timetable and what it could not place
Volunteer & student-helper shiftsA volunteer or student helper, per shiftShift claims, gated on verification status
Staff & substitute schedulingAn administrator, HR-gatedStaff and substitute assignments
Photo-crew dispatchA studio owner, for their own crewJobs, assignments, credential facts about adults
Facilities & resourcesBooking staff, for rooms and equipmentResources and their windows — never a public roster

FAQ

Common questions

What does “one engine, every occasion” mean in practice?

The same canonical slot/booking/availability primitive — the thing that tracks open slots, enforces capacity, prevents double-booking, and manages booking state — is composed into every booking surface: parent-teacher conferences, admissions tours, picture-day sitting appointments, and the facilities booking calendar all share it. It is not the same code copy-pasted eight times; it is one primitive composed into eight contexts through a single interface. The benefit is that a correctness guarantee earned in one context — the partial-unique index that prevents double-booking, the transactional capacity count — is the same guarantee that holds in every context that composes the same engine. A school can enable one surface or all of them.

How exactly does no-double-booking work? Is it enforced in application code?

No. The no-double-booking guarantee is a partial-unique index at the database: a UNIQUE constraint on (event_id, student_id) WHERE status <> ‘cancelled’. A second live booking for the same student at the same event triggers a unique violation at the database; the engine catches it and returns a clean 409 with reason ‘already_booked’. This holds even under concurrent inserts from two different request threads, because the constraint is at the database, not in application-level conditional logic that a race condition could bypass. Two families racing the last appointment both get a clean, retryable conflict — never an over-book, never a 500.

What is the family wall? How does it prevent a guardian from booking for another family’s child?

The family wall means a guardian can only book for their own claimed child. The student ID is resolved from a hash-verified claim established during the family onboarding flow — it does not come from the request body, where a guardian could supply any student ID. Cross-family and cross-school access both return a uniform 404: the response is identical whether the booking does not exist or belongs to another family, so the surface is never an oracle for roster enumeration. There is no open sign-up sheet to browse.

What does the .ics calendar feed contain? Why are there no names?

The subscribable .ics feed delivers calendar events with opaque labels. The SUMMARY field is a non-PII label; the ORGANIZER field is an opaque internal handle — not a teacher’s name, not a student’s name, not a real email address. This design means a guardian who subscribes to their conference calendar cannot inadvertently expose a roster of teacher or student names in their calendar app. Staff see all events in the feed; a guardian’s feed contains only their own bookings.

What does “consent-aware roster” mean for the master schedule?

When a roster is fetched for a scheduled section, every identity field routes through a consent resolution chokepoint. A student whose consent record is suppressed, lapsed, or marked do_not_publish has their name masked and their grade nulled in the roster view. The row is still counted for capacity and reporting; only the identifying fields are stripped. This masking is enforced at the route layer, not left to a UI filter that a client request could bypass.

What does “advisory” mean for the master schedule? Can it auto-enroll students?

No. The advisory master schedule proposes a conflict-minimized timetable and explains what it could not place. The proposal comes back as a review item; the engine never commits it without a human-ratified commit step. That commit step re-runs the conflict classifier (period clash, full seat, duplicate) before placing anyone. The engine never enrolls students on its own. Prerequisite or grade-eligibility gating is not wired and is not claimed on this site.

Are reminders and booking fees live?

No — both are honest-off. Reminders are consent-gated and queued: the engine checks whether the family has opted in to the relevant notification channel; if the opt-in is absent, the reminder is suppressed. Nothing is sent through this surface regardless of opt-in status today. Any booking fee is a computed line — the engine calculates the fee and records it as a reserved line in the ledger, but the charged amount is always zero and no money movement occurs through this surface. There is no live checkout here.

Can a school use just one surface — say, only conference booking?

Yes. Scheduling is modular: each surface is gated behind its own module flag or owner-context discriminator. A school can enable the conference booking surface without enabling the master schedule, the volunteer scheduling surface, or the facilities booking surface. A studio can use only the photo-crew dispatch and picture-day family booking surfaces. Any org running an owned instance configures only the surfaces relevant to its context. Take one surface or all of them.

What are the 6 appointment lifecycle states?

A picture-day appointment moves through six states: booked (reserved, slot counted), cancelled (slot freed, no longer counted against the partial-unique invariant), checked_in (student arrived on picture day), captured (photo taken), retake_needed (flagged for a second session), no_show (slot window passed without check-in). These states feed the day-of dashboard so the admin sees which students are outstanding and can trigger post-session workflows (retake scheduling, no-show notification).

How does photo-crew dispatch handle unexpected closures or sick crew?

The self-healing reschedule engine proposes a ranked list of minimal-cascade changes when a disruption occurs. The reasons it models are: weather, school closure, lockdown, sick crew, and school request. For each reason, the engine computes the smallest set of job-day moves that resolve the conflict and ranks them by impact. A human ratifies or adjusts the proposal; the engine commits only after confirmation. Route optimization for the working-day dispatch runs the heuristic greedy default; an external optimal-solver seam is available but is not claimed as live.

What can we actually see or use right now?

All eight K-12 booking and scheduling surfaces are built and the core engines are production-ready. In a conversation we walk through the current state honestly: the picture-day booking surface with live capacity chips and the family wall; the conference booking flow with the .ics feed; the advisory master schedule proposal and what-if surface; the facilities booking calendar; the photo-crew dispatch board and self-healing reschedule. Reminders and fees are honest-off — the infrastructure is there, not live. There is no pricing commitment and no signup. If it looks right for your school, studio, or organisation, we discuss what access looks like.

What is the professional platform, and what stage is it in?

The professional platform extends the same scheduling engine outward to five segments: personal appointment links, business-services booking, resource and room management, field-service dispatch with route optimization, and workforce shift scheduling. The core engines — dispatch, routing, multi-resource constraint gate, self-heal, eligibility gate — are built and tested in production on the K-12 operation. The standalone product surface (public booking pages, general self-serve onboarding, two-way calendar sync, the CalDAV server) is in active development. Pricing is the plan; we are accepting early access registrations before the public launch. We do not claim these surfaces are live today.

Why does the pricing show a Personal free tier?

The Personal free tier is the wedge: unlimited event types (the appointment-link tools restrict you to one on their free tier), a custom domain not paywalled to enterprise, and the same availability engine underneath that knows rooms, crews, and shifts. It is planned as an honest on-ramp — not a crippled trial — so a freelancer or solo professional gets a real tool, and growing into teams, rooms, or dispatch is a single plan change, not a platform migration. The free tier is part of the planned launch; it is not live today.

What makes the field-service dispatch genuinely different from the field-service tools on the market?

Two things no field-service incumbent combines. First, a consumer booking page that feeds dispatch: a customer picks a time window and a technician is dispatched with an optimized route from that one booking event. Every existing field-service platform is operator-side only; none ship a consumer-facing booking page. Second, the hard-constraint eligibility gate at assignment time: credential expiry, territory match, kit/vehicle exclusivity, capacity, and blackout windows are all enforced before a write lands, and the same gate re-runs on an open-shift claim to ensure the single winner is truly eligible. Neither of these is a feature tacked on; they are the architecture the K-12 dispatch engine was built around and runs in production today.

Do I need to pay extra to use my own domain and remove your branding?

No, not for the domain. A custom domain is on every plan, the free one included — most scheduling tools charge for that and reserve full white-label for an enterprise contract. Removing our branding and applying your logo and colors is one paid tier up (Pro), not a sales call. Notification emails carry your display name and reply-to; the legal and consent footer stays ours by design. Pricing is the plan; there is no live checkout on this page.

Troubleshooting

Edge cases, and the two 409 reasons.

A booking conflict always returns a clean, retryable 409 with a machine reason — already_booked or slot_full — never a silent over-book and never a 500.

Two families click the last open slot at the same instant. What happens?
One booking is confirmed and the other is handed a clean, retryable conflict with a machine-readable reason — never a silent over-book, and never a 500. The reason it holds is that the check is not a conditional in application code that two threads can both pass: a partial-unique index makes a second live booking for the same student and event impossible at the database, and per-slot capacity is counted under a row lock inside the same transaction that writes the booking. The losing request gets told what happened and which slots are still open, which is a far better experience than the double-booked Tuesday you find out about on Tuesday.
A guardian cancels. Does the slot come back?
Immediately, and to everyone — the cancelled booking stops counting against capacity the moment it is cancelled, so the slot is re-bookable by the next family who looks. This is why the uniqueness constraint is a partial unique index rather than a plain one: it applies only to live bookings, so a cancelled row can sit in the table as history without blocking the seat it used to hold. A scheduler that makes you email the office to free a cancelled slot has quietly made cancellation expensive, and expensive cancellation is how a picture day ends up half-empty and fully booked at the same time.
A guardian has three children. Do they need three accounts?
No. A guardian holds a separate verified claim for each of their children, and each claim carries its own bookings. They can hold a conference slot for one child and a picture-day sitting for another without the system treating those as a conflict, because the uniqueness rule is scoped to a student and an event rather than to the adult doing the booking. What they cannot do is reach a child who is not theirs: the student identifier comes from a hash-verified server-side claim, never from anything the browser sent.
What does the family actually see? Is there a roster to browse?
There is no roster to browse, and that is a design decision rather than a permission setting. A guardian sees open slots and their own bookings. A cross-family or cross-school request returns the same uniform 404 as a path that does not exist, so the surface cannot be used as an oracle to test whether a given student is enrolled. Sign-up sheets that show you every other family’s name are a genuinely common pattern in school scheduling, and it is not one we were willing to copy.
Does subscribing to the calendar feed leak names into a personal calendar app?
No — the .ics feed carries opaque labels only. There is no student name and no teacher name in the SUMMARY or ORGANIZER fields, only a non-PII handle and a timestamp. This matters more than it first sounds: a calendar feed gets subscribed to on a personal phone, synced to a laptop, and occasionally shared with a spouse or an assistant, and every one of those hops is outside the school’s control. Staff see all appointments in their feed; a guardian sees only their own.
Do reminders go out? Are booking fees charged?
Neither, today, and we would rather say that plainly than leave it ambiguous. A reminder is queued against the family’s own channel opt-in and suppressed when that opt-in is absent — the queueing and suppression logic is built, and nothing is being sent through this surface. A booking fee is computed as a line and reserved in the ledger, and no money moves. Both are honest-off: the infrastructure exists, it is not enabled for live use, and this site has no checkout of any kind.

Data & privacy

For a district DPO: what a booking record holds.

Every identity field on a roster route passes through a consent chokepoint. A suppressed, lapsed, or do_not_publish student has their name masked and grade nulled at the server — not by a UI filter a client request could disable. The row still counts; only the identity is stripped.

A guardian’s student ID comes from a hash-verified server-side claim, never from the request body. Cross-family and cross-school access return a uniform 404 — the surface is not an oracle for roster enumeration. There is no open sign-up sheet, no roster to browse.

The full inventory — what this product holds and what it deliberately does not hold — lives on /privacy. In short: no facial recognition, no photo store, minor scheduling data consent-aware and never public, the .ics feed opaque-labels-only.

The full privacy page →