Schedule.software · The complete scheduling platform · 2026

One platform. Every kind of scheduling. On a calendar substrate we own.

The scheduling market is five separate silos. An appointment-link tool for booking a meeting. A different product for booking a room. A third for dispatching a technician. A fourth for managing shifts. None of them share a calendar. None of them share any data. You buy all five, reconcile manually, and discover double-books after the fact.

Schedule.software is the one product in the middle of that board: a real calendar substrate we own and built our way, with every scheduling module running on it as a toggleable layer. One booking, one calendar, one eligibility engine enforcing the same invariants across appointment links, business services, rooms and resources, field dispatch with route optimization, and workforce shifts. In the education market, six K-12 booking surfaces run in production on this engine, and two more are built but module-dark — ready to enable, not yet on by default. The professional platform is opening next.

5scheduling segments on one engine — appointment links, business booking, resource management, field dispatch, workforce shifts
6K-12 booking surfaces running in production today on this same engine. 8 surfaces are built in total; the other 2 are module-dark — picture day through facilities
2server-guaranteed invariants on every booking — no double-book + per-slot capacity, both at the database
0student or teacher names in the subscribable .ics calendar feed — opaque labels only, consent-gated by construction

What is built, as a proportion — not a bare number

The honest fractions behind the four numbers above.

Why schedule.software exists — the empty middle of a fragmented market

Every incumbent owns one slice. The board is empty in the middle.

The calendar tools are real calendar substrates, but they cannot be sold as a scheduling platform — no white-label, no scheduling primitives beyond basic event creation, partial or absent standards support, closed APIs. You can put events in them; you cannot build a scheduling business on them.

The scheduling tools own one segment each with no calendar substrate underneath. The appointment-link category is exactly that: links. No dispatch, no rooms, no shifts. The field-service platforms dispatch crews but have no consumer booking page and no calendar. The room-booking tools know desks and conference rooms but nothing about people availability, dispatch routes, or shift coverage. The shift tools schedule hourly labor but have no concept of rooms, vehicles, or the jobs those people are assigned to.

The middle of the board — one product that is BOTH a real calendar substrate AND every scheduling module AND white-labelable AND spans education plus every professional segment — is empty. That is where schedule.software sits.

Structural product categories, not named vendors. Each cell states its verdict in words, so the table reads without color.
Product typeReal calendar substrateAll 5 scheduling segmentsWhite-label / licensableConsent / minor-safeField dispatch + routing
Calendar-only toolsYesNoNoNoNo
Appointment-link toolsNo substrate1 segmentEnterprise onlyNoNo
Field-service platformsNo substrate1 segmentNoNoPartial (no consumer booking)
Room / desk booking toolsNo substrate1 segmentNoNoNo
Shift-scheduling toolsNo substrate1 segmentNoNoNo
Schedule.softwareYes — own itYes — all 5Yes — not paywalledYes — by designYes — built + tested

This comparison reflects the structural category each product type occupies, not any single vendor. No competitor brands are named on this site.

The calendar substrate — our own, built our way, better where it matters

Nobody ships a modern, multi-tenant, white-labelable, standards-clean calendar substrate you can build a business on. We built one.

Every scheduling module on schedule.software sits on a real calendar substrate. Not a scheduling widget bolted onto a general event table — a purpose-built, multi-tenant calendar with full RFC-5545 recurrence, first-class timezone awareness, scope-cascade access control, and a zero-PII .ics feed that is minor-safe by construction.

Our recurrence expander runs the RFC-5545 rule set without external dependencies: DAILY, WEEKLY, MONTHLY, with INTERVAL, COUNT, UNTIL, BYDAY. We are extending it to EXDATE, BYMONTHDAY, BYSETPOS, and RECURRENCE-ID — getting the edge cases right where the calendar giants diverge from the spec and break client syncs. The .ics feed today strips all student and teacher names by default: the SUMMARY field carries a non-PII handle, not an identity. This is not a privacy setting you configure; it is a structural property of the model.

