NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages

Require the package. The service provider and the Appointments facade alias are auto-discovered — no manual registration:

composer require roundly-consulting/appointments-for-laravel

Publish-only migrations

The package never loads its migrations, so php artisan migrate alone creates nothing. Publish them into your app’s database/migrations first — once published they are yours, and they run in the order they were published: appointments, then participants, then the venue location columns:

php artisan vendor:publish --tag="appointments-migrations"
php artisan migrate

Provider package tables

Appointments builds on six Roundly provider packages that Composer installs alongside it. Their migrations are publish-only as well, so publish the ones the bundled Appointment model relies on — approval requests, contacts and reviews, plus media-library’s media table, which the reviews rating summary reads:

php artisan vendor:publish --tag="approvals-migrations"
php artisan vendor:publish --tag="contacts-migrations"
php artisan vendor:publish --tag="reviews-migrations"
php artisan vendor:publish --tag="media-migrations"
php artisan migrate

These are not optional. Skip one and the first call that reads it fails with a missing-table QueryException — ics() and toIcs() read the contacts table for the ORGANIZER and ATTENDEE lines, an approval-gated booking writes approval_requests, and ratingSummary() reads reviews and media.

geolocation-for-laravel adds no table of its own — venue coordinates live on the appointments table.

Configuration (optional)

The config file is optional — every key has a working default. Publish it to swap models, rename tables, change the participant key type or the behaviour defaults:

php artisan vendor:publish --tag="appointments-config"

appointments-config and appointments-migrations are the only publish tags. Status, role and frequency labels come from the enums-for-laravel Helpers trait, so there are no language files to publish.

Check the setup

The effective configuration is summarised in Laravel’s about command:

php artisan about --only=appointments

Next steps

  • Add the HasAppointments trait to every model that takes part in appointments — see Participants.
  • Get to know the entry point — see The Appointments facade.
  • Book your first appointment with the fluent builder — see Creating appointments.
  • Decide whether double-booking protection should be on for every call — see Conflict detection.

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

By donating, you agree to our donation terms.

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.