Home / Documentation
📦 Features

GlossHub Documentation

The complete reference for GlossHub v2.1 — the all-in-one operating system for modern salons. Every feature, every setting, every workflow.

Introduction

GlossHub is a self-hosted salon management application that replaces 15+ SaaS subscriptions with a one-time purchase. It runs on standard shared hosting (PHP + MySQL), is fully white-label, and is built for real salons used by real owners and stylists every day.

What it replaces

Booksy / Fresha / VagaroBooking + calendar + staff schedules
Mindbody / GlossgeniusFull salon ops
MailchimpEmail campaigns (BYOK)
TextMagic / EZ TextingSMS reminders & blasts
Loyalzoo / Smile.ioPoints · rewards · birthday bonus
LinktreeBranded link-in-bio page
Acuity / CalendlyOnline booking widget
Square POSBuilt-in POS + product sales
TippyQR tipping + split rules
Canva ProAI copy & caption generator
Wix / SquarespaceSalon branded public page
QR generatorsBooking · review · tip · portfolio
Birdeye / NiceJobAuto review request → Google push
Gift card platformsDigital gift cards
Membership platformsRecurring memberships

Total replaced: ~$350–700/month of SaaS. GlossHub price: one-time license.

Installation

GlossHub installs in under 5 minutes on any standard shared hosting account. No SSH, no Composer, no Node, no command line.

Step 1 — Upload files

Upload the GlossHub ZIP via your hosting panel's file manager or FTP. Extract to your desired location (root, subdomain, or subfolder — all work). Common destinations:

Step 2 — Create a MySQL database

In your hosting panel, create:

Step 3 — Run the web installer

Visit https://your-domain.com/install/ in a browser. The installer runs through 6 steps:

  1. System check — confirms PHP version, PDO, cURL, mbstring, GD, openssl extensions, and writable folders
  2. Database connection — host/port/name/user/password
  3. Owner account — name, email, password (min 8 chars)
  4. Brand setup — salon name, tagline, logo emoji, colors, timezone, currency, address, phone
  5. License activation — paste your GH-XXXX-XXXX-XXXX-XXXX key (or skip and activate later)
  6. Done — log in and start adding services
Note: After installation, the app/config/installed.lock file is created automatically. This prevents the installer from running again. To reinstall, delete that file.

First-time setup checklist

Once installed, do these things in order:

  1. Brand — Settings → Brand: confirm name, logo, colors, currency, timezone
  2. Salon hours — Settings → Booking: set weekly open/close hours and days
  3. Service categories — Categories: add groups (Cuts, Color, Treatments)
  4. Services — Services: add what you offer with prices & durations
  5. Staff — Staff: add each stylist, set their weekly schedule and commission %
  6. Integrations — Settings → Integrations: paste your Twilio, SMTP, Stripe, AI keys
  7. Link-in-bio — Settings → Links: add Instagram, TikTok, Google Maps
  8. Consent forms — Consent forms: create signature templates for color/chemical services
  9. Pages — Pages: edit the About, Terms, Privacy templates
  10. Test a booking — open your public URL, book yourself, walk through checkout

System requirements

RequirementMinimumRecommended
PHP8.08.2+
MySQL / MariaDB5.7 / 10.38.0 / 10.6+
Extensionspdo_mysql, curl, mbstring, openssl, gd, fileinfo
ServerApache (mod_rewrite) or Nginx
Disk50 MB500 MB+ (for uploads)
RAM128 MB / PHP process256 MB+
HTTPSOptionalRequired for PWA & Stripe

Booking management

Bookings live at Admin → Bookings. They can be created online (by clients via the public booking flow), via the admin "New booking" form, by phone (manual entry), or as walk-ins.

Booking statuses

Creating a booking (admin)

  1. Click + New booking
  2. Pick the client — existing, new (auto-creates), or walk-in
  3. Select service · stylist (or "no preference") · date · time
  4. Optional internal notes
  5. Optionally check Make this recurring to create a series
  6. Click Create booking — confirmation SMS fires immediately if SMS configured

Editing & rescheduling

Open any booking → use the Edit / reschedule form to change date, time, stylist, status. Rescheduling automatically cancels old reminders and schedules new ones (confirmation, 24h, review request).

Check out → POS

On the booking detail page, click ✓ Check out → POS. The booking is marked completed and a draft invoice is pre-populated with the booked services. From there: add products, apply discounts/promo codes, set tip, take payment.

Calendar views

Two views are available:

Each block is clickable to jump to the booking detail.

Recurring bookings