The CalDAV server — RFC 4791 — is in active development. A clean, complete CalDAV implementation means interoperability with every calendar client (desktop, mobile, third-party) while we own the substrate. Two-way sync connectors for major calendar providers are planned as the next layer: be an aggregator AND the substrate simultaneously. This is the largest gap between today and a fully standalone product; we are building it and will say so directly when it lands.

Scheduling modules — toggleable per tenant, all on the same engine

Every scheduling type. One availability model. One eligibility gate. One calendar.

Each module is independently enableable per tenant. A school turns on eight K-12 surfaces. A field-service operation turns on dispatch and resource management. A freelancer turns on appointment links. No tenant pays for segments they do not need; no segment runs on a separate engine from the others. The field-service dispatch module — the hardest segment, the crown jewel — is built and tested in production today.

Business-services booking

Business-services booking

Multi-staff, multi-resource booking without the vertical lock-in

For appointment-based businesses that need more than a personal link: multiple staff, multiple service types, and resource overlap detection that is a baseline feature, not a premium add-on. A service-based business books a staff member, a treatment room, and the required equipment in one booking event; the engine enforces exclusivity for all three simultaneously. No vertical lock-in — the same engine serves a fitness studio, a clinic, a salon, or a school photography team. No commission skim on any transaction.

Engine built -- self-serve surface in development

Room & resource management

Room & resource management

Rooms, equipment, vehicles, and people in one shared availability model

The hard-constraint gate enforces per-space quotas, setup and teardown buffers, approval workflows, and blackout windows natively — these are not bolt-ons or configuration tables. A room and a person can be booked together in one atomic transaction; exclusivity is guaranteed for both at the database. A malformed overlap attempt — two bookings whose windows intersect by even one second — is rejected at the server before any write, using the canonical half-open [start, end) predicate. The facilities booking surface in the K-12 edition runs this engine in production today.

Built -- production-ready in the Education edition

Field-service dispatch & routing

Field-service dispatch & routing

The crown jewel: consumer booking + automatic crew dispatch + route optimization

A customer picks a service window on a public booking page; a technician is dispatched with an optimized route, atomically, from the same booking event. No field-service platform on the market does both in one product — the dispatch platforms are operator-only, the booking tools have no dispatch. The dispatch engine covers full job lifecycle (season → job → job day → assignment), credential-gated crew assignment (expiry, territory, role, kit exclusivity), a working in-process route optimizer (VRPTW heuristic default, with OR-Tools and external solver seams injectable), a self-healing reschedule proposer, and an open-shift claim flow with an atomic single-winner check. This engine is built and runs in production on K-12 picture-day operations today.

Built -- production-ready -- consumer booking page in development

Workforce shift scheduling

Workforce shift scheduling

Shifts that share the same availability and eligibility engine as everything else

Workforce shift scheduling built on the same availability and eligibility gate as appointments, dispatch, and resource booking — so a shift conflict with a booked appointment is caught before any write, not discovered after. The shift open-claim flow (a crew member claims an open shift; a single-winner atomic check confirms the claim) already runs in production. The full workforce management layer — recurring shift templates, rotations, time-off requests, swap and trade, clock-in, and demand auto-fill — is in active development, building on the shared availability and eligibility gate already in place.

Claim flow built -- full WFM layer in development

Events & reservations

Events & reservations

Event registrations and reservations on the same slot and capacity engine

Public and private events with slot-based registration, capacity limits, a waitlist, and the same no-double-book guarantee at the database. An event registration is structurally the same as a booking — a slot, a capacity, an attendee — so every invariant the booking engine carries (partial-unique index, transactional capacity count, consent chokepoint) applies to event registrations without a separate implementation. The events package runs in production today; a self-serve event-creation surface is in development.

Events package built -- self-serve creation in development

Personal & family scheduling

Personal & family scheduling

A personal calendar that is minor-safe by construction

