1. Overview
This feature allows hosts to restrict the number of recurring meetings a client can book within a single session. Currently, when a client books a recurring meeting, they can choose any number of sessions without restriction. This feature introduces a minimum and maximum booking limit that the host can configure, enabling use cases such as selling fixed session packages (e.g., a 6-week guitar course or a 5-session coaching programme).
2. Problem Statement
Hosts who sell session packages — coaches, educators, instructors — need to enforce a specific number of sessions per booking. Without this control, clients may book too few or too many sessions, causing operational and billing issues. Customers have explicitly requested this capability.
Examples of affected use cases:
Life coaches selling 5-session packages
Stock market or educational class instructors with fixed 6-week programmes
Music or fitness instructors offering tiered packages (e.g., min 3, max 5 sessions)
5. Feature Location
Settings > General > Recurring Meetings
The new section "Limit number of meetings your clients can book" is added below the existing "How should clients be charged for recurring meetings?" section, separated by a divider.
6. Host-Side: Configuration UI
6.1 Section Header
Label: "Limit number of meetings your client can book"
A help icon (?) should appear next to the label.
Subtext: Set the minimum and maximum number of meetings a client can book in a single booking. Set both to the same value to enforce an exact meeting count.
6.2 Number Picker Component (New Component)
⚠️ Note: This is a new component not currently present in the Neeto design system. Coordinate with Praveen on implementation before development begins.
Behaviour rules:
The number field is editable by click — clicking selects the current value so the user can type a new one directly.
Only numerical values are accepted. Alphabetical or special characters are rejected.
Min default value: 1
Max default value: 20
6.3 Min and Max Controls
Control |
Default Value |
Hard Lower Bound |
Hard Upper Bound |
|---|---|---|---|
Min picker |
1 |
1 |
Must be ≤ Max value |
Max picker |
20 |
Must be > 1 and ≥ Min value |
20 |
6.4 Contextual Info Message (Below the Pickers)
A contextual message is shown below the Min/Max controls at all times. The text adapts based on the current values:
Scenario |
Info Message |
|---|---|
Min = 1, Max = N |
Clients can book up to N recurring meetings |
Min > 1, Max > Min (e.g. Min=3, Max=8) |
Clients must book between 3 and 8 recurring meetings |
Min = Max (e.g. both = 6) |
Clients must book exactly 6 recurring meetings |
Use "can" when min is 1 (flexible lower bound). Use "must" when a minimum > 1 is enforced.
6.5 Disabled States on the Pickers (Host Side)
Condition |
Disabled Element |
Hover Tooltip |
|---|---|---|
Max = 20 |
"+" button on Max picker |
"The maximum number of recurring meetings a client can book is 20" |
Min = 1 |
"−" button on Min picker |
"The minimum number of meetings a client can book is 1" |
Min = Max |
"+" button on Min picker |
"Minimum cannot exceed maximum" |
Min = Max |
"−" button on Max picker |
"Maximum cannot be less than minimum" |
6.6 Validation Errors on Save (Host Side)
Condition |
Error Message |
|---|---|
Max > 20 (typed manually) |
"Maximum cannot exceed 20" |
Min < 1 (typed manually, e.g. 0) |
"Minimum must be at least 1" |
Max = 1 |
"Maximum must be greater than 1" |
Min > Max or Max < Min (via direct text input conflict) |
"Maximum cannot be less than minimum" |
6.7 Save / Cancel
Save Changes and Cancel buttons are present below the entire Recurring Meetings settings card (not shown in the wireframe but confirmed to be in the final design).
7. Client-Side Booking Flow
The client-side experience varies depending on the Min and Max values configured by the host. The following scenarios cover all combinations.
Scenario A — Default State (Min = 1, Max = 20)
When the client has not yet confirmed recurring preference (No selected):
Show: "You are booking the following slot:" (singular — only one slot)
A triple-dot (…) menu should appear on the slot row for consistency with other scenarios.
Clicking "Change slot" navigates back to the previous page (slot selection), as there is only one slot.
The Yes/No question for recurring meetings is shown as normal.
When the client selects "Yes" (recurring):
"I would like to book [N] meetings." is shown (use "book", not "pre-book").
The default value shown is 5. If Max < 5, the default is Max.
The number of bookings includes the initial selected slot.
Show: "You are booking the following slots:" (plural) with all slots listed.
All slot rows show the triple-dot (…) menu, including the first one.
Clicking … on any slot shows "Change slot"; a calendar/modal opens to reschedule.
Updating a slot updates its display in the list.
Validation:
If client attempts to book more than 20 meetings (e.g. by typing): show inline error "Value should not be more than 20".
Scenario B — Min = 1, Max = 5
Upper limit is restricted:
Default number of meetings shown: 5 (Max = 5, which equals the default of 5).
The "+" button is disabled. On hover: "Host has set maximum limit to 5".
Client can reduce meetings. If they try to go below 1: show error "Minimum 1 meeting must be booked for a recurring meeting. If you want to book 1 meeting, please select No."
Validation (on Continue):
If client types a number > 5 and clicks Continue: "Host has set maximum limit to 5"
If client types a number < 1 and clicks Continue: same minimum message as above.
Scenario C — Min = 3, Max = 5
Both lower and upper limits are restricted (Min ≠ 1):
When Min > 1: do not show the Yes/No recurring question. Replace it with a blue info banner.
Show info banner: "This is a recurring meeting. To make this booking, between 3 and 5 meetings are required."
UI styling for the banner must exactly match the Figma design (blue background, matching border, same typography and spacing).
Below the banner, show: Frequency selector and "I would like to book [N] meetings."
Default value: 5 (Max = 5, which equals the default of 5).
"+" disabled at 5. Hover: "Host has set maximum limit to 5".
"−" disabled at 3. Hover: "Host has set minimum limit to 3".
Validation (on Continue):
Type > 5, click Continue: "Host has set maximum limit to 5"
Type < 3, click Continue: "Host has set minimum limit to 3"
Scenario D — Min = 5, Max = 5 (Exact)
Exactly N meetings must be booked:
Show info banner: "This is a recurring meeting. To make this booking, exactly 5 meetings are required."
Default value shown: 5.
Both "+" and "−" buttons are disabled.
Hover on "+": "Host has set maximum limit to 5"
Hover on "−": "Host has set minimum limit to 5"
"I would like to book" is still shown for transparency and clarity.
Remove Slot — Disabled States (All Scenarios)
Scenario |
Remove Slot State |
Hover Message |
|---|---|---|
Min = 1 (any scenario) |
Disabled at 1 slot remaining |
"Minimum 1 meeting is required" |
Min > 1 (e.g. Min = 3 or Min = 5) |
Disabled at min-limit slots |
"Host has set minimum limit to [N]" |
Note: The remove slot button itself is implemented in a separate issue (Kirti). This PRD covers only the disabled state behaviour when the minimum limit applies.
8. Error Messages — Complete Reference
Location |
Trigger |
Message |
|---|---|---|
Host — Max picker |
Max > 20 typed and saved |
"Maximum cannot exceed 20" |
Host — Min picker |
Min < 1 typed and saved |
"Minimum must be at least 1" |
Host — Max picker |
Max = 1 |
"Maximum must be greater than 1" |
Host — Min/Max conflict |
Min > Max on save |
"Minimum cannot be greater than maximum" |
Host — Min/Max conflict |
Max < Min on save |
"Maximum cannot be less than minimum" |
Host — Max picker "+" button |
Max = 20, hover |
"The maximum number of recurring meetings a client can book is 20" |
Host — Min picker "−" button |
Min = 1, hover |
"The minimum number of meetings a client can book is 1" |
Host — Min picker "+" button |
Min = Max, hover |
"Minimum cannot exceed maximum" |
Host — Max picker "−" button |
Max = Min, hover |
"Maximum cannot be less than minimum" |
Client — Continue (default) |
Value > 20 |
"Value should not be more than 20" |
Client — Continue (Min=1, Max=5) |
Value > 5 |
"Host has set maximum limit to 5" |
Client — Continue (Min=1, Max=5) |
Value < 1 |
"Minimum 1 meeting must be booked for a recurring meeting. If you want to book 1 meeting, please select No." |
Client — Continue (Min=3, Max=5) |
Value > 5 |
"Host has set maximum limit to 5" |
Client — Continue (Min=3, Max=5) |
Value < 3 |
"Host has set minimum limit to 3" |
Client — "+" button hover (Min=3, Max=5) |
At max value |
"Host has set maximum limit to 5" |
Client — "−" button hover (Min=3, Max=5) |
At min value |
"Host has set minimum limit to 3" |
Client — "+" button hover (Min=5, Max=5) |
At max value |
"Host has set maximum limit to 5" |
Client — "−" button hover (Min=5, Max=5) |
At min value |
"Host has set minimum limit to 5" |
Client — remove slot (Min=1) |
At 1 slot |
"Minimum 1 meeting is required" |
Client — remove slot (Min>1) |
At min slots |
"Host has set minimum limit to [N]" |
9. Edge Cases
Host sets Min = Max: Both +/− buttons disabled on client side. Info banner shows "exactly N meetings" message.
Client types a non-numeric value: Input is rejected; only numeric values accepted.
Client types 0 or a negative number: Treat as below minimum; already handled.
Host sets Min > Max via direct text input: Blocked on save with validation error. Real-time disabled states prevent this via button interactions, but direct text input can create a conflict state.
Max = 1: Explicitly disallowed. Host must set Max to at least 2 for a recurring meeting to be meaningful. Show error on save: "Maximum must be greater than 1".
Min = 1, Max = 1: This is prevented by the Max > 1 validation rule above and should never be a reachable state.
Recurring meetings toggle is OFF: The entire "Limit number of meetings" section should be hidden or disabled.
Legacy bookings: Existing recurring bookings created before this feature was introduced are not affected.
Max < 5 (default value logic): Client-side default shown = Max. E.g., Max = 3 → client sees 3 by default.
10. UI/UX Design Notes
Text source: All UI copy must be taken from the wireframe. The Figma design governs visual styling only.
Info banner (client): Must exactly match Figma — blue background, matching border colour and radius, same font and spacing.
Triple-dot menu: Shown on all slot rows including the first, for consistency.
"Pre-book" → "book": Update copy across the client booking flow to remove the term "pre-book" (separate issue, noted here for coordination).
Number picker: New component — discuss with Praveen. Must support direct text input (click to select and type), +/− buttons, and disabled states with tooltip on hover.
Dividers: Visual separators between sections in the host settings page are present in the Figma design and should be implemented.