---
title: "Appointments for Laravel — docs | Roundly"
description: "Developer docs for Appointments for Laravel: fluent booking builder, any-model participants, status lifecycle, conflict checks, recurrence and ICS export."
url: https://roundly-consulting.com/open-source/docs/appointments-for-laravel
language: en
---

[All packages](https://roundly-consulting.com/open-source.md)

Open source

# Appointments for Laravel

Install

`composer require roundly-consulting/appointments-for-laravel`

Requires: PHP ^8.4 · Laravel ^12.0|^13.0

[GitHub](https://github.com/roundly-consulting/appointments-for-laravel) [Packagist](https://packagist.org/packages/roundly-consulting/appointments-for-laravel) [Donate (opens in a new tab)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Patreon](https://www.patreon.com/cw/roundly)

## Overview

A scheduling toolkit for Laravel. Create appointments with durations and time zones, attach any Eloquent model as a participant, block double-bookings, move bookings through a guarded status lifecycle, generate recurring series and export standards-compliant .ics calendar files. One Appointments facade covers it all, with the same API injectable as AppointmentManager. It builds on Roundly’s own provider packages for venue geolocation, guest contacts, booking approvals and post-visit reviews — MIT-licensed, with no third-party dependencies beyond Laravel.

### What you get

#### Facade, DI or actions

Book with Appointments::schedule()->startingAt()->lasting()->create(), inject AppointmentManager, or run the actions with typed DTOs.

#### Any model as a participant

Users, customers, rooms or vehicles join through one polymorphic table — with a role and per-participant meta.

#### Guarded status lifecycle

Pending → confirmed → completed, plus cancelled, declined and no-show. Illegal moves throw; every change fires an event.

#### Double-booking protection

Opt in per call or globally: overlapping bookings for any participant throw — even when two arrive at once, thanks to row locks.

#### Recurring series

Daily, weekly or monthly rules with interval, count, until and weekday filters — created all-or-nothing in one transaction.

#### Calendar export & a recording fake

RFC 5545 .ics for one booking or a whole feed; Appointments::fake() records every write for assertScheduled() and friends.

#### Approvals, reviews & venues

Booking sign-off drives the status, post-visit reviews are verified by attendance, venues support radius search.

### Documentation

#### [Installation](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/installation.md)

Install via Composer, publish the publish-only migrations for appointments and its provider packages, then optionally the config.

#### [Configuration](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/configuration.md)

Every config key and its default — models, key type, table names, time zone, duration, conflicts, recurrence, reviews and approvals.

#### [Schema & custom models](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/schema-and-models.md)

The appointments and participants tables, UUID/ULID participant keys, and how to swap in your own Appointment and Participant models.

#### [The Appointments facade](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/facade.md)

Tour the Appointments facade — the schedule() builder, DTO creates, the for() handle with participants(), availability, ICS feeds and previews.

#### [DI and actions](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/without-facade.md)

Inject AppointmentManager instead of the facade, or run the six actions directly — plus the complete facade method → action map.

#### [Typed DTOs](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/dtos-and-actions.md)

AppointmentData, ParticipantData and RecurrenceData — the typed DTOs behind create(), createRecurring(), the fluent builder and the actions.

#### [Creating appointments](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/creating-appointments.md)

Create appointments with the fluent Appointments::schedule() builder or a typed DTO — every chainable method, the defaults and the terminal calls.

#### [Durations & time zones](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/durations-time-zones.md)

How start, end and duration derive from each other, why instants are stored in UTC, and how to read local times.

#### [Participants](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/participants.md)

Attach any Eloquent model as a participant with a role and meta, list a model’s appointments with HasAppointments, and add or remove people later.

#### [Status lifecycle](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/status-lifecycle.md)

The guarded status state machine — transitions, helper methods, labels, colours and the InvalidStatusTransitionException.

#### [Conflict detection](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/conflict-detection.md)

Block double-bookings per call or globally, inspect the clashing appointments, and check availability with Appointments::isAvailable().

#### [Rescheduling](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/rescheduling.md)

Move an appointment to a new start, keep or change its duration, guard against conflicts and react to AppointmentRescheduled.

#### [Recurring appointments](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/recurring-appointments.md)

Daily, weekly or monthly series with interval, count, until and weekday rules — created all-or-nothing and linked by a group UUID.

#### [Querying](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/querying.md)

Query scopes for upcoming, past, overlapping and per-participant appointments, plus status filters and ordering.

#### [Calendar export (ICS)](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/calendar-export.md)

Export one appointment or a whole schedule as RFC 5545 .ics text — status mapping, escaping, GEO, ORGANIZER and ATTENDEE lines.

#### [Venue location](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/venue-location.md)

Give appointments a venue name and coordinates, measure distance and find appointments within a radius.

#### [Guest contacts](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/guest-contacts.md)

Store booking emails and phone numbers on an appointment and turn them into calendar ORGANIZER and ATTENDEE mailto lines.

#### [Booking approvals](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/booking-approvals.md)

Require sign-off before a booking is confirmed — flat, quorum, staged or preset workflows that drive the appointment status.

#### [Post-visit reviews](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/reviews.md)

Collect post-visit reviews stamped verified for real attendees, plug in your own attendance resolver and read rating summaries.

#### [Events & exceptions](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/events.md)

The seven appointment and participant events, their payloads and when they fire, plus every exception the package throws.

#### [Testing](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/testing.md)

Record every booking write with Appointments::fake() and its assert methods, then use the model factory and example Pest tests for the rest.

#### [Requirements](https://roundly-consulting.com/open-source/docs/appointments-for-laravel/requirements.md)

PHP 8.4+, Laravel 12 or 13, and six Roundly provider packages installed automatically by Composer.

## Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

[More ways to support, including crypto](https://roundly-consulting.com/support-us.md)

By donating, you agree to our [donation terms](https://roundly-consulting.com/donation-terms.md).

[Support our open source work (opens in a new tab)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Join us on Patreon (opens in a new tab)](https://www.patreon.com/cw/roundly)

## Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.

[Get a quote in 48 hours](https://roundly-consulting.com/contact.md) [Browse all packages](https://roundly-consulting.com/open-source.md)
