Skip to content
Aucip Appointments

Aucip Appointments

Self-hosted Laravel booking for multi-branch salons and clinics: team appointments, Stripe/PayPal deposits, SMS/WhatsApp reminders and an embed widget.

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 dataLayer pushes.
  • Customer portal: one-time email link or password sign-in; reschedule, cancel with the refund shown first, pay the balance, receipts, .ics files, 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=true for a read-only public demo.

Requirements

  • PHP 8.3+ (pdo_mysql or pdo_sqlite, mbstring, openssl, intl, fileinfo, tokenizer, curl, bcmath, sodium)
  • MySQL 8+ / MariaDB 10.6+ (SQLite for evaluation)
  • One cron entry; writable storage/ and bootstrap/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

v1.0.0 Oct 13, 2026 · stable
  • 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.