












Aucip Appointments
Self-hosted Laravel booking for multi-branch salons and clinics: team appointments, Stripe/PayPal deposits, SMS/WhatsApp reminders and an embed widget.
- #appointment booking script
- #arabic rtl booking
- #booking widget
- #clinic appointment system
- #customer portal
- #laravel booking system
- #multi branch booking
- #paypal booking
- #round robin scheduling
- #salon booking software
- #self-hosted booking
- #sms reminders
- #spa booking
- #stripe deposits
- #team appointments
- #whatsapp reminders
Aucip Appointments is a self-hosted booking system built on Laravel. Clients pick a branch, a service and a time in a small embeddable widget; you take deposits through Stripe or PayPal, send reminders by email, SMS or WhatsApp, and customers manage their own visits in a portal. It installs on ordinary shared hosting through a web installer: no SSH, Composer, Node or Redis.
Features
- Multi-branch from day one: each branch has its own hours, holidays, timezone, currency, tax, prices and managers. Managers and receptionists see only their branch.
- Team appointments: book 2 or more specialists together (four-hands massage, colour plus cut); times are offered only when all are free.
- Round-robin "Any available": least recently booked, fewest bookings that day, or weighted priority.
- No double bookings: every booking takes a per-specialist slot claim inside a database transaction.
- Deposits per service: pay at venue, fixed or percentage deposit, or full prepayment. Unpaid holds are released automatically.
- Stripe and PayPal: Payment Intents (SCA-ready) and PayPal Orders v2, Sandbox/Live switch, encrypted keys, verified and de-duplicated webhooks.
- Refunds by rule: a cancellation window and late-cancellation refund % per service; refunds go back through the original gateway.
- Reminders: email (any Laravel mailer), SMS (Twilio or any HTTP gateway) and WhatsApp Cloud API templates; per-channel opt-out; delivery log; "log only" mode.
- Embeddable widget: one script tag; 1.1 KB loader and a 9.9 KB (gzipped) booking app in an iframe; CSP-safe; brand colour, radius and language attributes; analytics events and Google Tag Manager
dataLayerpushes. - Customer portal: one-time email link or password sign-in; reschedule, cancel with the refund shown first, pay the balance, receipts,
.icsfiles, notification preferences, data export and erasure. - Admin: calendar (day/week, staff or branch columns, drag to reschedule), bookings, reports with CSV export, payment, message and audit logs.
- Languages: English, Spanish and Arabic with full right-to-left layout and IBM Plex Sans Arabic.
- CSV import: customers and services, including exports from other booking systems.
- Installer and demo mode: web or CLI installer with optional demo data;
DEMO=truefor a read-only public demo.
Requirements
- PHP 8.3+ (
pdo_mysqlorpdo_sqlite, mbstring, openssl, intl, fileinfo, tokenizer, curl, bcmath, sodium) - MySQL 8+ / MariaDB 10.6+ (SQLite for evaluation)
- One cron entry; writable
storage/andbootstrap/cache/ - Shared hosting or VPS. Composer and Node are not needed on the server.
What's included
- Full Laravel source with
vendor/, built widget, admin and font assets (appointment-booking-dist.zip) - Web and CLI installer, demo data (2 branches, 6 staff, 12 services, about 170 bookings over 6 weeks)
- English, Spanish and Arabic translations
- Pest test suite (incl. concurrency test), Larastan and Pint config, GitHub Actions CI
- HTML documentation: requirements, installation (shared hosting, VPS, CLI), configuration, payments, messaging, widget, portal, translations, CSV import, testing, troubleshooting, FAQ, changelog
License prices
| Licence | Price | Terms |
|---|---|---|
| Regular | $35 | Regular licence: use in one end product that end users are not charged for. Free updates while licensed and 6 months of support (renewable). |
| Extended | $99 | Extended licence: use in one end product that end users are charged for (for example a paid SaaS or paid membership). Free updates while licensed and 6 months of support (renewable). |
One licence = one end product. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Each additional end product needs another licence. Installation service: paid add-on, sold separately.
Support & updates
- Free updates while your licence is active
- 6 months support, renewable
Licence behaviour: the key is activated at install (optional; without it a 14-day grace period starts) and re-checked once a day with a signed response. Only the licence key, product, domain, a random install id, the version and production/staging are sent. If a check fails, admin Settings and updates lock after 14 days of grace until the licence verifies again; booking pages, the widget, the portal, payments, reminders and the calendar keep working.
Launch offer: coupon APPTLAUNCH25.
Changelog RSS
- addedFirst release.
- added**Branches:** multiple branches with their own timezone, currency, opening hours, holidays and per-branch prices. DST-safe slot engine.
- added**Staff and services:** schedules with breaks and time off, buffers, extras, group capacity, per-staff prices, CSV import for customers and services.
- added**Scheduling:** "any available" round-robin (least recently booked, fewest that day, weighted priority) and team bookings that need 2 or more specialists together. Double bookings are prevented under concurrent load.
- added**Payments:** Stripe (Payment Intents, SCA ready) and PayPal Orders v2, with fixed or percentage deposits, full prepayment or pay at venue. Verified, de-duplicated webhooks, automatic refunds by cancellation policy, desk payments. Sandbox mode.
- added**Messages:** email, SMS (Twilio or a generic HTTP gateway) and WhatsApp Cloud API. Confirmations, configurable reminders, reschedule, cancel and review messages, with opt-outs, queueing, retries and a delivery log.
- added**Customer portal:** one-time, expiring sign-in links or password; reschedule, cancel with the refund shown first, pay the balance, receipts, calendar files, notification preferences, GDPR export and erase.
- added**Booking widget:** about 7 KB gzipped, inline or popup, CSP friendly, themable, English, Spanish and Arabic (RTL), analytics events.
- added**Admin:** Filament dashboard, drag-and-drop calendar, bookings, reports with CSV export, settings, audit log. Roles: owner, branch manager, receptionist, staff, customer, with branch-scoped data.
- added**Install:** web installer for shared hosting and a CLI installer. The licence key is optional at install (14-day grace period).
- added**Licensing:** signed (Ed25519) licence checks and updates against aucip.com only, with no customer data. After the grace period only Settings and updates lock; bookings, the widget and the portal keep working. `DEMO` mode for public demos, with `appointments:demo-reset` to restore the demo data on a schedule (removes every non-seeded user) and read-only users and roles in demo mode.
- added**Requirements:** PHP 8.3 or 8.4. PHP 8.2 was never supported: Laravel 13 itself requires `php ^8.3` (`vendor/laravel/framework/composer.json`). The bundled `vendor/` is resolved for PHP 8.3 (Composer `config.platform.php` 8.3.0), and CI tests both versions.
- added**Licences:** Regular $35 and Extended $99. One licence = one end product. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Each additional end product needs another licence. One business with unlimited branches and staff counts as one end product. See `LICENSE`.
- added**Quality:** Pest feature tests, Larastan level 6, Pint, and GitHub Actions CI.
- improved**PHP 8.3 vendor:** `composer.json` `config.platform.php` = 8.3.0 and a regenerated `composer.lock` (Symfony components 8.1 → 7.4, `masterminds/html5` added; Laravel, Filament and Livewire unchanged). The bundled platform check now requires PHP ≥ 8.3.0 instead of 8.4.1.
- improved**Money formatting:** new `App\Support\Money` (short symbol and Latin digits, e.g. "12.50 £" instead of "UK£" in Arabic), used in the portal and the refund message; amounts wrapped in `<bdi dir="ltr">`. The widget uses `narrowSymbol` and Latin digits. Test: `MoneyTest`.
- improved**RTL font:** IBM Plex Sans Arabic for Arabic headings, portal date tiles and the widget's day numbers (`app.css`, `embed.css`, `admin-brand.css`).
- improved**Admin bookings list:** default sort is appointment date, latest first. With and Branch show from 1280px (xl), as in the design-gated 1366px layout. The When column shows the date on one line and the time with a short relative time under it (year only when not this year), the Edit action is icon-only and cell padding is tighter at 1280–1439px, so every column fits at 1280px without scrolling; client, service, staff and branch wrap, and amounts drop ".00" on whole numbers so Total, Paid and Balance fit at 1280px.
- improved**Demo security:** `appointments:demo-reset` deletes every user that is not a seeded demo account; Customers & team is read-only in demo mode (create, edit, delete and role changes refused server-side). Tests: `DemoResetTest`.
- improved**Licence client hardening (L1–L3):** local mode is decided by hostname only (an env value can't force it); a local APP_URL served on a public request host drops local mode and the scheduled check activates that host; the public key is a code constant (no longer in config) and unsigned, foreign-key or stale answers are refused. Messages for `staging_limit_reached`, `not_entitled` and `activation_paused_*` follow the API docs.
- improved**Licence server updates (patch-license4/5):** staging decided by host only (adds `test.*`, `uat.*`, `preview.*` and tunnels; a declared staging on another host is production); local detection adds 127.0.0.0/8, bracketed `::1` and `0.0.0.0`; a random nonce on every request, and answers whose signed domain, product, key hash or nonce don't match are refused (`replay_mismatch`). The host observer is global middleware (API and admin requests too); grace starts once at a host switch and isn't reset by alternating hosts; the test-only key override is ignored outside the test suite.
- improved**Licence final security fixes (QA b0c729b, S1–S6):** a host change only records the host and schedules re-activation; it never resets the grace period, last successful check or lock, which only a signed valid answer clears. Deactivate keeps the licence clock. Tunnels are always staging. The API base is pinned to https://aucip.com/api, and update downloads must be signed https links on aucip.com with a signed SHA-256 checksum. The test seam only opens under a real PHPUnit run (never APP_ENV=testing). Licence tests set up their own install marker.
- improved**Licence rule G4 (QA re-test 71101a6):** grace comes only from aucip.com's signed first-seen date or the last signed valid answer; missing, unreadable or future-dated licence state on a public host is locked until a signed answer; a signed rejection or a Deactivate locks at once (also after re-entering the key) until a signed valid answer; no unsigned grace at install or on a host change. Download links are checked like a browser would parse them (no backslashes, credentials or lookalike hosts).
- improved**Demo hotfixes:** the Users create/edit Livewire submits re-check permissions; signed-in team members can't add customers (including from the booking form) in demo; team members may save their own portal preferences; `demo-reset` clears only the app's settings cache key.
- improved**Reception role:** in Customers & team, owners and branch managers create and delete users; receptionists can edit customers but no longer create or delete users; staff have no access. In demo mode the New user, Import, Edit and Delete controls are hidden. Tests: `DemoResetTest`.
- improved**Requirements note:** PHP 8.2 was never supported; Laravel 13 requires `php ^8.3`.
- improved**Copy:** canonical licence wording (LICENSE, README, licence page via `lang/en/licence.php`); no competitor names in docs or code comments; IBM Plex Sans Arabic credited in the README.
- improved**Local/staging installs (staging cap):** localhost, `*.localhost`, `*.test`, `*.local`, loopback IPs (127.0.0.1, ::1) and private IPv4 ranges are exempt from the staging cap and treated as free local installs (no activation, no calls to aucip.com, never locked); staging domains are reported as `environment=staging`, and the server's `staging_limit_reached` answer shows a clear admin message (3 staging installs per licence). Tests in `LicenseTest`.
- improved**Tests:** `phpunit.xml` pins `AUCIP_API`, `DEMO`, `APP_URL` and the licence environment so a local `.env` cannot change test results.
Reviews
No reviews yet.
Questions & answers
No questions yet.
Log in to ask a question.