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
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:
/public_html/— runs at your root domain/public_html/salon/— runs atyourdomain.com/salon/- Subdomain doc root (e.g.
salon.yourdomain.com)
Step 2 — Create a MySQL database
In your hosting panel, create:
- A new MySQL database (any name — e.g.
cpanel_glosshub) - A database user with full privileges on that database
- Note the host (usually
localhost), database name, username, and password
Step 3 — Run the web installer
Visit https://your-domain.com/install/ in a browser. The installer runs through 6 steps:
- System check — confirms PHP version, PDO, cURL, mbstring, GD, openssl extensions, and writable folders
- Database connection — host/port/name/user/password
- Owner account — name, email, password (min 8 chars)
- Brand setup — salon name, tagline, logo emoji, colors, timezone, currency, address, phone
- License activation — paste your GH-XXXX-XXXX-XXXX-XXXX key (or skip and activate later)
- Done — log in and start adding services
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:
- Brand — Settings → Brand: confirm name, logo, colors, currency, timezone
- Salon hours — Settings → Booking: set weekly open/close hours and days
- Service categories — Categories: add groups (Cuts, Color, Treatments)
- Services — Services: add what you offer with prices & durations
- Staff — Staff: add each stylist, set their weekly schedule and commission %
- Integrations — Settings → Integrations: paste your Twilio, SMTP, Stripe, AI keys
- Link-in-bio — Settings → Links: add Instagram, TikTok, Google Maps
- Consent forms — Consent forms: create signature templates for color/chemical services
- Pages — Pages: edit the About, Terms, Privacy templates
- Test a booking — open your public URL, book yourself, walk through checkout
System requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| PHP | 8.0 | 8.2+ |
| MySQL / MariaDB | 5.7 / 10.3 | 8.0 / 10.6+ |
| Extensions | pdo_mysql, curl, mbstring, openssl, gd, fileinfo | |
| Server | Apache (mod_rewrite) or Nginx | |
| Disk | 50 MB | 500 MB+ (for uploads) |
| RAM | 128 MB / PHP process | 256 MB+ |
| HTTPS | Optional | Required 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
- Confirmed — locked in, reminders will fire
- Pending — awaiting confirmation (if auto-confirm is off)
- Completed — checked out at POS
- Cancelled — either client- or salon-initiated
- No-show — for analytics & no-show fees
Creating a booking (admin)
- Click + New booking
- Pick the client — existing, new (auto-creates), or walk-in
- Select service · stylist (or "no preference") · date · time
- Optional internal notes
- Optionally check Make this recurring to create a series
- 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:
- List view (default) at
/admin/bookings— filter by date and status, table of all bookings for that day - Week calendar at
/admin/bookings/calendar— visual grid showing every stylist's day side-by-side with color-coded blocks
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.
- Create a booking normally
- Before submitting, expand ↻ Make this recurring
- Set repeat every X weeks (1–26)
- Set how many times (0–52).
0= just this one - 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:
- Admin → Waitlist → + Add to waitlist
- Pick client, optional service, optional stylist preference, date range, notes
- Mark Matched when you find a slot, or delete when expired
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:
- Confirmation — fires immediately after booking
- 24h reminder — day before appointment
- Review request — 2 hours after appointment ends
View the queue at Admin → Reminders:
- Queued — scheduled, waiting for cron to fire
- Sent — successfully delivered to Twilio/SMTP
- Failed — error returned (click ↻ to retry)
- Skipped — booking was cancelled/rescheduled before this reminder fired
The ▶ Run queue now button manually triggers the cron — useful for debugging.
/cron every minute.Client profiles (CRM)
Every client gets a rich profile at /admin/clients/{id}:
- Identity — name, phone, email, DOB, address, photo
- Stats — visit count, loyalty points, total lifetime spend
- Visit history — every past booking with service and status
- Color formula history — see the next section
- Notes — timestamped, append-only journal
- Tags — VIP, color client, new, allergic, etc.
- Marketing consent — email + SMS opt-in flags (GDPR-friendly)
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:
- Area (roots / mids / ends / foils)
- Brand (Wella, Schwarzkopf, Redken…)
- Formula (e.g.
6N + 6.43 + 20vol 1:1.5) - Developer (10/20/30 vol)
- Process time
- Free-text notes
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.
Consent forms & digital signatures
Required for chemical services in most jurisdictions. GlossHub provides:
- Form templates (Admin → Consent forms) — HTML body, attached to specific services
- Auto-prompt at booking — when a client books a service requiring consent, a signature step appears before they can confirm
- Canvas signature pad — works on finger touch or mouse
- Submission archive — every signed form is stored with timestamp, client, booking ID, and base64 PNG of the signature
To inspect a signature, go to Admin → Consent forms → Recent submissions → View.
Loyalty program
Built-in points system. Configure at Settings → Booking → Loyalty:
- Points per € — typically 1 point per €1 spent (excluding tips)
- Birthday bonus — automatic points award on client's birthday
- Enable / disable the whole system globally
Define rewards at Admin → Loyalty:
- € off discount (e.g. 50 pts = €5 off)
- % off discount
- Free service
- Free product
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:
- Name, icon (emoji), description
- Duration (min, 5-min increments)
- Buffer (clean-up time after, doesn't show as bookable)
- Price
- Deposit (optional — collected at online booking via Stripe)
- Category (optional)
- Available online (toggle — hide from public booking)
- Sort order
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:
- Full name, role (stylist · manager · assistant), email (login), password
- Phone, avatar (image upload)
- Specialty (shown to clients, e.g. "Balayage · Vivids")
- Bio
- Commission %
- Calendar color (for the week view)
- Avatar gradient (for stylist cards on public site, optional)
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
| Role | Can do |
|---|---|
| Owner | Everything (only one per install) |
| Manager | Same as owner except cannot modify license or owner account |
| Stylist | View their own calendar, check out clients, view their own portfolio |
| Assistant | View 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:
- Name, SKU, category
- Cost (your buy-in price) & price (retail)
- Stock count & low-stock alert threshold
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:
- Service — pick from your service catalog
- Product — pick from inventory (auto-deducts stock)
- Custom item — type a name and price for anything else
Each line can have its own quantity, price, and stylist (for commission tracking).
Workflow
- Pick a client (or "walk-in" for anonymous)
- Add items to the cart
- Apply discount and/or tip
- Click Create invoice — generates a draft invoice with auto-numbered ID
- On the invoice page, click Record payment — pick method (cash, card, Stripe, PayPal, gift card, bank), amount, confirm
- Print, email, or refund as needed
Payment methods
Supported methods:
- Cash — instant, no integration
- Card (manual) — for terminals not integrated with GlossHub
- Stripe — requires Stripe public/secret keys in Settings → Integrations
- PayPal — manual recording (link out for the actual payment)
- Gift card — enter the code, balance is auto-deducted
- Bank transfer — manual recording for invoiced sales
Tip splits
When a tip is added at POS, you can split it across multiple stylists by percentage. Useful when:
- An assistant did the shampoo
- Two stylists worked on one client
- The client wants to tip the colorist + the cutter
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:
- Toggle Partial refund to refund a specific amount
- Choose the refund method (back to original method is common)
- Confirm — a negative payment is recorded; full refunds also flip invoice status to "refunded"
For Stripe payments, the refund is processed through the Stripe API directly.
Receipts — print, email, PDF
On any invoice (paid or draft), three options:
- 🖨️ Print / PDF — opens a clean print-ready page. Use your browser's print dialog and "Save as PDF" to get a PDF.
- ⚡ Print now — same page, auto-opens print dialog
- 📧 Email receipt — sends a branded email with a link to the printable receipt (requires SMTP configured + client has email on file)
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:
- Code (e.g.
SUMMER20) — case-insensitive, auto-uppercased - Type — % off or € off
- Value
- Max uses (0 = unlimited)
- Min total (don't apply below this cart total)
- Expiry date
Toggle codes on/off without deleting (useful for seasonal promos that come back).
Tax / VAT
Configure at Settings → Booking:
- Tax / VAT rate % — applied to every taxable invoice line
- VAT label — customize (VAT, GST, IVA, TVA, MwSt, IGV…)
- Prices include VAT — toggle on/off (exclusive vs inclusive pricing)
Gift cards
Two issuance paths:
- Public purchase — at
/gift-cards, anyone can buy one with the salon's payment method - 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:
- Name + description
- Price + billing cycle (monthly / quarterly / yearly)
- Discount % applied to all services
- Custom benefits (free blowouts, priority booking, etc.)
Active client memberships are tracked with start date, next renewal, and status.
Email & SMS campaigns
Manage at Admin → Marketing. Each campaign has:
- Name (internal)
- Channel — email or SMS
- Audience segment — all clients · no visit in 60d · VIP (€500+ lifetime) · new this month
- Subject (email only)
- Body — use
{{name}}and{{salon}}as merge tags - Send at — datetime (leave blank to send now)
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:
- 📸 IG caption — 3 caption variants + hashtags for a hairstyle
- 📧 Email — full marketing email with subject + body
- 📱 SMS — ~140-char salon-friendly SMS with {{name}} placeholder
- ↻ Rebook nudge — warm rebook reminder based on last visit context
- 💬 Review reply — thoughtful response to a client review
- ✨ General — free-form prompt
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:
- 2 hours after a booking ends, a review SMS fires to the client with a short link
- The client opens
/r/{code}, picks 1–5 stars, optionally writes a comment - If 4–5 stars AND a Google review URL is configured, the client is redirected to your Google review page
- 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:
- Before photo (optional) + after photo (required)
- Caption
- Stylist (so it appears on their public profile)
- Tags
- Public toggle (show on /portfolio page)
- Featured toggle (pinned to top)
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:
- Book online — for window stickers, business cards, table tents
- Leave a review — post-visit thank-you cards
- Buy a gift card — holiday counter card
- See our work — Instagram bio link, waiting area
- All our links — link-in-bio for printed flyers
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:
- Service — grid of all online-bookable services
- Stylist — pick a specific stylist or "no preference"
- Date & time — horizontal 14-day strip + live availability grid (booked slots greyed out)
- Your info — name, phone, email (optional), notes (optional)
- 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:
- Big logo + tagline + brand colors
- "Book an appointment" primary button
- Any number of custom link buttons (Instagram, TikTok, Google Maps, Spotify, etc.)
- Call us · See our work · Gift cards · auto-included
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:
- Their loyalty points + visit count
- Upcoming bookings with manage links
- Full visit history
- One-tap "+ Book a new appointment"
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).
- Admin → click the embed page (or hit
/admin/embed) - Copy the snippet
- 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:
- Title
- Slug (URL path, e.g.
/p/about) - Body (HTML allowed)
- Show in footer toggle
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:
- App / salon name — replaces "GlossHub" everywhere on the public site
- Tagline
- Logo — upload an image, OR pick a single emoji
- Favicon — separate small icon for browser tabs
- Primary color & accent color — drives everything via CSS variables
- Custom CSS — power-user override for any styling
- Footer text — your copyright, address, custom links
- "Powered by GlossHub" — togglable off (clients never see GlossHub if you turn it off)
- Currency, currency symbol, timezone
- Address, phone, email
Light / dark theme
GlossHub ships with two beautifully-tuned themes:
- Light — clean, airy, spa-luxury feel (default)
- Dark — premium velvet, gold-accent feel
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.
- Sign up at twilio.com
- Buy a phone number that supports SMS in your country
- Console → Account Info: copy Account SID and Auth Token
- Paste into Settings → Integrations → Twilio
- 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:
- SendGrid — 100 free emails/day forever
- Postmark — best deliverability, $10 for 10k emails
- Mailgun — $35 for 50k emails
- Amazon SES — $0.10 per 1000 emails
- Your hosting provider's SMTP — usually free with limits
Settings → Integrations → SMTP:
- Host (e.g.
smtp.sendgrid.net) - Port (usually 587 for TLS, 465 for SSL)
- Username
- Password (or API key for SendGrid)
- From email + From name
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.
- Sign up at stripe.com
- Dashboard → Developers → API keys
- Copy Publishable key (
pk_live_…) and Secret key (sk_live_…) - 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.
- Sign up at 1min.ai
- Settings → API Keys → Generate
- Paste into Settings → Integrations → AI API key
OpenAI
Direct OpenAI access. Slightly cheaper at scale.
- Sign up at platform.openai.com
- API Keys → Create new secret key
- 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:
- Revenue, invoices, average ticket, tips
- Unique clients & new clients
- By service — most popular, highest revenue
- By stylist — bookings, revenue, tips per stylist
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:
- When something happened
- Which user
- What event (e.g.
booking.created,invoice.paid) - Which entity (e.g. booking #123)
- IP address
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:
- Clients
- Bookings
- Services
- Users (staff)
- Invoices
- Payments
- Reviews
- Loyalty transactions
- Gift cards
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:
- Install Google Authenticator, Authy, or 1Password
- Scan the QR code on the 2FA page
- 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:
- IP-based throttle: 8 failed attempts per IP per 15 minutes → locked out
- Account lockout: 5 failed attempts on a single account → 30-minute lockout
- Every attempt is logged in
gh_login_attemptsfor audit
URL routes (public)
| URL | Purpose |
|---|---|
/ | Public booking flow |
/portfolio | Photo gallery |
/links | Link-in-bio |
/gift-cards | Buy a gift card |
/b/{code} | Booking detail (client link) |
/b/{code}/reschedule | Client reschedule |
/r/{code} | Leave a review |
/portal/login | Client portal sign in |
/portal | Client dashboard |
/staff/{slug} | Stylist public profile |
/embed/widget | Iframe-able booking widget |
/p/{slug} | Custom page |
/sitemap.xml | SEO sitemap |
/robots.txt | Bot directives |
/manifest.json | PWA manifest |
/sw.js | PWA service worker |
API endpoints
Read-only JSON endpoints for the booking widget & future integrations:
| Endpoint | Returns |
|---|---|
/api/services | All active, bookable services |
/api/staff | All active stylists |
/api/availability?service_id=X&staff_id=Y&date=YYYY-MM-DD | 30-min slot grid for that day |
/api/consent-for?service_id=X | Consent 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.
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:
- sendDueReminders — send any reminder where
scheduled_for <= NOW() - processDueCampaigns — send queued campaign recipients in batches of 100
- pruneLogs — delete cron_log older than 30 days, activity_log older than 180 days
- dailyBirthdayBonus — award birthday points (idempotent, runs at most once per day)
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:
/sitemap.xml— includes home, portfolio, links, gift cards, every published custom page, every stylist profile/robots.txt— disallows /admin, /install, /app, points to sitemap
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.
| Tier | Rights |
|---|---|
| Standard | Single salon, single domain |
| Extended | Single salon + agency resale rights |
| SaaS | Multi-salon white-label |
Upgrading
To upgrade GlossHub:
- Back up your database (any cPanel backup tool)
- Back up the
uploads/folder - Upload the new version's files, overwriting everything except
app/config/anduploads/ - Visit
/upgrade.phpas the owner — it runs all pending migrations - 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.