The free-tier wedge: a personal and family scheduling surface built on the same engine, with consent-gated calendar sharing as a native feature — not a privacy setting someone configures, but a structural property of the model. A minor’s schedule shared via the subscribable .ics feed contains opaque labels only: no name in the SUMMARY or ORGANIZER fields. A family member sees only their own children’s calendars, gated by the hash-verified family claim. Minor-safe by construction is a property that cannot be retrofitted onto a general calendar; it was designed in from the start.

Planned -- minor-safe architecture designed in from the start

Build status of the 7 scheduling modulesA row per scheduling module with its honest build status. 2 of 7 modules are built; the rest are labelled partial or planned exactly as the page's own module data records them.Scheduling modules — status straight from the page’s own dataEach row shows a glyph and the status in words, so the matrix reads without color.Appointment linksEngine built -- public booking page in developmentBusiness-services bookingEngine built -- self-serve surface in developmentRoom & resource managementBuilt -- production-ready in the Education editionField-service dispatch & routingBuilt -- production-ready -- consumer booking page in developmentWorkforce shift schedulingClaim flow built -- full WFM layer in developmentEvents & reservationsEvents package built -- self-serve creation in developmentPersonal & family schedulingPlanned -- minor-safe architecture designed in from the start
Figure 2. Build status of every scheduling module, rendered from the same data that writes the module cards above — so this figure cannot claim a module is finished when the data says it is partial or planned.

Editions — one engine, two market entries

The Education edition is in production. The Professional edition is opening next.

Education edition

The K-12 scheduling platform running in production today. Eight booking and scheduling surfaces on the shared engine, all consent-aware, all family-walled, all with the database-level double-booking guarantee. District-to-school-to-classroom scope hierarchy. SSO and roster rostering via Clever and ClassLink. FERPA and COPPA posture built in by construction, not retrofitted. The education edition is the proving tenant: every correctness claim on this page runs in production on real K-12 operations.

  • Picture-day family booking (production-ready)
  • Parent-teacher conference booking (production-ready)
  • Admissions interview and tour booking (production-ready)
  • Facilities and resource booking (production-ready)
  • Staff and substitute scheduling (production-ready)
  • Photo-crew dispatch and route optimization (production-ready)
  • Academic master schedule, advisory (module-dark)
  • Volunteer and student-helper shifts (module-dark)

Professional edition

The same engine, opening outward to five professional segments. The hard engines are built — dispatch, routing, resource exclusivity, constraint gate, self-heal — and run in production. The standalone product surface (public booking pages, general self-serve onboarding, two-way calendar sync, the CalDAV server) is in active development. We are accepting early access registrations now. No live checkout; no pricing commitment until you talk to us.

  • Personal appointment links (engine built; booking page in development)
  • Business-services booking with multi-resource overlap detection
  • Room, desk, field, and equipment management
  • Field-service dispatch + route optimization (built and tested)
  • Consumer-booking-to-auto-dispatch flow (built; surface in development)
  • Workforce shifts on the shared eligibility gate (in development)
  • White-label and custom domain (not paywalled to the top tier)
  • Public API + webhooks (planned)

Pricing — the plan, grounded and honest. Not a live checkout.

Modular pricing because one per-seat rate loses every segment.

Every segment of the scheduling market prices differently because the value delivered is different in each. A per-seat rate that makes sense for appointment links makes no sense for a field-service operation with ten technicians and fifty daily jobs. We price by segment, with modules added independently, and no commission skim on any transaction. Custom domain and branding are not paywalled to the top tier. These figures are the planned launch tiers; they are not a live purchase option today. Reserve early access and we discuss what access looks like for your operation specifically.

Professional tiers — planned launch pricing

Personal

Personal

Free

Unlimited event types from day one

  • Unlimited appointment-link event types
  • Custom domain — not locked behind a top tier
  • Subscribable .ics feed
  • Same availability engine as the team tiers
  • Email notifications when online

Professional

Pro

$12 / mo

Per user · planned

  • Everything in Personal
  • Business-services booking
  • Multiple service types and staff
  • Availability scheduling and buffers
  • Booking intake forms
  • White-label branding

