custom-crm.md

Custom CRM & planning tool
Why it exists
The client has specialized in professional makeup, hairstyling and special effects for more than twenty years: from bridal makeup to photo shoots and productions. The work happens in the central Netherlands, where a small core team directs a group of permanent and freelance makeup artists and stylists, often at several locations at once.
That coordination ran on separate calendars, email and spreadsheets: error-prone and not scalable once the number of bookings grows. The request was for an internal platform of their own, as a single source of truth for client data, appointments and planning. Built up in phases on purpose instead of in one big bang: from an appointments module to a full CRM.
The solution
An internal back office on Laravel with a Filament admin panel, set up around the team's daily practice:
- Client files with core and contact details of the company's clients, as the central source for the rest of the system.
- Appointment management: scheduling, rescheduling and canceling appointments, with overview screens for the team and an audit trail of every change.
- Public booking flow where clients book an appointment themselves: services that can be booked directly, next to slots that go past the planner first, taking closed locations and public holidays into account.
- Availability per team member: the permanent and freelance makeup artists and stylists pass on their availability and location preferences; a booking on request sends the planner a notification right away, so he can match the right person.
- Role-based access and an admin panel in the company's own branding.
Under the hood
PHP 8.4, Laravel 13 and Filament 5 on MySQL/MariaDB, with Livewire, Alpine.js and Tailwind on the front end and SCSS where custom work is needed. Strict TDD with Pest, SOLID and PSR-12, docblocks on every class and method, and a CI pipeline with tests, static analysis and Pint.
Calendar sync runs through the Google API; backups run via spatie/laravel-backup and can go off-site to S3, SFTP or Google Drive, with logging and error tracking underneath. The architecture is layered with clear module boundaries, deliberately close to the Filament defaults: an internal tool where stability comes before visual frills.
Status
In active development. The foundation is in place: admin panel, authentication, role-based access, CI and backups. The appointments module is under construction; client management and GDPR tooling (export, anonymization, retention periods) are next in line.
legal.json
"company_name": "Bas de Kort",
"legal_form": "sole proprietorship",
"trade_names": ["Bas de Kort", "LengthOfRope"],
"address": "Kerkeakker 3, 6674 EM Herveld, NL",
"chamber_of_commerce": "42038027",
"vat_id": "NL004476145B32",
"contact": { "form": "basdekort.nl/en/contact", "telephone": "+31628456862" },
"documents": [ "privacy", "terms and conditions", "data processing agreement" ]
}