For regular clients (every 6 weeks, every month, etc.) you can create a series at booking time.

  1. Create a booking normally
  2. Before submitting, expand ↻ Make this recurring
  3. Set repeat every X weeks (1–26)
  4. Set how many times (0–52). 0 = just this one
  5. All future bookings are created with reminders pre-scheduled

Each individual booking in the series can be edited, rescheduled, or cancelled independently. The series itself is tracked in gh_recurring_series.

Waitlist

When a client wants a slot you don't have, add them to the waitlist:

Future enhancement: auto-notify waitlisted clients when a matching cancellation opens up.

Block-off & time off

Two mechanisms for blocking time:

Block-off times

Short-term: lunch, training, deep-clean. Set start/end on a specific date for one stylist or the whole salon. Online booking skips these slots automatically.

Staff time off

Multi-day: vacations, sick days. Per-stylist date range with a reason label. Time off is respected by the booking engine — clients won't see those days for that stylist.

Reminders queue

GlossHub auto-sends three reminders per booking:

View the queue at Admin → Reminders:

The ▶ Run queue now button manually triggers the cron — useful for debugging.

How the cron works: Every admin page load triggers a 60-second-throttled "heartbeat" that processes due reminders and campaigns. No real cron job is required on shared hosting. For higher-volume salons, set up a real cron hitting /cron every minute.

Client profiles (CRM)

Every client gets a rich profile at /admin/clients/{id}:

Clients are auto-created when someone books online (matched by phone number — never duplicates).

Color formula cards

The "scrap-of-paper" replacement. On each client's profile, the Color formula history section stores:

Every record is timestamped. The stylist who entered it is auto-recorded. Search a client's history before every color appointment — never re-formulate from scratch again.

Loyalty program

Built-in points system. Configure at Settings → Booking → Loyalty:

Define rewards at Admin → Loyalty:

Owners can also manually award points to any client (apology gesture, referral bonus, etc.).

Services

Define what you sell at Admin → Services. Each service has:

Archived services keep their booking history but stop appearing in new bookings.

Service categories

Optional groups for organizing services. Common categories: Cuts & Styling, Color, Treatments, Bridal, Add-ons. Each category gets a name, icon, and sort order.

Manage at Admin → Categories.

Staff & schedules

Add each team member at Admin → Staff. Each staff record has:

Weekly schedule

Below the staff form, set a weekly recurring schedule — Mon–Sun, per-day start/end times, or "closed" if they don't work that day.

Roles

RoleCan do
OwnerEverything (only one per install)
ManagerSame as owner except cannot modify license or owner account
StylistView their own calendar, check out clients, view their own portfolio
AssistantView calendar, take POS, no settings access

Salon hours

Master open hours apply to the entire salon, separate from individual stylist schedules. Set at Settings → Booking → Salon hours.

The booking engine respects salon hours as the outer boundary — even if a stylist's schedule extends later, online bookings won't go past the salon close time.

Products / inventory

Manage at Admin → Inventory. Each product:

When a product is sold via POS, stock auto-deducts. The dashboard highlights "Needs attention" with the count of products at or below alert threshold.

Point of Sale

Process every transaction at Admin → POS → + New sale.

Adding items

Three item types:

Each line can have its own quantity, price, and stylist (for commission tracking).

Workflow

  1. Pick a client (or "walk-in" for anonymous)
  2. Add items to the cart
  3. Apply discount and/or tip
  4. Click Create invoice — generates a draft invoice with auto-numbered ID
  5. On the invoice page, click Record payment — pick method (cash, card, Stripe, PayPal, gift card, bank), amount, confirm
  6. Print, email, or refund as needed

Payment methods

Supported methods:

Tip splits

When a tip is added at POS, you can split it across multiple stylists by percentage. Useful when:

Each tip split is recorded in gh_tips with the share %. Reports → "By stylist" shows tips per stylist for any date range.

Refunds (full & partial)

On any paid invoice, click Refund:

For Stripe payments, the refund is processed through the Stripe API directly.

Receipts — print, email, PDF

On any invoice (paid or draft), three options:

Receipts auto-include your salon branding, all line items, payments, refunds, and the custom receipt footer you set in Settings → Booking.

Promo codes

Create at Admin → Promo codes. Each code has:

Toggle codes on/off without deleting (useful for seasonal promos that come back).

Tax / VAT

Configure at Settings → Booking:

Gift cards

Two issuance paths:

  1. Public purchase — at /gift-cards, anyone can buy one with the salon's payment method
  2. Admin issue — Admin → Gift cards → Issue gift card (good for in-person sales, gifts, promos)