Enterprise

Enterprise & White-label

Custom

Volume · self-host · licensable

  • All modules
  • Self-hosted or managed
  • White-label per-tenant licensing
  • Public versioned API + webhooks
  • Workforce shifts module (when available)
  • SLA and dedicated support

Education tiers — planned launch pricing

School

School license

$1,200 – $3,000 / yr

Per school · planned

  • All eight K-12 scheduling surfaces
  • Picture-day and conference booking
  • Facilities and resource management
  • Photo-crew dispatch
  • Module-dark surfaces activatable

Pricing figures are the planned launch tiers. This is not a live checkout. No money changes hands through this site. Payments are honest-off: the payment infrastructure is in place as a reserved line; it is not enabled for live transactions today.

Five structural differentiators — not features, a shape

The reasons the middle of the board is ours to take.

  • 01
    One product across all segments — a shape, not a feature list Every incumbent owns one column. We own all five on a shared calendar substrate. The empty middle is not a gap we spotted and rushed to fill — it is the natural consequence of building the hardest engine first (field dispatch + routing + multi-resource + consent) on a real calendar, then opening the same engine to the other segments. The shape of the product is the moat.
  • 02
    Dispatch + routing + consumer booking — the one nobody combines A customer books a time window on a public page; a technician is dispatched with an optimized route from that single booking event. The field-service tools are operator-only; none ship a consumer booking page that feeds dispatch. The calendar tools have no dispatch. We have both, running in production on K-12 picture-day operations, where a studio books family sittings AND dispatches its crew AND routes the day from the same engine simultaneously.
  • 03
    Consent and minor-safe by construction — impossible to retrofit Zero-PII .ics feeds, consent-gated calendar sharing, scope-cascade access control, and a family wall that holds at the server (hash-verified claim, never request-body) are structural properties of the model — not settings someone configures. A general calendar tool cannot add this later without redesigning its data model. We built it in from the start because we run K-12 operations on it, where FERPA and COPPA posture is the baseline, not a compliance layer added on top.
  • 04
    Dogfood-then-sell — the credibility proof is built into the product We run our own K-12 scheduling operations on this exact engine in production. Eight booking surfaces, real schools, real picture days, real crew dispatch and route optimization, real conference calendars with zero-PII .ics feeds. We did not build a demo and describe what the product could do. We built an operation and are opening the same engine outward as a product. The proof is not a case study; it is the product itself.
  • 05
    White-label and licensable — not paywalled to 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. The platform is also designed to be licensed as an engine: any org running an owned instance configures the modules relevant to their operation through the same owner-context discriminator that drives the K-12 and field-service arms. No separate fork, no separate codebase, one engine.

The Education edition — 6 surfaces in production today, 2 more built and module-dark

Eight built booking and scheduling surfaces for schools and photography studios — take one or all

Every surface is labelled honestly: Built means the underlying engine is production-ready. Module-dark means built but gated behind a module-enable flag — ready to activate, not yet on by default. We do not claim otherwise.

Picture-day family booking

Picture-day family booking — open slots, live remaining capacity, family-walled

A guardian opens the booking surface and sees time slots with real remaining capacity: “3 of 4 left,” “full,” or “1 of 4 left.” They book, reschedule, or cancel. A cancel frees the slot to re-book immediately. No double-booking is possible: a partial-unique index on the appointments table enforces the invariant at the database — two families racing the last slot both get a clean, retryable conflict, never a silent over-book. Per-slot capacity is counted under a lock inside the same transaction that books, so a slot never over-fills even under concurrent requests. The family wall holds throughout: the student ID comes from a hash-verified claim, not from the request body — there is no roster to browse, no other family’s child to touch. Picture-day family booking is built and production-ready.

Built · production-ready

Parent-teacher conferences

Parent-teacher conference booking — staff publish availability, families book, .ics with no names

