Welcome to CM
CM is a simple self-hosted Channel Manager for small accommodation owners. It helps you manage availability, prices, inquiries, reservations and calendar integrations from one place.
1. Calendar
Your main working screen for availability, prices, blocks and visual overview.
2. Reservations
Review confirmed, cancelled, external and soft-hold reservations.
3. Inquiries
Handle guest requests before they become confirmed reservations.
4. Integrations
Connect external calendars and prepare the system for real-world sync.
5. E-mail / SMTP
Set up msmtp so CM can send guest and admin e-mails through Gmail or another SMTP account.
Calendar
The admin calendar is the central view of your unit availability. Start here when you want to check dates, select a range, set prices, create blocks or add an admin reservation.
Basic workflow
- Select the unit at the top.
- Use previous / next / today to move through months.
- Drag or click dates to select a range.
- Use the action buttons to block, unblock, set price, set offer or create an admin reservation.
Layers
Calendar layers let you decide what you want to see: occupancy, local blocks, prices, offers and pending inquiries. This makes the calendar useful both for quick overview and for detailed administration.
Reservations
The Reservations page shows existing reservations across units, years, statuses and sources. Use it when you want to inspect confirmed bookings, cancelled reservations, external reservations or soft-holds.
What to check
- Unit and date range of the reservation.
- Guest name, email and phone if available.
- Status: confirmed, cancelled, soft-hold, external or ICS.
- Available actions such as cancel or re-send accept link.
External reservations
External reservations are useful for direct bookings or reservations that were created outside the public inquiry flow.
Inquiries
Inquiries are guest requests that have not yet become final reservations. This page is where you review requests, accept them, reject them, or mark them for visual tracking.
Inquiry flow
- A guest sends an inquiry from the public offer flow.
- The inquiry appears in the admin list.
- You review guest data, dates, nights and price information.
- If you accept it, CM creates a soft-hold and sends the guest a confirmation link.
- When the guest confirms, the reservation becomes a hard reservation.
Calendar connection
Pending and marked inquiries can be reflected on the admin calendar. This helps you visually track important requests before they become final bookings.
Integrations
Integrations connect CM with external platforms and calendars. The main idea is simple: CM can export its availability and import external availability.
Units and Base URL
Integrations are configured per unit. The Base URL must point to your public CM installation, because it is used to generate external links such as ICS URLs.
ICS Export
ICS export links allow external systems to read availability from CM. You can copy these links into platforms that support calendar import.
Channels / ICS Import
Channels let CM read external calendars. Imported external bookings are merged into the internal availability layer.
Autopilot
Autopilot is a Plus feature. It can automatically confirm safe inquiries when rules and availability checks pass. In CM Free it can be shown as a locked feature, so users understand the upgrade path.
E-mail / SMTP / Gmail App Password
CM Free / Plus sends e-mails through the system sendmail interface. On Ubuntu/Debian installations this is usually provided by msmtp.
The basic chain is:
CM Free / Plus → PHP sendmail → msmtp → Gmail/SMTP server → guest/admin
1. Check that msmtp is installed
which msmtp which sendmail php -i | grep -i sendmail_path ls -l /usr/sbin/sendmail
A typical working result looks like this:
/usr/bin/msmtp /usr/sbin/sendmail sendmail_path => /usr/sbin/sendmail -t -i /usr/sbin/sendmail -> ../bin/msmtp
2. Gmail: create an App Password
For Gmail, do not use your normal Gmail password. Use a Gmail App Password.
Fast link: https://myaccount.google.com/apppasswords
- Log in to the Gmail account that will send e-mails.
- Create a new App Password.
- You can name it something like CM Free msmtp.
- Google shows a 16-character password.
- Copy it into /etc/msmtprc without spaces.
3. Create system-wide msmtp configuration
sudo nano /etc/msmtprc
Minimal Gmail example:
# CM Free / Plus system-wide msmtp configuration # Used by Apache/PHP through /usr/sbin/sendmail -> msmtp defaults auth on tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt account gmail host smtp.gmail.com port 587 from nekdo@gmail.com user nekdo@gmail.com password TVOJE_16_MESTNO_APP_PASSWORD_BREZ_PRESLEDKOV account default : gmail
Replace nekdo@gmail.com with the Gmail account that sends mail. Replace the password placeholder with your Gmail App Password.
4. Set safe permissions
The file contains a password. It should be readable by Apache/PHP, but not public.
sudo chown root:www-data /etc/msmtprc sudo chmod 640 /etc/msmtprc
5. Test as Apache/PHP user
This is the most important test, because Apache/PHP usually runs as www-data.
printf "Subject: CM Free mail test\n\nTest from CM Free via msmtp.\n" | sudo -u www-data sendmail nekdo@gmail.com
If there is no error and the e-mail arrives, the system mail setup is working.
6. Configure e-mail in CM
After the system test succeeds, configure e-mail in CM settings.
Email enabled: true From name: CM Free Demo From email: nekdo@gmail.com Admin email: your-admin-address@example.com
The From email should match the sending account from /etc/msmtprc. The Admin email is where you want to receive inquiry notifications.
7. Optional logging
For a first setup, it is usually better to keep msmtp logging disabled. E-mail can work perfectly even if a logfile causes permission problems.
Do not add this line unless you know how to set log permissions:
logfile /var/log/msmtp.log
If you see this together with a successful SMTP status:
smtpstatus=250 exitcode=EX_OK cannot log ... Permission denied
then the e-mail was sent successfully. The problem is only logging. The simplest solution is to remove or comment out the logfile line.
8. Common errors
Gmail rejects the password
535-5.7.8 Username and Password not accepted
Common causes:
- You used the normal Gmail password instead of an App Password.
- The App Password belongs to another Google account.
- The password was copied with spaces.
- The user or from value is wrong.
- 2-Step Verification is not enabled.
No default account
If sendmail does not know which account to use, make sure this line exists at the end of /etc/msmtprc:
account default : gmail
Short version
1. Create Gmail App Password: https://myaccount.google.com/apppasswords 2. Create /etc/msmtprc with account gmail and account default : gmail 3. Set permissions: sudo chown root:www-data /etc/msmtprc sudo chmod 640 /etc/msmtprc 4. Test: printf "Subject: CM Free mail test\n\nTest.\n" | sudo -u www-data sendmail nekdo@gmail.com
Recommended first setup
- Open Calendar and learn the unit selector, date selection and layers.
- Add or check prices for your first unit.
- Open Reservations and understand where confirmed bookings appear.
- Open Inquiries and review how guest requests become reservations.
- Open Integrations and set your Base URL.
- Set up E-mail / SMTP if you want CM to send guest and admin messages.
- Copy ICS export links only after the system URL is correct.
- Add another unit only after the first unit is clear and working.