Service Form
What this screen is for
The form for creating a new service or editing an existing one. The add action on the service list, or tapping an existing service, opens here; its name, duration, capacity, price, active state, recurring-appointment eligibility and its own approval window and reschedule rules are set here.
When you would use this
The business owner comes here when a newly decided service has concrete details to enter — its name, duration, price — or when a supply or cost change means an existing service's price, duration or rules need updating. It's also where they come to take a service out of the catalogue entirely once it's no longer offered.
Who sees it
Only the user matching the owner field on the business document can open this screen; no one else can create or edit a service.
Where it lives
The screen exists on both the mobile app and the web panel; both offer the same set of fields and write the same service document.
What you can do here
Name and description
A service's name is required; the description is optional.
Image
A cover image can be picked, or an existing one removed; a removal request stays in effect until a new image is picked.
Duration and capacity
Both are required and must be positive whole numbers; duration is in minutes, capacity is how many appointments the same slot accepts together.
Approval window
Left blank, the business's default approval window is inherited; filled in, it applies only to this service.
Reschedule rules
An allow/disallow/inherit choice, alongside a notice period, a proposal validity window and a move-count limit; all four inherit the business default when left blank.
Price type
A fixed amount, a "starting from" amount, free text, or empty; for the amount types, the currency is chosen from the business's enabled currencies.
Active state and recurring frequency
Whether the service is active is a switch; its eligibility for weekly and monthly recurring requests are two separate checkboxes.
Delete action
Visible only in edit mode; removes the service after asking for confirmation.
Double submission is blocked
On the panel, a second click or submission is ignored while a save or delete is already running; creating a service mints a fresh document id on every call, so without this guard a second trigger during an in-flight image upload could create a separate service.
On mobile, only the save action is guarded this way; the delete button can still be pressed while a save is in flight, and has no guard of its own against a repeated tap.
An edit for a mismatched id is refused
If the service id in the address bar is not in the list, the panel shows a "not found" message instead of opening a blank creation form; otherwise saving would create a new document in place of the service believed to be edited.
This scenario cannot arise on the mobile form, which opens directly with the selected service — an address-bar id mismatch is panel-specific.
Fully read-only when suspended
If the business has been suspended by an administrator, every field and the save/delete actions are disabled.
The mobile form carries no such restriction.
What the server accepts and refuses
Field validity is a form-only concern
The Firestore write rule limits itself to who may write; it never confirms the service name is filled in, or that duration and capacity are positive whole numbers. Only the app's form checks those.
A blank field means inherit, not zero
Leaving the approval window or a reschedule field blank writes null to the document, not 0; when creating an appointment, the server applies the shortest effective value (approval window) or the strictest rule (reschedule) across the services in the basket, and a service that inherits follows the business's current default.