Staff publish their open hours; the slot list a guardian sees is published-minus-booked. A guardian books for their own student: the engine confirms the slot is open, the family wall holds, no double-booking occurs. A subscribable .ics calendar feed delivers the schedule with opaque labels — never a student’s or teacher’s name in the SUMMARY or ORGANIZER fields, only a non-PII handle. Staff see all bookings in the feed; a guardian sees only their own. Parent-teacher conference booking is built and production-ready.

Built · production-ready

Admissions interviews & tours

Admissions interview and tour booking — recruitment funnel on the same slot engine

An admissions owner publishes interview and tour slots; a prospective-family lead is booked into an open slot on the recruitment funnel. The same canonical slot/booking/availability engine that drives conferences and picture day drives admissions — one primitive composed into a third context. The lead reference is opaque; this surface owns no student census and is gated on the tenant and an injected admissions-owner predicate. Admissions interview and tour booking is built and production-ready.

Built · production-ready

Academic master schedule

Academic master schedule — advisory, conflict-minimized, never enrolls on its own

The advisory master schedule proposes a conflict-minimized timetable and explains what it could not place — you review and commit; the engine never enrolls students on its own. A what-if surface lets you model changes and diff the impact before committing. When an enrollment runs, the conflict classifier checks for period clash, full seat, and duplicate before placing anyone, with a machine reason on the 409 — never a silent over-enroll. Rosters are consent-aware: a suppressed student’s name and grade are stripped at the roster route; the row still counts, only the identity is masked. This surface is module-dark and requires enabling the scheduling module. Prerequisite or grade-eligibility gating is not wired and is not claimed here. The academic master schedule is built and production-ready behind its module flag.

Built · module-dark (advisory only; no eligibility gating)

Volunteer & student-helper shifts

Volunteer and student-helper shift scheduling — capacity, waitlist, approval sign-off

Library, clubs, athletics, and events consume the same volunteer scheduling engine through an owner-context discriminator — no separate fork per arm. Shifts have capacity, a waitlist, and a draft→submitted→signed approval lifecycle. An unverified volunteer cannot be assigned to a student-contact shift: the screening decider is fail-closed. A consent chokepoint strips a suppressed helper’s name and hours from the roster view. This surface is module-dark and requires enabling the volunteer scheduling module. Per-state legal sufficiency of a background check is not modeled and is not claimed here. Volunteer and student-helper shift scheduling is built and production-ready behind its module flag.

Built · module-dark (unverified = no student-contact, fail-closed)

Staff & substitute scheduling

Staff and substitute scheduling — HR-capability gated, server-resolved identity

Staff and substitute scheduling is HR-capability gated from the server: the scheduling identity is resolved from the server-side context, never from a client-supplied claim. A server-side capability gate decides access; the check runs on the server, not a feature flag a client request can disable. The surface is staff-coupled and never touches the student census. Staff and substitute scheduling is built and production-ready.

Built · production-ready (HR-gated)

Photo-crew dispatch

Photo-crew dispatch — credential-gated assignments, self-healing reschedules

Studio crew dispatch is built around the school photography calendar — picture day, retakes, sports, events, senior sessions, graduation. The job-type taxonomy lives in the schema, but the dispatch store does not yet persist it distinctly, so this page does not advertise a count the round-trip would not preserve. Assignments are credential-gated: expiry must exceed the scheduled date, district must match, and verified must be true — the gate throws before any write, and the same gate re-runs on an open-shift claim with an atomic single-winner check. Self-healing reschedules propose minimal-cascade changes for weather, closure, lockdown, sick crew, or school request — ranked proposals for human ratification. Route optimization runs for the working-day dispatch (heuristic greedy default); an external optimal-solver seam is available but is not claimed as live. Photo-crew dispatch scheduling is built and production-ready.

Built · production-ready (route optimization advisory)

Facilities & resources

Facilities and resource booking — rooms, gyms, fields, auditoriums, equipment