Each card has a unique 12-char code, original value, current balance, optional recipient name/email/message, and expiry date. Redemption is via POS — pick "Gift card" as payment method and enter the code.

The admin dashboard shows total outstanding balance — a real liability metric for the business.

Memberships

Create recurring revenue with tiered memberships at Admin → Memberships. Each tier:

Active client memberships are tracked with start date, next renewal, and status.

Email & SMS campaigns

Manage at Admin → Marketing. Each campaign has:

The ✨ AI write for me button drafts the body and subject for you (powered by 1min.ai or OpenAI).

After scheduling, view the campaign page to see queued/sent/failed counts updating in real time.

AI Assistant

At Admin → AI Assistant. Five task types:

All AI calls are logged in gh_ai_logs with prompt, response, and (eventually) token usage. The AI runs on the buyer's BYOK key — Sergiu / the seller never pays for AI usage.

Reviews

The post-visit flow:

  1. 2 hours after a booking ends, a review SMS fires to the client with a short link
  2. The client opens /r/{code}, picks 1–5 stars, optionally writes a comment
  3. If 4–5 stars AND a Google review URL is configured, the client is redirected to your Google review page
  4. If 1–3 stars, the review is captured internally for you to respond privately

At Admin → Reviews: read every review, write public responses (shown on the stylist's public profile), see average rating.

Portfolio

Upload work at Admin → Portfolio. Each item:

Public gallery is at /portfolio. Stylist-specific portfolios appear on each stylist's public profile.

QR codes

Pre-generated QR codes at Admin → QR codes, ready to download as PNG and print:

QR codes regenerate automatically if you change your domain.

Public booking flow

Live at your root URL (/). A 4-step (or 5 with consent) flow:

  1. Service — grid of all online-bookable services
  2. Stylist — pick a specific stylist or "no preference"
  3. Date & time — horizontal 14-day strip + live availability grid (booked slots greyed out)
  4. Your info — name, phone, email (optional), notes (optional)
  5. Consent (only if service requires it) — read form, sign on canvas

On confirm: client gets immediate SMS confirmation, salon admin sees the new booking in dashboard, reminders are scheduled.

The booking confirmation page (/b/{code}) lets the client reschedule or cancel without logging in. A magic-link experience.

Link-in-bio

Replaces Linktree. Public page at /links with:

Configure links at Settings → Link-in-bio. Set this URL as your Instagram bio link.

Client portal

Passwordless login at /portal/login. Clients enter their phone, receive a 6-digit SMS code, sign in, see:

Toggle on/off at Settings → Booking → "Client portal enabled".

Booking widget embed

Embed your booking flow in an iframe on any website (Wix, WordPress, Squarespace, custom).

  1. Admin → click the embed page (or hit /admin/embed)
  2. Copy the snippet
  3. Paste into your client's website builder

The widget shows the service grid; clicking a service opens the full booking flow in a new tab.

Custom pages

Create unlimited custom pages at Admin → Pages: About, Terms, Privacy, FAQ, Cancellation policy, anything.

Each page has:

Convenience URLs work too: /about, /terms, /privacy if those slugs exist.

PWA install

GlossHub is a Progressive Web App. On mobile (iOS or Android), clients can tap "Add to Home Screen" and the booking page becomes a full-screen app icon. Same for the admin — owners can install the dashboard as an app.

Behind the scenes: a service worker caches the booking page for offline browsing, and the manifest provides the icon + colors. Works on root, subdomain, and subdirectory installs.

White-label branding

GlossHub is 100% white-label. Configure at Settings → Brand:

Light / dark theme

GlossHub ships with two beautifully-tuned themes:

Every visitor sees the default you choose at Settings → Booking → Default theme. They can toggle via the ☀️/🌑 button in the header — their preference is saved in localStorage for next visit.

Custom CSS

For ultimate control. Paste any CSS at Settings → Brand → Custom CSS. It's inlined at the end of the layout's <style> block, so it can override anything.

The full theme system is driven by CSS custom properties:

--brand-primary, --brand-accent
--bg-primary, --bg-secondary, --bg-surface, --bg-card, --bg-elevated
--text-primary, --text-secondary, --text-muted
--border, --border-bright
--success, --danger, --warning, --info

Override any of these to retheme without touching the core CSS.

Twilio SMS (BYOK)

For SMS reminders, marketing, client portal passwordless login.

  1. Sign up at twilio.com
  2. Buy a phone number that supports SMS in your country
  3. Console → Account Info: copy Account SID and Auth Token
  4. Paste into Settings → Integrations → Twilio
  5. Enter your purchased number as From number (E.164 format, e.g. +15551234567)

Typical cost: ~$0.007 per SMS in the US, ~€0.04 in Europe. You pay Twilio directly — GlossHub never touches your bills.

SMTP email (BYOK)

For booking confirmations (email), marketing emails, password resets. Use any SMTP provider:

Settings → Integrations → SMTP:

GlossHub uses a tiny built-in SMTP client (no PHPMailer dependency). Falls back to PHP's mail() if SMTP host is blank.

Stripe payments (BYOK)

For accepting card payments + deposits at online booking.

  1. Sign up at stripe.com
  2. Dashboard → Developers → API keys
  3. Copy Publishable key (pk_live_…) and Secret key (sk_live_…)
  4. Paste into Settings → Integrations → Stripe

Stripe takes ~2.9% + 30¢ per transaction. The buyer pays Stripe directly — payouts go straight to the salon's bank.

AI provider (BYOK)

Two options:

1min.ai (recommended)

Aggregator that gives access to GPT-4, Claude, Gemini, etc. via one key. Pay-as-you-go, no subscription.

  1. Sign up at 1min.ai
  2. Settings → API Keys → Generate
  3. Paste into Settings → Integrations → AI API key

OpenAI

Direct OpenAI access. Slightly cheaper at scale.

  1. Sign up at platform.openai.com
  2. API Keys → Create new secret key
  3. Change provider dropdown to "OpenAI" and paste the key

Google reviews link

Settings → Booking → Google review URL. Paste the direct review link Google generates for your business:

https://g.page/r/your-business-id/review

When a client leaves a 4 or 5 star review on GlossHub, they're auto-redirected here to repost it publicly on Google.

Reports

At Admin → Reports. Set a date range and see:

The dashboard shows a 14-day revenue chart at a glance.

Activity log

Every important action is logged in gh_activity_log. View at Admin → Activity:

Logs auto-prune after 180 days to keep the table fast.

Data export (CSV)

GDPR-friendly. You own your data — download any table as CSV at /admin/export:

Authentication

Email + password login at /admin/login. Passwords are hashed with PHP's password_hash() (bcrypt by default, future-proof). Sessions use HttpOnly + SameSite cookies.

CSRF tokens protect every POST form. Stored in session, validated on submit.

Two-factor auth (TOTP)

Enable at Admin → 2FA:

  1. Install Google Authenticator, Authy, or 1Password
  2. Scan the QR code on the 2FA page
  3. Enter the 6-digit code to confirm

From now on, login requires email + password + 6-digit code.

Built-in TOTP implementation per RFC 6238 — no external dependency.

Login rate limiting

Defenses against brute force:

URL routes (public)

URLPurpose
/Public booking flow
/portfolioPhoto gallery
/linksLink-in-bio
/gift-cardsBuy a gift card
/b/{code}Booking detail (client link)
/b/{code}/rescheduleClient reschedule
/r/{code}Leave a review
/portal/loginClient portal sign in
/portalClient dashboard
/staff/{slug}Stylist public profile
/embed/widgetIframe-able booking widget
/p/{slug}Custom page
/sitemap.xmlSEO sitemap
/robots.txtBot directives
/manifest.jsonPWA manifest
/sw.jsPWA service worker

API endpoints

Read-only JSON endpoints for the booking widget & future integrations:

EndpointReturns
/api/servicesAll active, bookable services
/api/staffAll active stylists
/api/availability?service_id=X&staff_id=Y&date=YYYY-MM-DD30-min slot grid for that day
/api/consent-for?service_id=XConsent form required for this service (if any)

Database tables

All tables prefixed gh_ so GlossHub can share a database with other apps on shared hosting.

gh_usersOwner + staff accounts
gh_clientsSalon customers (CRM)
gh_servicesService catalog
gh_service_categoriesService groups
gh_service_staffStylist-service pairings
gh_staff_scheduleWeekly working hours
gh_staff_time_offVacations
gh_salon_hoursMaster open hours
gh_bookingsAppointments
gh_booking_servicesBooking line items
gh_block_offTime blocks
gh_waitlistWaitlist entries
gh_recurring_seriesRecurring booking parents
gh_invoicesPOS sales
gh_invoice_linesSale items
gh_paymentsPayment records
gh_tipsTip splits
gh_productsInventory
gh_gift_cardsCard balances
gh_gift_card_usesRedemptions
gh_membershipsMembership tiers
gh_client_membershipsActive subscriptions
gh_loyalty_transactionsPoint ledger
gh_loyalty_rewardsRedeemable rewards
gh_promo_codesDiscount codes
gh_campaignsMarketing blasts
gh_campaign_recipientsPer-recipient status
gh_remindersScheduled SMS / emails
gh_consent_formsTemplates
gh_consent_submissionsSigned forms
gh_formula_cardsColor history
gh_reviewsStar ratings
gh_portfolioBefore/after photos
gh_ai_logsAI prompt history
gh_activity_logAudit trail
gh_login_attemptsRate limit data
gh_webhooksOutgoing webhooks
gh_filesUpload metadata
gh_pagesCustom CMS pages
gh_link_blocksLink-in-bio entries
gh_cron_logHeartbeat run history
gh_settingsKey/value config
gh_licenseLicense key
gh_sessionsUser sessions

Heartbeat cron

Shared-hosting-safe pseudo-cron. Every admin page load triggers Cron::heartbeat() which runs at most every 60 seconds (throttled by cron_last_run setting). Jobs:

For high-traffic salons or to guarantee delivery even when no one is in admin, set up a real cron:

* * * * * curl -s https://your-domain.com/glosshub/cron >/dev/null

Sitemap & SEO

Auto-generated:

Each public page has SEO-friendly title and meta description. Submit your sitemap to Google Search Console for indexing.

License key

License format: GH-XXXX-XXXX-XXXX-XXXX (standard), GHE-… (extended), GHS-… (SaaS).

Activate at install time (step 5) or later at Settings → License. Validation is offline (checksum + format), no phone-home required — keeps the install shared-hosting-safe and privacy-friendly.

TierRights
StandardSingle salon, single domain
ExtendedSingle salon + agency resale rights
SaaSMulti-salon white-label

Upgrading

To upgrade GlossHub:

  1. Back up your database (any cPanel backup tool)
  2. Back up the uploads/ folder
  3. Upload the new version's files, overwriting everything except app/config/ and uploads/
  4. Visit /upgrade.php as the owner — it runs all pending migrations
  5. Done. All migrations are additive — your data stays intact

Troubleshooting

"Database connection failed"

The installer hasn't been run, or the database credentials in app/config/config.php are wrong. Delete the lock file and re-run /install/.

"500 Internal Server Error"

Check data/error.log. Most common: PHP version < 8.0, or missing extension. Confirm requirements in the System check step.

"SMS not sending"

Settings → Integrations → Twilio: confirm SID + token + from number are saved. The from number must be E.164 (+1551234567). Check Twilio console for delivery logs & balance.

"Reminders stuck in queued"

The heartbeat cron only runs when admin pages load. Hit Admin → Reminders → ▶ Run queue now to fire manually. For automation, set up a real cron hitting /cron.

"Email not sending"

Settings → Integrations → SMTP: test with a known-good provider like SendGrid. If your host blocks outbound SMTP ports, use port 587 with TLS. If still failing, GlossHub falls back to PHP's mail() — check your hosting's mail logs.

"AI says 'not configured'"

Settings → Integrations → AI API key. Make sure the provider dropdown matches your key (1min.ai vs OpenAI).

"PWA won't install"

PWAs require HTTPS. Make sure your domain has SSL (free via Let's Encrypt).

FAQ

Can I run GlossHub on shared hosting?

Yes — that's the whole point. No SSH, no Composer, no Node required. Works on Bluehost, Hostinger, A2, SiteGround, HostGator, GoDaddy, and any cPanel-style host.

Can I run multiple salons from one install?

The SaaS tier (Tier 3) supports this in the roadmap. Today, one install = one salon. To run multiple, set up multiple installs (each in its own subdomain or database).

Will buyers see "GlossHub" branding?

Only if you choose. Settings → Brand → "Powered by GlossHub" toggle removes it from the footer. With your own logo + name + colors, no client will ever know it's GlossHub underneath.

Can I import data from Booksy / Fresha / Square?

Currently via CSV upload (client list mapping). Full importers for major platforms are on the roadmap.

Does it work without SMS / email?

Yes — those features simply turn off if not configured. You can run GlossHub as a pure online-booking platform with no notifications, then enable Twilio/SMTP later.

What about multi-language?

v2.1 ships in English. Multi-language support (i18n) is on the roadmap.

How do I migrate to a new server?

Standard PHP migration: copy the entire glosshub/ directory + a MySQL dump. Restore on the new server, update app/config/config.php if DB credentials changed. Done.

Can stylists log in and see only their own bookings?

Yes — create staff with role stylist. They see only the calendar they're booked on. Owner + manager see everything.