| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Employees (hr) • Inventory (stock) • Invoicing (account) • Manufacturing (mrp) • Sales (sale_management) • Website (website) |
| Community Apps Dependencies | Show |
| Lines of code | 10516 |
| Technical Name |
wt_enterprise_salon |
| License | OPL-1 |
| Website | https://way4tech.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Employees (hr) • Inventory (stock) • Invoicing (account) • Manufacturing (mrp) • Sales (sale_management) • Website (website) |
| Community Apps Dependencies | Show |
| Lines of code | 10516 |
| Technical Name |
wt_enterprise_salon |
| License | OPL-1 |
| Website | https://way4tech.com |
Screenshots
WT Enterprise Salon — Complete Guide
Enterprise-grade Odoo 19 extension for professional salon operations. This guide covers every setting, every feature, and every workflow — from fresh installation to daily operations.
wt_enterprise_salon |
Depends on: wt_salon_management |
Version: 19.0.2.0.0 |
License: OPL-1
Contents
- How to Use — From Zero to Pro (Start Here)
- Requirements & Installation
- First-Time Setup (Step-by-Step)
- All Features Overview
- Settings Reference
- Loyalty Program
- Service Packages
- Memberships
- Gift Cards
- Customer Reviews
- Waitlist
- WhatsApp Integration & OTP
- Stripe Deposits
- Recurring Appointments
- Commission Automation
- Customer Portal (Filter Tabs, Smart Actions, Routes)
- Online Booking Flow
- Email & SMS Automation
- Scheduled Tasks (Crons)
- Staff & Roles
- Daily Operations
- Troubleshooting
- Upgrade Commands
- Support & Contact
How to Use — From Zero to Pro
This is the complete guided journey for a brand new user. Follow each phase in order.
By the end you will go from “just installed” to running a fully automated, enterprise-grade salon operation.
Prerequisite: wt_salon_management (base module) must be installed first.
Phase 1 — Install & First Settings Day 1 — about 20 minutes
You have the base module running. Now install the enterprise module and switch on the features you need.
-
Install WT Enterprise Salon
Go to Settings → Apps. Search for WT Enterprise Salon and click Install. After the install completes and the page refreshes, you will see new menu items under Salon and a new Settings → Salon Enterprise section. -
Open Enterprise Settings
Go to Settings → Salon Enterprise. This is your control panel for every enterprise feature. All features start with a simple On/Off toggle. Changes take effect immediately — no restart required. -
Enable Your Core Features (Recommended for Everyone)
Start by enabling these four — they add the most value for all salons:- Loyalty Program — Reward customers with points every time they visit.
- Customer Reviews — Let customers rate their experience after each appointment.
- Waitlist Management — Automatically notify customers when a fully-booked slot opens up.
- Service Packages — Sell pre-paid session bundles (e.g. 10 haircuts for the price of 8).
-
Verify the Portal
Open a private browser window and visit your website at /salon/book. You should see the booking form. This confirms the enterprise portal layer is active. Log in as a test customer at /web/login and visit /my to see the customer portal dashboard.
Phase 2 — Loyalty & Packages Day 2–3 — Set Up Customer Rewards
Set up your loyalty program and service packages. These two features directly drive repeat bookings and upfront revenue.
-
Configure the Loyalty Program
Go to Salon → Loyalty → Program Setup. Set:- Points per currency unit — e.g. 10 points per $1 spent
- Tier thresholds: Bronze (0 pts) → Silver (500 pts) → Gold (1,500 pts) → Platinum (5,000 pts)
-
Create a Service Package Template
Go to Salon → Packages → Package Templates. Click New. Fill in: Name (e.g. “10-Haircut Bundle”), Service, Session Count (10), Price ($150), Expiry Period (12 months). Save. The package is now available to sell. -
Sell a Package to a Customer
Go to Salon → Packages → Customer Packages. Click New. Select the customer and the package template. Set the purchase date and confirm. When creating appointments for this customer, the receptionist can apply the package — one session is deducted automatically. The customer sees remaining sessions on their portal page. -
Issue a Gift Card
Go to Salon → Gift Cards. Click New. Select the recipient, enter the initial balance (e.g. $50) and confirm. A unique code is generated. At checkout, enter the code to deduct from the invoice total. Customers see their total gift card balance on the portal.
Phase 3 — Email Automation & Reviews Week 1 — Keep Customers Engaged Automatically
Set up the email automations so the system communicates with customers on your behalf. You configure it once — it runs forever.
-
Configure Outgoing Mail
Before any automated emails can send, make sure your SMTP server is configured. Go to Settings → Technical → Outgoing Mail Servers and add your email server. Test it by sending a test email. This is a one-time setup. -
Enable Email Reminders
In Settings → Salon Enterprise → Email Automation: turn on Email Reminders and set Reminder Hours (e.g. 24 = remind 24 hours before the appointment). The system sends a reminder email automatically to every confirmed appointment within the window. No manual action needed — it runs every hour in the background. -
Enable Review Requests
Turn on Review Request Email and set Review Request Hours (e.g. 4 = 4 hours after the appointment is done). When a customer's appointment is marked Done, they receive an email with a link to leave a 1–5 star review. Reviews appear in Salon → Reviews as Pending. Open them and click Publish to make them visible. -
Enable Birthday Promotions
Turn on Birthday Email. Every day the system checks for customers whose birthday is today and sends them a personalised promo email. Make sure your customer contacts have their Date of Birth filled in. -
Enable Win-Back Campaigns
Turn on Win-Back Campaign and set Win-Back Days (e.g. 60). Every week, the system finds customers who have had no appointment in the last 60 days and sends them a “we miss you” email. This automatically re-engages lapsed customers without any effort.
Phase 4 — Online Payment & Verification Week 2 — Reduce No-Shows & Verify Customers
Stripe deposits eliminate no-shows by collecting a pre-payment at booking. WhatsApp OTP prevents fake accounts by verifying phone numbers. Both are completely optional — only enable what makes sense for your salon.
-
Set Up Stripe Deposits (Optional — Reduces No-Shows)
- Create a free account at
stripe.comif you don't have one. - Go to Stripe Dashboard → Developers → API Keys. Copy your Publishable key (starts with
pk_) and Secret key (starts withsk_). - In Odoo, go to Settings → Salon Enterprise. Paste both keys into the Stripe fields.
- Enable Deposit Required and set Deposit Percent (e.g. 20 for 20%).
Test first: Use Stripe test keys and card4242 4242 4242 4242before going live. - Create a free account at
-
Set Up WhatsApp OTP (Optional — Prevents Fake Bookings)
- Create a WhatsApp Business account in
business.facebook.com. Get your Phone Number ID and a System User Token. - Create three message templates in Meta Business Manager:
booking_confirmation,appointment_reminder, andphone_otp(must contain{{1}}as a variable for the OTP code). - Wait for Meta to approve the templates (usually 1–24 hours).
- In Odoo Settings → WhatsApp: enable it, enter your API Token and Phone ID, set the template names to match exactly what you created in Meta.
- Enable WhatsApp OTP to require phone verification at signup and guest booking.
- Create a WhatsApp Business account in
-
Test the Complete Booking Flow
Open a private browser window. Visit /salon/book as a guest. Fill in your test details. If OTP is enabled, enter your phone — a WhatsApp message will arrive. If deposits are enabled, you will be redirected to Stripe after submitting the form. Check that the confirmation page appears with your booking reference. In the backend, verify the appointment was created under Salon → Appointments.
Phase 5 — Advanced Features Week 3+ — Memberships, Recurring, Photos & Consent
You are running the core features confidently. Now unlock the powerful advanced features that set an enterprise salon apart.
-
Create Membership Plans
Enable Memberships in Settings. Go to Salon → Memberships → Membership Plans. Create plans like “Gold Monthly — $99/month”. Set which services are included, session allowances per period, and discount percentage. Go to Salon → Memberships → Customer Memberships to assign a plan to a customer. When the membership expires, the Check Expired Memberships cron automatically marks it expired and the customer sees this on their portal. -
Set Up Recurring Appointments
Enable Recurring Appointments in Settings. When creating a new appointment, tick the Recurring checkbox. Choose frequency (Weekly, Bi-Weekly, Monthly) and number of occurrences (max 12 by default). Click Confirm — all appointments in the series are created at once. Each occurrence is independent — you can cancel one without affecting the others. -
Enable Before/After Photos
Enable Before/After Photos in Settings. An Attachments tab appears on appointment forms. Staff can upload before and after photos for any appointment. These are stored per appointment and visible to managers for quality review. -
Enable Consent Forms
Enable Consent Forms in Settings. A consent section appears on appointment forms. Staff record whether the customer has signed the consent form. Stored per appointment for compliance and legal record-keeping. -
Manage the Waitlist
When a time slot is fully booked and a customer still wants it, staff can add them to the waitlist from the backend at Salon → Waitlist. Customers can also join from the portal themselves. When an appointment is cancelled, the system automatically notifies the next person in the waitlist queue. -
Enable SMS Notifications
Enable SMS in Settings (requires Odoo's built-in SMS credits or a configured SMS gateway). Turn on Booking Confirmation SMS, SMS Reminder and/or Cancellation SMS. Customers receive text messages automatically without any manual action.
Phase 6 — Full Automation & Pro Operations Month 2+ — Hands-Off Management
At this level the salon practically runs itself. Configure commission automation, verify all crons are running, and use daily operations checklists to stay on top of everything.
-
Enable Commission Automation
In Settings → Commission Automation:- Enable Auto-Confirm and set hours (e.g. 48) — commissions are confirmed automatically 48 hours after the appointment.
- Enable Auto-Pay and set days (e.g. 30) — confirmed commissions are marked paid after 30 days.
-
Daily Morning Checklist (Pro Routine)
- Open Salon → Appointments → Today — review all appointments and confirm any that are still New.
- Check Salon → Waitlist for any entries needing manual follow-up.
- Check Salon → Reviews → Pending and approve or reject overnight submissions.
- Scan Salon → Staff → Commission Earnings for any Draft commissions that need manual review.
-
During the Day — The Enterprise Flow
- Customer arrives → open appointment → click Start.
- Service finishes → click Done → loyalty points and review request trigger automatically.
- Invoice → click Invoice → commission line created, loyalty points awarded, package session deducted if applicable.
- Cancellation? → click Cancel → system notifies next waitlist customer automatically.
-
Verify All 12 Cron Jobs Are Active
Go to Settings → Technical → Automation → Scheduled Actions. Search “Salon”. You should see 12 active crons. Each one handles a different automation: reminders, review requests, birthday promos, win-back emails, commission automation, waitlist expiry, membership expiry, OTP cleanup. If any are inactive, click them and toggle them active. -
Referral Program
Enable Referral Program in Settings and set Referral Bonus Points (e.g. 100 points per referral). When a customer refers someone who makes a booking, the referrer earns bonus loyalty points automatically. This turns your existing customers into a marketing channel at zero cost. -
You Are Now a Pro User
Your salon is running fully automated: customers book online, pay a deposit, verify by WhatsApp, earn loyalty points, receive reminder emails, get review requests after each visit, and come back via win-back campaigns. Staff commissions confirm and pay themselves on schedule. All you do each morning is check today's appointments and approve any reviews.
Explore Section 20: Daily Operations for the exact checklist used by pro operators. Use Section 21: Troubleshooting if anything is not working as expected.
Quick Reference — Who Can Do What
| Action | Stylist | Receptionist | Manager |
|---|---|---|---|
| View own appointments | ✓ | ✓ | ✓ |
| View all appointments | — | ✓ | ✓ |
| Create / edit appointments | Own only | ✓ | ✓ |
| Create / manage services | Read only | ✓ | ✓ |
| Invoice appointments | — | ✓ | ✓ |
| Manage commissions | View own | View only | ✓ |
| Settings / configuration | — | — | ✓ |
| Loyalty / packages / reviews | — | Partial | ✓ |
1. Requirements & Installation
Prerequisites
| Item | Minimum | Notes |
|---|---|---|
| Odoo version | 19.0 Community or Enterprise | Not compatible with Odoo 16/17/18 |
| WT Salon Management | 19.0.x | Must be installed first |
| Python | 3.12+ | Bundled with Odoo 19 |
| PostgreSQL | 15+ | Standard Odoo requirement |
| WhatsApp (optional) | Meta Business API token | Only needed if enabling WhatsApp OTP/messages |
| Stripe (optional) | Stripe publishable + secret key | Only needed for online deposits |
Installation Steps
- Copy the
wt_salon_managementfolder into your Odoo addons path. - Copy the
wt_enterprise_salonfolder into your Odoo addons path (same directory). - Restart the Odoo server:
docker-compose restart odoo(or your server command). - Go to Settings → Apps → Update Apps List.
- Search for WT Salon Management and click Install.
- Once installed, search for WT Enterprise Salon and click Install.
- Navigate to Settings → Salon Enterprise to configure your features.
wt_salon_management BEFORE wt_enterprise_salon.
The enterprise module depends on the base module's models and menus.
Docker Quick Install
# Stop the container docker-compose stop odoo # Upgrade (install) the enterprise module docker-compose run --rm odoo odoo \ -d YOUR_DB_NAME \ -u wt_enterprise_salon \ --stop-after-init \ --no-http # Restart live server docker-compose start odoo
2. First-Time Setup (Step-by-Step)
Follow these steps in order after installation. Each step takes 1–5 minutes.
-
Open Salon Enterprise Settings
Go to Settings → Salon Enterprise. You will see all feature toggles. By default most features are disabled — enable only what you need. -
Enable Core Features
Recommended to enable from the start:- Loyalty Program
- Customer Reviews
- Waitlist Management
- Service Packages
-
Configure the Loyalty Program
Go to Salon → Loyalty → Program Setup. Set points per currency unit (e.g. 10 pts per $1), and configure tier thresholds for Bronze / Silver / Gold / Platinum. -
Create at Least One Service Package
Go to Salon → Packages → Package Templates. Click New. Set a name (e.g. "10-Session Bundle"), choose a service, set session count and price. -
Set Up Staff and Services
Go to Salon → Configuration → Services and Salon → Staff. Assign services to each stylist and set their commission percentage. -
Enable Email Automation (Optional)
In Settings, turn on Email Reminders and set hours before appointment. Turn on Review Request Email to send review links after appointments complete. -
Set Up WhatsApp (Optional)
Enter your Meta Business API token and Phone ID in Settings → WhatsApp section. Enable WhatsApp OTP to require phone verification during signup and booking. -
Set Up Stripe (Optional)
Enter your Stripe publishable key and secret key in Settings. Enable Deposit Required and set the deposit percentage. -
Test the Portal
Open a private browser window and visit/web/signupto create a test customer account. Then visit/salon/bookto test the booking flow end-to-end. -
Verify Cron Jobs
Go to Settings → Technical → Automation → Scheduled Actions. Search "Salon" — you should see 12 active cron jobs. If they are inactive, enable them.
3. All Features Overview
Loyalty Program
Bronze→Platinum tiers. Auto-award points on invoiced appointments. Redeem in portal.
Service Packages
Pre-paid session bundles. Track per-customer usage and expiry. Sell directly in portal.
Memberships
Monthly/yearly plans with service discounts and session allowances. Auto-expire tracking.
Gift Cards
Sell electronic gift cards with balance tracking. Redeemable at booking.
Customer Reviews
1–5 star ratings. Manager approval workflow. Display published reviews publicly.
Waitlist
Queue for fully-booked slots. Auto-notify when slot opens. Portal self-join.
WhatsApp OTP
Phone verification via WhatsApp at signup and guest booking. Prevents fake accounts.
Stripe Deposits
Collect pre-booking deposits online. Configurable percentage. Reduces no-shows.
Recurring Appointments
Book repeating series (weekly, bi-weekly, monthly). Up to 12 occurrences.
Email Automation
Reminders, review requests, birthday promos, win-back campaigns.
SMS Automation
Booking confirmation, cancellation, and reminder SMS.
Commission Automation
Auto-confirm and auto-pay stylist commissions on schedule.
Self-Service Cancellation
Customers cancel from portal within configurable cutoff window.
Referral Program
Customers earn bonus points for referring new customers.
Win-Back Campaign
Automatically email inactive customers after N days to bring them back.
Birthday Promotions
Auto-send personalised birthday discount emails to customers.
Consent Forms
Require digital consent before services. Stored per appointment.
Before/After Photos
Upload and store client before/after photos per appointment.
Product Tracking
Track which products are used per appointment for inventory accuracy.
Late Cancellation
Flag appointments cancelled within the cutoff window for potential fee charging.
Availability Calendar
Public-facing calendar showing open booking slots.
Customer Portal
Appointment history with filter tabs, loyalty points, packages, memberships, gift cards — all in one place.
Smart Appointment Actions
Portal detail page shows context-aware buttons: Reschedule, Cancel, Leave Review, Book Same Again, Download Invoice.
KPI Dashboard
Revenue, bookings, top services, stylist performance — all visualised.
Role-Based Access
Manager, receptionist, stylist — each with appropriate permissions.
12 Cron Jobs
All automations run automatically in the background. Zero manual intervention.
4. Settings Reference
All settings live at Settings → Salon Enterprise. They are stored as ir.config_parameter records. Changes take effect immediately — no restart required.
Email Automation
| Setting | Key | Default | Description |
|---|---|---|---|
| Email Reminders | salon_enterprise.email_reminder_enabled | False | Send reminder emails before appointments |
| Reminder Hours | salon_enterprise.email_reminder_hours | 24 | Hours before appointment to send reminder |
| Review Request | salon_enterprise.review_request_enabled | False | Email review link after appointment completes |
| Review Request Hours | salon_enterprise.review_request_hours | 4 | Hours after completion to send review request |
| Birthday Email | salon_enterprise.birthday_email_enabled | False | Auto-send birthday discount emails |
SMS Automation
| Setting | Key | Default | Description |
|---|---|---|---|
| SMS Enabled | salon_enterprise.sms_enabled | False | Master SMS switch (requires Odoo SMS module) |
| SMS Reminder Hours | salon_enterprise.sms_reminder_hours | 24 | Hours before appointment to send SMS reminder |
| Booking Confirmation SMS | salon_enterprise.sms_booking_confirmation | False | Send SMS on new booking |
| Cancellation SMS | salon_enterprise.sms_cancellation | False | Send SMS when appointment is cancelled |
| Setting | Key | Default | Description |
|---|---|---|---|
| WhatsApp Enabled | salon_enterprise.whatsapp_enabled | False | Enable WhatsApp message sending |
| API Token | salon_enterprise.whatsapp_token | — | Meta Business API Bearer token |
| Phone ID | salon_enterprise.whatsapp_phone_id | — | WhatsApp Business Phone Number ID |
| Booking Template | salon_enterprise.whatsapp_booking_template | booking_confirmation | Template name for booking confirmations |
| Reminder Template | salon_enterprise.whatsapp_reminder_template | appointment_reminder | Template name for reminders |
| OTP Enabled | salon_enterprise.whatsapp_otp_enabled | False | Require WhatsApp OTP at signup and guest booking |
| OTP Template | salon_enterprise.whatsapp_otp_template | phone_otp | Template name for OTP messages |
Commission Automation
| Setting | Key | Default | Description |
|---|---|---|---|
| Auto-Confirm | salon_enterprise.auto_confirm_commission | False | Auto-confirm draft commissions |
| Confirm After Hours | salon_enterprise.auto_confirm_hours | 48 | Hours after appointment to auto-confirm |
| Auto-Pay | salon_enterprise.auto_pay_commission | False | Auto-pay confirmed commissions |
| Pay After Days | salon_enterprise.auto_pay_days | 30 | Days after confirmation to auto-pay |
Feature Flags
| Setting | Key | Default |
|---|---|---|
| Gift Cards | salon_enterprise.gift_cards_enabled | True |
| Loyalty Program | salon_enterprise.loyalty_enabled | True |
| Customer Reviews | salon_enterprise.reviews_enabled | True |
| Waitlist | salon_enterprise.waitlist_enabled | True |
| Service Packages | salon_enterprise.packages_enabled | True |
| Memberships | salon_enterprise.memberships_enabled | False |
| Deposit Required | salon_enterprise.deposit_required | False |
| Deposit Percent | salon_enterprise.deposit_percent | 20.0 |
| Consent Forms | salon_enterprise.consent_enabled | False |
| Before/After Photos | salon_enterprise.photos_enabled | False |
| Product Tracking | salon_enterprise.product_tracking | False |
| Availability Calendar | salon_enterprise.availability_calendar_enabled | False |
| Self-Service Cancellation | salon_enterprise.self_cancel_enabled | False |
| Self-Cancel Cutoff Hours | salon_enterprise.self_cancel_cutoff_hours | 24 |
| Recurring Appointments | salon_enterprise.recurring_enabled | False |
| Recurring Max Count | salon_enterprise.recurring_max_count | 12 |
| Referral Program | salon_enterprise.referral_enabled | False |
| Referral Bonus Points | salon_enterprise.referral_bonus_points | 100 |
| Win-Back Campaign | salon_enterprise.win_back_enabled | False |
| Win-Back Days | salon_enterprise.win_back_days | 60 |
| Late Cancel Hours | salon_enterprise.late_cancel_hours | 24 |
| Max Daily Capacity | salon.max_daily_capacity | 10 |
| Stripe Publishable Key | salon_enterprise.stripe_publishable_key | — |
| Stripe Secret Key | salon_enterprise.stripe_secret_key | — |
5. Loyalty Program
How It Works
- When an appointment is invoiced (state =
invoiced), points are computed automatically. - Formula:
invoice_amount × points_per_currency - Points accumulate across all appointments for a customer.
- Tier upgrades happen automatically when total points cross a threshold.
Tier Configuration
Go to Salon → Loyalty → Program Setup and set thresholds:
| Tier | Default Threshold | Benefits |
|---|---|---|
| Bronze | 0 pts | Base tier |
| Silver | 500 pts | Configure discount in settings |
| Gold | 1,500 pts | Configure discount in settings |
| Platinum | 5,000 pts | Configure discount in settings |
Customer View
Customers see their points and tier on the portal home page. On each invoiced appointment's
detail page (/my/salon-appointments/<id>), a highlighted alert shows exactly how many
loyalty points that specific visit earned.
Managing Points
Go to Salon → Loyalty → Customer Points to view, add, or deduct points manually.
6. Service Packages
Creating a Package Template
- Go to Salon → Packages → Package Templates and click New.
- Set a name (e.g. "10 Haircut Bundle"), select a service, enter session count and price.
- Set an expiry period (e.g. 12 months from purchase date).
- Save and the package is available for sale immediately.
Selling a Package
- From the Salon → Packages → Customer Packages menu, click New.
- Select the customer and the package template.
- Set the purchase date and confirm.
Using Package Sessions
When creating an appointment for a customer who has an active package for that service, the receptionist can apply the package — one session is deducted from the remaining count.
Customer Portal View
Customers see all their active packages, sessions used, sessions remaining, and expiry date under My Account → My Packages.
7. Memberships
Setup
- Go to Salon → Memberships → Membership Plans and create plans (e.g. "Gold Monthly — $99/mo").
- Set services included, session allowances per period, and discount percentages.
- Go to Salon → Memberships → Customer Memberships to assign a plan to a customer.
Auto-Expire
The Check Expired Memberships cron runs daily. When a membership's end date passes,
its state automatically changes to expired. The customer sees this in their portal.
Portal Display
Active membership card appears on the customer portal home page showing plan name and expiry date.
8. Gift Cards
Creating a Gift Card
- Go to Salon → Gift Cards and click New.
- Select the recipient customer, enter the initial balance and an optional message.
- Set an expiry date (optional) and confirm.
- A unique code is generated automatically.
Redeeming Gift Cards
At checkout (appointment invoicing), the receptionist enters the gift card code. The balance is deducted from the invoice total. Partial redemptions are supported — remaining balance stays on the card.
Portal Display
Customers see their total gift card balance on the portal home page.
9. Customer Reviews
Review Flow
- Customer completes an appointment (state →
done). - If Review Request Email is enabled, an email is sent automatically after N hours.
- Customer clicks the link, rates 1–5 stars, and leaves an optional comment.
- Review appears in Salon → Reviews with state
pending. - Manager reviews it and clicks Publish or Reject.
- Published reviews display on the customer portal and optionally on the booking page.
Managing Reviews
Go to Salon → Reviews. Use the Kanban view to easily drag reviews between states. Filter by service or stylist to analyse performance.
10. Waitlist
How It Works
- When a booking slot is full, customers can join the waitlist from the portal or the front desk.
- When an appointment is cancelled, the system finds waitlist entries for that slot.
- A notification (email or WhatsApp) is sent to the next customer in queue.
- The customer has a limited time window to confirm their slot (configurable).
- Expired waitlist entries are cleaned up daily by the cron job.
Managing the Waitlist
Go to Salon → Waitlist. You can see all active waiting entries with customer name, desired service, preferred date, and their position in queue. Click Notify to manually send notification to a specific customer.
11. WhatsApp Integration & OTP
Setup: Meta Business API
- Go to business.facebook.com and create a Business account.
- Add a WhatsApp Business app and get your Phone Number ID.
- Generate a permanent System User Token with
whatsapp_business_messagingpermission. - Create message templates in the Meta Business Manager:
booking_confirmation— sent on new bookingappointment_reminder— sent N hours before appointmentphone_otp— sent for OTP verification (must have variable{{1}}for the OTP code)
- Wait for template approval from Meta (usually 1–24 hours).
Configuration in Odoo
- Go to Settings → Salon Enterprise → WhatsApp.
- Enable WhatsApp Enabled.
- Enter your API Token and Phone Number ID.
- Set the template names (must match exactly what you created in Meta).
- Enable WhatsApp OTP to require phone verification at signup and guest booking.
OTP Flow — How It Works
- Phone field appears on the signup form
- Customer clicks "Send OTP"
- WhatsApp message with 6-digit code is sent
- Customer enters code and clicks "Verify"
- Form submit is blocked until verified
- After signup, phone is saved to the partner record
- Phone field shows OTP button for guests
- Guest clicks "Send OTP"
- OTP sent to their WhatsApp number
- Guest enters code and verifies
- Booking is blocked server-side if OTP not verified
- Confirmation page shows "Create My Account" button
Duplicate Contact Prevention
When a guest books, a res.partner is created. If that guest later signs up using the same email,
the system detects the existing partner and links the new user account to it — no duplicate contacts.
This works via two mechanisms:
- Token URL: The confirmation page offers a "Create My Account" link with a pre-generated
signup_tokenthat links directly to the guest's existing partner record. - Email detection: At
/web/signup, if the email matches an existing partner without a user account, the system injects the token automatically — even without the link.
OTP Record Model
OTPs are stored in salon.phone.otp. Each record has: phone, code, expiry (10 minutes),
verified flag, and attempts counter (max 5). Expired records are cleaned up every hour by cron.
12. Stripe Deposits
Setup
- Create a Stripe account at stripe.com.
- Go to Developers → API Keys and copy your Publishable key and Secret key.
- In Odoo, go to Settings → Salon Enterprise and paste both keys.
- Enable Deposit Required and set Deposit Percent (default 20%).
Booking Flow with Deposit
- When a customer submits a booking, a Stripe checkout session is created for the deposit amount.
- Customer is redirected to Stripe's hosted payment page.
- On successful payment, customer is returned to the confirmation page.
- On failure or cancellation, they can retry or contact the salon.
- The deposit is recorded on the appointment and deducted at final invoice.
4242 4242 4242 4242
with any future expiry and any CVC for test payments.
13. Recurring Appointments
Creating a Recurring Series
- Create a new appointment as usual.
- Check the Recurring checkbox.
- Choose frequency: Weekly, Bi-Weekly, or Monthly.
- Set the number of occurrences (max configured in settings, default 12).
- Confirm — all appointments in the series are created at once.
Managing a Series
- Each appointment in the series is independent — you can cancel one without affecting others.
- Rescheduling: Cancel the specific occurrence and create a replacement.
- The series is linked by a
recurring_series_idfield for reporting.
14. Commission Automation
Commission Lifecycle
| State | Trigger | Description |
|---|---|---|
| Draft | Appointment invoiced | Commission line created, awaiting review |
| Confirmed | Auto after N hours OR manual | Manager has approved the commission |
| Paid | Auto after M days OR manual | Payment processed to stylist |
Manual Override
Managers can always confirm or pay commissions manually from Salon → Commissions without waiting for the cron schedule.
Audit Trail
Every state change is logged in the appointment's chatter with user, timestamp, and amount.
15. Customer Portal
Customers access their portal at /my after logging in.
The salon portal home page shows cards for each enabled feature:
| Card | Shows when | Content |
|---|---|---|
| My Appointments | Always visible | Appointment count + link to /my/salon-appointments |
| Loyalty Points | Loyalty enabled | Total points + current tier |
| Active Membership | Memberships enabled + active membership exists | Plan name + expiry |
| Gift Card Balance | Gift cards enabled + balance > 0 | Total balance across all active cards |
| My Packages | Packages enabled | Link to package list |
| Book Appointment | Always | Direct link to /salon/book |
| Waitlist | Waitlist enabled | Link to waitlist management |
| Reviews | Reviews enabled | Link to leave/view reviews |
Appointment List — Filter Tabs
The appointments page at /my/salon-appointments shows four tabs with live counts:
- Sort by Newest, Reference, or Total amount.
- Colour-coded status badges on each row (green = confirmed, grey = done, red = cancelled).
- Paged — 10 appointments per page with full next/prev navigation.
- Click any row to open the appointment detail page.
Appointment Detail — Smart Action Buttons
Every appointment detail page shows a smart sidebar with context-aware buttons:
| Button | Shown when |
|---|---|
| Reschedule | Appointment is not cancelled and not completed |
| Cancel Appointment | Self-cancel enabled, not already cancelled, and more than N hours until start |
| Leave a Review | Reviews enabled, appointment is done, no review yet submitted |
| Book Same Again | Appointment has a service (creates a pre-filled new booking) |
| Download Invoice | Appointment has been invoiced |
| All My Appointments | Always — back link |
If Loyalty Program is enabled and the appointment earned points, a highlighted alert banner appears above the appointment details showing exactly how many points were earned for that visit.
Portal Routes
| URL | Auth | Description |
|---|---|---|
/my | user | Portal home with all salon cards |
/my/salon-appointments | user | Appointments list with filter tabs (All/Upcoming/Done/Cancelled) |
/my/salon-appointments/page/<n> | user | Paginated appointments list |
/my/salon-appointments/<id> | public* | Appointment detail with smart action sidebar |
/salon/loyalty | user | Loyalty points history and tier |
/salon/packages | user | Customer packages list |
/salon/my-history | user | Full history dashboard |
/salon/book | public | Public booking form (logged in or guest) |
/salon/reschedule/<id> | user | Reschedule form for a specific appointment |
/salon/review/<id> | user | Leave a star rating and comment |
/salon/cancel/<id> | user | Self-service cancellation with cutoff guard |
/web/signup | public | Account creation (standard Odoo + OTP injection) |
* public auth with access_token fallback — uses _document_check_access() for security.
16. Online Booking Flow
Logged-In Customer
- Customer visits
/salon/book. - Their name, email, and phone are pre-filled from their account.
- They select service, stylist (optional), and preferred date/time.
- If package sessions are available for the service, they can opt to use one.
- If deposit is required, they are redirected to Stripe.
- Confirmation page shows appointment details and booking reference.
Guest Booking
- Guest visits
/salon/bookwithout logging in. - They fill in name, email, and phone.
- If WhatsApp OTP is enabled, they must verify their phone before submitting.
- A new
res.partneris created or linked if email matches existing partner. - Confirmation page shows a "Create My Account" banner with a link that links the account to their existing booking history.
Cancellation Flow (Self-Service)
- Enable at: Settings → Self-Service Cancellation.
- Set Cutoff Hours — cancellations within this window are flagged as late.
- Customer goes to appointment detail page and clicks Cancel.
- If cancellation is within the cutoff window, it is marked as a late cancellation.
- System checks waitlist and notifies the next customer automatically.
17. Email & SMS Automation
Email Automations
| Automation | Trigger | Setting Required |
|---|---|---|
| Appointment Reminder | N hours before appointment | email_reminder_enabled = True |
| Review Request | N hours after appointment done | review_request_enabled = True |
| Birthday Promo | Customer's birthday date | birthday_email_enabled = True |
| Win-Back Campaign | No appointment in last N days | win_back_enabled = True |
SMS Automations
| Automation | Trigger | Setting Required |
|---|---|---|
| Booking Confirmation | New appointment created | sms_booking_confirmation = True |
| Appointment Reminder | N hours before appointment | sms_enabled = True |
| Cancellation Notice | Appointment cancelled | sms_cancellation = True |
WhatsApp Automations
| Automation | Trigger | Setting Required |
|---|---|---|
| Booking Confirmation | New appointment created | whatsapp_enabled = True |
| Appointment Reminder | N hours before appointment | whatsapp_enabled = True |
| OTP Verification | Signup / guest booking | whatsapp_otp_enabled = True |
18. Scheduled Tasks (Crons)
All crons are visible at Settings → Technical → Automation → Scheduled Actions. Search "Salon".
| Cron Name | Interval | What It Does |
|---|---|---|
| Send Appointment Email Reminders | Every 1 hour | Finds upcoming appointments within the reminder window and sends reminder emails |
| Send Appointment SMS Reminders | Every 1 hour | Same but via SMS |
| Send WhatsApp Appointment Reminders | Every 1 hour | Same but via WhatsApp API |
| Send Post-Appointment Review Requests | Every 1 hour | Finds recently completed appointments and emails review request links |
| Cleanup Expired OTPs | Every 1 hour | Deletes OTP records older than 10 minutes |
| Auto-Confirm Draft Commissions | Every 1 day | Confirms commission lines that are N hours old |
| Auto-Pay Confirmed Commissions | Every 1 day | Marks commissions as paid after M days |
| Send Birthday Promotion Emails | Every 1 day | Finds customers whose birthday is today and sends promo emails |
| Win-Back Inactive Customers | Every 1 week | Emails customers with no appointment in the last N days |
| Expire Old Waitlist Entries | Every 1 day | Marks old waitlist entries as expired |
| Mark Expired Memberships | Every 1 day | Sets membership state to expired when end date passes |
19. Staff & Roles
Odoo User Groups
| Group | Technical Name | Capabilities |
|---|---|---|
| Salon Manager | wt_salon_management.group_salon_manager | Full access: settings, commissions, reports, staff management, all records |
| Salon Receptionist | wt_salon_management.group_salon_receptionist | Create/edit appointments, view customer records, basic booking operations |
| Salon Stylist | wt_salon_management.group_salon_stylist | View own appointments, update appointment status, view own commissions |
Assigning Roles
- Go to Settings → Users & Companies → Users.
- Open the user's record.
- In the Salon section, choose the appropriate role.
- Save. The user's menu and access rights update immediately.
Stylist Commissions
- Each service has a configurable commission percentage per stylist.
- When an appointment is invoiced, commission lines are created for the performing stylist.
- Stylists can view their own commissions from their portal or backend access.
20. Daily Operations
Morning Routine
- Open Salon → Appointments → Today to see all appointments for the day.
- Check for any waitlist notifications that need manual follow-up.
- Review overnight bookings and confirm any pending ones.
- Check the review queue (Salon → Reviews → Pending) and approve/reject.
During the Day
- When a customer arrives: Open their appointment, click Start.
- When service is complete: Click Done. This triggers loyalty points and review request.
- To invoice: Click Invoice. This triggers commission creation.
- If a cancellation occurs: Cancel the appointment — system automatically notifies waitlist.
End of Day
- Review Salon → Commissions → Draft — confirm any that need manual approval.
- Check Salon → Reports → Daily Summary for revenue and appointment stats.
- Review any failed email/SMS sends in Settings → Technical → Email → Emails.
21. Troubleshooting
| Problem | Likely Cause | Fix |
|---|---|---|
| WhatsApp OTP not sending | Wrong token or template name | Verify token in Meta Business Manager. Check template is approved and name matches exactly in Settings. |
| Portal home shows no loyalty card | Loyalty feature disabled or customer has no points | Enable loyalty in Settings. Check customer has at least one invoiced appointment. |
| Crons not running | Crons marked inactive | Go to Settings → Technical → Scheduled Actions, search "Salon", enable all that are inactive. |
| Duplicate contacts when guest signs up | Email doesn't match any existing partner | Normal behaviour for brand new emails. The auto-link only works when the exact email was used at guest booking. |
| Stripe payment page not loading | Invalid API keys | Verify keys in Settings. Ensure publishable key starts with pk_ and secret key starts with sk_. |
| Email reminders not sending | Outgoing mail server not configured | Go to Settings → Technical → Outgoing Mail Servers and configure SMTP. Also verify email_reminder_enabled is True. |
| Gift card balance not showing on portal | Gift card state is not "active" | Go to Salon → Gift Cards, open the card, confirm it is in "active" state with balance > 0. |
| Module won't install — dependency error | wt_salon_management not installed first |
Install wt_salon_management first, then install wt_enterprise_salon. |
| New Python code not reflecting | Odoo server cache | Restart the Odoo container/server completely. Python changes require restart; XML changes need module upgrade. |
| XML changes not applied | Module not upgraded after XML edit | Run: odoo -d DB -u wt_enterprise_salon --stop-after-init then restart server. |
| OTP expired too fast | Default is 10 minutes | OTP validity is hardcoded to 10 minutes in salon.phone.otp.create_otp(). Edit if needed. |
| Commission not created after invoicing | Stylist not assigned to appointment | Open the appointment, ensure a stylist is assigned. Commission is only created when a stylist is present. |
"My Appointments" card not visible on /my/home |
Odoo 19 hides portal cards by default until JS counter fetch completes | Enterprise module injects a direct always-visible card. If missing, ensure wt_enterprise_salon is installed and fully upgraded. Verify no JS errors in browser console blocking the page. |
"You are not allowed to access 'Salon Appointment Stage'" when visiting /my/salon-appointments |
Missing portal read access for related models | Upgrade the enterprise module: odoo -d DB -u wt_enterprise_salon --stop-after-init. The upgrade applies the 6 portal/public read rules in security/ir.model.access.csv. |
| Loyalty points not shown on appointment detail page | Loyalty disabled or appointment not yet invoiced | Enable Loyalty in Settings. Points are only awarded when the appointment is invoiced. Check that the appointment's state is invoiced and the customer has a loyalty card record. |
| Smart action buttons (Reschedule, Cancel, Review) missing on appointment detail | Viewing via old /salon/appointments URL instead of new route |
Use /my/salon-appointments/<id>. The smart sidebar only exists on the enterprise controller's detail page. Ensure module is upgraded after last change. |
Module fails to load — ImportError: cannot import AuthSignupHome |
auth_signup not listed in module depends |
Verify __manifest__.py includes 'auth_signup' in the depends list. Restart Odoo after fixing. |
22. Upgrade Commands
After Editing Python Files
# Restart container only — Python loads fresh on startup docker-compose restart odoo
After Editing XML/CSV/Data Files
# Stop live server docker-compose stop odoo # Upgrade module (applies new XML, migrations, data) docker-compose run --rm odoo odoo \ -d YOUR_DB_NAME \ -u wt_enterprise_salon \ --stop-after-init \ --no-http # Start live server again docker-compose start odoo
After Editing Both Python and XML
# Same as XML upgrade above — the upgrade step restarts Python too docker-compose stop odoo docker-compose run --rm odoo odoo \ -d YOUR_DB_NAME \ -u wt_enterprise_salon \ --stop-after-init \ --no-http docker-compose start odoo
Upgrade Both Modules at Once
docker-compose run --rm odoo odoo \ -d YOUR_DB_NAME \ -u wt_salon_management,wt_enterprise_salon \ --stop-after-init \ --no-http
docker-compose logs odoo --tail=100 after any upgrade.
Look for ERROR or WARNING lines. Common issues: missing XML id reference, field does not exist,
model not found.
23. Support & Contact
WhatsApp / Phone
+92 315 411 4748
Website
way4tech.com
Odoo Apps
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module