Book rooms, gyms, fields, auditoriums, and equipment against a shared availability calendar. Double-booking is fail-closed: the booking engine checks for overlapping windows using the canonical half-open [start, end) predicate; a malformed instant fails closed. Back-to-back bookings are legal; overlapping bookings are not. Resource kinds include room, field, gym, auditorium, equipment, and other. The availability view is authorized-only — never a public room roster. Statuses are held, confirmed, and cancelled. Facilities and resource booking is built and production-ready.

Built · production-ready

Who it serves — one engine, three kinds of operator

Built for schools, for photography studios, and for the organizations that run on a shared calendar.

For schools and districts

A school enables only the booking surfaces it needs — conference booking on its own, or picture day, facilities, and the advisory master schedule together. Every surface is consent-aware and family-walled, so a guardian only ever sees and books for their own child, and a suppressed student’s name never reaches a roster view. District-to-school-to-classroom scope, SSO, and roster sync come built in, not bolted on.

For photography studios

A studio runs picture-day family booking and photo-crew dispatch on the same engine that guarantees no double-book at the database. Territory and workload are tracked per-associate: each photographer has their own credential gate, their own assigned job days, and their own route for the working day, so an unqualified or double-booked associate is caught before an assignment ever lands. One studio can serve many schools without a separate calendar for each.

For community organizations

Any organization running an owned or white-labeled instance — a booster club, a league, a facility, a service operation — configures only the modules its work needs through the same owner-context discriminator, with no separate fork. The same correctness guarantees hold: capacity counted under a lock, exclusivity enforced for rooms and people together, and an opaque .ics feed that keeps minor scheduling data off public view. Take one surface or all of them; grow into more without a platform migration.

How we compare — every category owns one column; we own the row

Every other tool wins one square. A school needs the whole board.

A school does not have a scheduling problem. It has a dozen of them — picture day, parent-teacher conferences, admissions tours, the master schedule, facilities, volunteer shifts, staff and substitutes. The tools on the market each solve one and leave the family wall, the consent model, and the budget math to you.

We built one engine that carries all of them on a calendar substrate we own, with the minor-safety guarantees designed in from the first line — not a privacy setting you switch on, a property of the model.

Structural product categories, not named vendors. Each cell states its verdict in words, so the table reads without color.
Product typePriced for a whole schoolNo browsable roster / family wallConsent / minor-safeCustom domain on every tierGuaranteed no double-book
Appointment-link toolsPer seatNo roster modelNoPaid tiers onlyOne calendar
Sign-up-sheet toolsAds / per-planOpen sheetsNoNoCapacity races
Room / desk booking toolsPer spaceNo people modelNoNoRooms only
Group-poll toolsFree / adsNames visibleNoNoPoll, not booking
Suite-bundled bookingIn the suiteNo family modelStaff / tenant onlyTenant domainStaff calendars
Municipal rec platformsQuote / high setupAccount-gated, not K-12Rec, not FERPAEnterprise onlyRec booking
This platformFlat school / districtNo enumerationBy constructionEvery tierDatabase-level

This comparison reflects the structural category each product type occupies, not any single vendor. No competitor brands are named on this site.

Correctness is a database invariant, not a form — the structural approach

Two families racing the last slot both get a clean conflict. Never an over-book. Never a 500.

Most scheduling tools enforce their booking rules in application code: a conditional check before the INSERT, a flag flipped after a form submit. The problem is that two requests arriving at the same millisecond can both pass the check, both see the slot as open, and both write a booking — resulting in a double-book or an over-filled slot. The only fix that holds under concurrency is a database-level invariant.

