Skip to main content

Settings

Base path: /api/settings

GET /settings

Get all settings.

Auth: Admin

Response: Single settings object (id=1) with all configuration columns. Sensitive fields (smtp_pass, sumup_api_key, mollie_api_key, stripe_secret_key) are masked as "********" in the response.


PUT /settings

Update settings. Only fields present in the request body are updated.

Auth: Admin

Request body: Object with any combination of settable fields:

{
"salon_name": "Lumi Salon",
"salon_email": "info@salon.nl",
"salon_phone": "+31612345678",
"salon_address": "Kerkstraat 1",
"salon_postcode": "1234AB",
"salon_city": "Amsterdam",
"btw_number": "NL123456789B01",
"social_facebook": "https://facebook.com/salon",
"social_instagram": "https://instagram.com/salon",
"currency": "EUR",
"timezone": "Europe/Amsterdam",
"language": "nl",
"first_day_of_week": 1,
"time_format": "24h",
"new_client_extra_min": 15,
"calendar_slot_min": 15,
"calendar_buffer_min": 0,
"calendar_color_mode": "category",
"hide_unscheduled_staff": 0,
"dark_mode": "system",
"booking_mode": "direct",
"booking_clients": "all",
"booking_show_prices": 1,
"booking_show_duration": 1,
"booking_allow_staff_choice": 1,
"booking_min_lead_hours": 12,
"booking_max_future_days": 60
}
note

When purchase_orders_enabled is set to 0, internal_consumption_enabled is also automatically set to 0. Setting internal_consumption_enabled to 1 while purchase_orders_enabled is 0 returns a 400 error.


Upload a salon logo image.

Auth: Admin

Content-Type: multipart/form-data

FieldTypeRequiredDescription
logofileYesImage file (JPEG, PNG, GIF, SVG, WebP; max 5MB)

Response: { "url": "/uploads/logo-1234567890.png" }


POST /settings/test-email

Send a test email to verify SMTP configuration.

Auth: Admin

Request body: { "to": "test@example.com" }

Response: { "ok": true } or 400 with error message if SMTP fails.


Locations

Locations are managed through a separate route at /api/locations (not under /api/settings).

GET /locations

Get all locations. Supports ?active=true to filter active ones only.

Auth: Logged in

GET /locations/:id

Get a single location.

Auth: Logged in

POST /locations

Create a new location.

Auth: Admin

FieldTypeRequired
namestringYes
addressstringNo
phonestringNo
emailstringNo
is_defaultbooleanNo

PUT /locations/:id

Update a location.

Auth: Admin

DELETE /locations/:id

Delete a location.

Auth: Admin


Holidays

GET /settings/holidays

Get holidays ordered by date.

POST /settings/holidays

Add a holiday.

FieldTypeRequired
namestringYes
datestring (YYYY-MM-DD)Yes

DELETE /settings/holidays/:id

Delete a holiday.


Opening Hours

Opening hours are configured as part of the initial setup (POST /api/auth/setup) and are stored in the opening_hours table. There is no separate REST endpoint to update opening hours after setup; changes are applied by updating the database directly or via a future admin settings screen.


VAT Rates

GET /settings/vat-rates

Get all VAT rates.

POST /settings/vat-rates

Create a new VAT rate.

FieldTypeRequiredDefault
namestringYes
percentagenumberYes
is_default0/1No0
is_disabled0/1No0

When is_default: 1 is set, all other rates have is_default cleared.

PUT /settings/vat-rates/:id

Update a VAT rate.

DELETE /settings/vat-rates/:id

Delete a VAT rate.


Feature Toggles

Optional features are controlled via columns in the settings table. All are stored as integers (0/1) or numbers.

General Toggles

SettingTypeDefaultDescription
swipe_actions_enabledboolean1Swipe gestures (mobile)
haptic_feedback_enabledboolean1Haptic feedback (mobile)
longpress_contact_enabledboolean1Long-press to call/message a client (mobile)
offline_mode_enabledboolean1Offline caching for the mobile app
staff_personal_agenda_enabledboolean1Staff members see only their own agenda

Inventory & Purchasing

SettingTypeDefaultDescription
purchase_orders_enabledboolean1Purchase orders and suppliers tabs. When false, quantity_on_hand becomes directly editable on product forms
internal_consumption_enabledboolean1Internal consumption tab. Requires purchase_orders_enabled = true; enabling internal consumption while purchase orders are disabled returns a 400 error

Dashboard & Analytics

SettingTypeDefaultDescription
daily_revenue_goal_enabledboolean0Show daily revenue goal on dashboard
daily_revenue_goalnumber0Target daily revenue amount
revenue_forecast_enabledboolean0Revenue forecast widget
visit_frequency_alerts_enabledboolean0Alert when clients haven't visited in a while
visit_frequency_daysinteger42Days threshold for visit frequency alerts

CRM & Marketing

SettingTypeDefaultDescription
followup_sequences_enabledboolean0Automated follow-up email sequences after bookings
product_recommendations_enabledboolean0Product recommendations for clients
giftcard_qr_enabledboolean0QR codes on gift card emails
seasonal_promotions_enabledboolean0Seasonal promotions automation
bulk_campaigns_enabledboolean0Bulk email campaigns
waitlist_position_enabledboolean0Show waitlist position to clients

Notifications

SettingTypeDefaultDescription
notify_salon_waitlist_joinboolean1Notify salon when someone joins the waitlist
notify_salon_slot_availableboolean1Notify salon when a slot becomes available
noshow_email_enabledboolean1Send email when a no-show fee is charged
low_stock_email_enabledboolean1Send email on low stock alert
booking_request_notify_emailboolean1Send email to admin when a provisional booking request arrives
booking_request_notify_pushboolean1Send push notification to admin when a provisional booking request arrives

No-Show Fees

SettingTypeDefaultDescription
noshow_enabledboolean0Enable automatic no-show fee charging via Stripe
noshow_fee_typestringpercentagepercentage or fixed
noshow_fee_valuenumber50Percentage (0-100) or fixed amount
noshow_min_amountnumber0Minimum no-show fee (for percentage type)

Payment Integrations

SettingTypeDescription
sumup_api_keystringSumUp API key (masked in GET response)
sumup_merchant_codestringSumUp merchant code
sumup_reader_idstringSumUp card reader ID
mollie_api_keystringMollie API key (masked in GET response)
mollie_terminal_idstringMollie terminal ID
stripe_secret_keystringStripe secret key (masked in GET response)
stripe_webhook_secretstringStripe webhook signing secret

Loyalty Settings

Loyalty programme configuration is managed via a separate route at /api/loyalty. The loyalty_enabled flag is stored in the loyalty_settings table, not in the main settings row.

GET /loyalty/settings

Get loyalty settings including loyalty_enabled, points per euro, and reward thresholds.

PUT /loyalty/settings

Update loyalty settings.

Auth: Admin