Schedule.software enforces both guarantees at the database. No double-booking is a partial-unique index: UNIQUE(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 machine reason ‘already_booked’. Per-slot capacity is counted under a SELECT … FOR UPDATE in the same transaction that books: over-capacity returns 409 with reason ‘slot_full’. Both invariants hold even under concurrent inserts from two different request threads.

Consent-awareness is the same philosophy applied to identity: a suppressed minor’s name and grade are stripped at the roster route by a consent chokepoint, not by a UI filter a client request could bypass. The family wall is enforced the same way: the student ID comes from a hash-verified claim on the server, never from the request body. There is no roster to browse, no other family’s child to touch — the surface is not an oracle.

How the no-double-book guarantee resolves a race for the last slotFour picture-day slots are shown; three are taken and one is open. Two families request the last open slot at the same moment. The database applies a unique constraint inside a transaction, so exactly one request is confirmed and the other receives a clean conflict response rather than an over-book or a server error.Picture-day slots, 8:00-8:458:008:158:308:45last openTwo families, same instantFamily A requests 8:45Family B requests 8:45One transaction + a unique constraint at the database — not application code a client can race✓ Family A — confirmedthe slot is now full◖ Family B — clean conflictoffered the next open slot, never an over-book, never a 500
Figure 1. Two families request the last open slot in the same instant. The uniqueness check lives in the database transaction, so one is confirmed and the other is handed a clean conflict and the next open slot — never an over-book, never a 500.

Why it’s correct — the invariants that hold under load

Five guarantees. All at the database or the server. None in application code a client can race.

No double-booking — database invariant

A partial-unique index prevents two live bookings for the same student at the same event. Two requests racing the same slot both get a clean 409 with machine reason ‘already_booked’ — never a silent over-book, never a 500. This holds under concurrent inserts.

Per-slot capacity counted under a lock

A SELECT … FOR UPDATE counts current live bookings inside the same transaction that books. An over-capacity attempt returns 409 ‘slot_full’ before any write. Capacity is never over-sold even under concurrent load.

Consent-aware rosters — suppression at the route

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. Minor scheduling data is never public.

Family-walled — claim, not a roster you browse

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.

Opaque .ics feed — zero names in the calendar

The subscribable calendar feed contains opaque labels only: no student name, no teacher name, no real email address in the ORGANIZER field — only a non-PII handle. A guardian subscribing to their own conference calendar cannot inadvertently expose a roster of teacher or student names in their calendar app.

How it works — the K-12 booking flow

Four steps — publish, book, guarantee, subscribe

The booking flow is the same across every surface. Each step is described as it is built today — honest about what runs and what is honest-off.

Step 1 — Publish availability

A staff member, administrator, or studio owner publishes their availability: time windows, slot duration, and capacity per slot. For conferences, a teacher publishes their open hours. For picture day, the studio publishes session windows with per-slot capacity. For facilities, the booking administrator sets a resource’s available calendar. The availability is immediately visible as open-slot chips to whoever is entitled to book — not a public page, an authorized-only view.

Step 2 — A family, lead, or staffer books an open slot

A guardian opens the booking surface and sees open slots with real remaining capacity. They select a slot and confirm. The family wall holds throughout: the student ID comes from a hash-verified claim, not from the request body. A guardian may hold a slot for each of their claimed children independently — each child has their own claim and their own booking. For admissions tours, a prospective-family lead books through the same slot flow. For facilities, a booking-staff member reserves the room or field.

Step 3 — The server guarantees capacity and no-double-book in one transaction

The booking engine runs two server-side invariants in a single transaction: a SELECT … FOR UPDATE counts current live bookings against the slot capacity and rejects an over-capacity attempt before writing; a partial-unique index ensures no two live bookings share the same student and event. Both run server-side inside the one transaction — never a client-trusted check: the no-double-book invariant is a database unique index, the capacity guard a transactional lock-and-count in the store. A conflict returns a clean, retryable 409 with a machine reason (“already_booked” or “slot_full”) — never a 500, never a silent over-book.

Step 4 — Subscribe to the .ics feed; reminders and fees queue against opt-in

The confirmed booking appears in a subscribable .ics calendar feed with opaque labels: no student name, no teacher name, only a non-PII handle and timestamp. Staff see all appointments; a guardian sees only their own. Any reminder is queued against the family’s own channel opt-in — suppressed if the opt-in is absent. Nothing is sent through this surface. Any booking fee is a computed line, reserved in the ledger, never charged here. Both reminders and fees are honest-off: the infrastructure is in place, not enabled for live use today.

What is built and what is not — plainly stated

The engines are built. The standalone product surface is in development. We say so directly.

Built and production-ready today: the dispatch and routing engine (VRPTW heuristic default, OR-Tools seam injectable), the credential-gated assignment flow, the self-healing reschedule proposer, the hard-constraint eligibility gate, the open-shift claim flow — all running on real K-12 picture-day operations. All eight K-12 booking and scheduling surfaces (picture day, conferences, admissions, master schedule advisory, volunteer shifts, staff and substitute, crew dispatch, facilities). The no-double-booking partial-unique index. The per-slot transactional capacity count. The consent-aware roster chokepoint. The family-wall claim verification. The zero-PII .ics calendar feed. The RFC-5545 recurrence expander (DAILY/WEEKLY/MONTHLY subset). The events package. SSO and roster rostering. The copyable inline-embed and popup booking-widget snippets.

In active development: the CalDAV server (RFC 4791). Full RFC-5545 recurrence (EXDATE, BYMONTHDAY, BYSETPOS, RECURRENCE-ID, per-instance overrides). Two-way calendar sync connectors. Public booking pages as a standalone consumer surface. General self-serve tenant onboarding. The full workforce management layer (shift templates, rotations, time-off, swaps, clock-in). The public versioned API.

Honest-off (infrastructure in place, not live): reminders — queued against opt-in, nothing sent today. Booking fees — computed and reserved in the ledger, not charged. Payments — the seam is in place; Stripe is not enabled. SMS — no comms provider; email and in-app only until a provider is enabled. There is no live checkout on this site. These are planned capabilities, not current operations.

Different lanes for different needs

Ten front doors, one scheduling engine underneath.

These are separate products for separate jobs, each its own brand — not tiers of one app. They share a booking engine (no-double-book at the database, capacity under a lock, an honest waitlist), and nothing else. Naming them here is not a claim that any is live in production — each is its own brand with its own status, stated on its own page.

One link, one slot

slotly.software

The plainest single-link booking front door for a solo practitioner or a very small team.

Call dibs on a time

dibs.software

A first-come, claim-a-slot sign-up sheet with a consumer voice -- the first to grab a time gets it.

Pencil it in

penciled.software

Fixed-slot booking with a real soft-hold state: hold it provisionally, confirm with one tap.

More than one calendar

appointments.software

Appointment booking for a business with multiple staff, locations, or shared resources.

Classes & studios

classly.software

Recurring class, pack, and waitlist scheduling for studios.

Cohort courses

cohort.software

Session-based scheduling for cohort-run online courses.

Staff shift roster

shiftly.software

Post an open shift and match it to eligible, credentialed staff -- scheduling only.

Shifts + hours record

clockly.software

Shift scheduling with time-clock and hours-record capture for classified staff and shift-work teams.

Find a time

whenly.software

A native, ad-free poll for finding the time that works for a whole group.

The master timetable

schedule.software

Building the institution's whole schedule -- courses, sections, rooms, terms.

You are here

Reserve early access · Professional · Education · Enterprise

The engines are built. We are opening the doors.

The hard part — dispatch, routing, multi-resource, constraint gate, self-heal, consent, zero-PII calendar feeds, RFC-5545 recurrence — is built and runs in production. What is opening next is the standalone product surface: public booking pages, general self-serve onboarding, two-way calendar sync, the CalDAV server. We are taking early access registrations now. No live checkout, no automatic charge. A conversation first — what your operation needs, what is ready today, what is landing next — and then we discuss what access looks like.

For the Education edition: we walk through the eight booking surfaces, the correctness guarantees, the consent posture, and what a district or school rollout looks like. For the Professional edition: we show the dispatch and routing engine, the multi-resource booking flow, the eligibility gate, and what the consumer-booking-to-dispatch flow does that no field-service tool on the market ships. For Enterprise and white-label: we discuss the licensing model, the module toggle layer, and what a self-hosted or managed deployment looks like for your context.

To reserve early access or book a conversation: [email protected]

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.