Appointments and cases
Set up appointment types, time windows and buffers, and work through enquiries, appointments and baskets under Cases, with every field, status and message.
In plain language
This page explains appointments and cases. The assistant can take enquiries in a chat. Visitors can ask for an appointment through it. It can also hand over to a person. Everything that results is listed under Cases. There you work on each case and change its status. You set which appointments the assistant may offer on the tool for appointments.
All documentation topics
An assistant can capture enquiries in a conversation, let visitors request appointments and hand over to a human. Everything that results ends up under Cases. Which appointment types and time windows the assistant may offer is set on the Book appointment tool under Tools. This page covers both areas with every field, limit, status and message.
Where to find it
Both areas sit in the app in the Triggers group: Tools at app.xicbot.de/werkzeuge and Cases at app.xicbot.de/vorgaenge. Under Tools you decide what the assistant may do. Under Cases you see what it triggered; the page opens with “What the assistant triggered: enquiries, appointments and handed-over baskets.” How tools are created, released and assigned to an assistant in general is covered in Tools.
| Tool type | What the assistant does with it | Where the result ends up |
|---|---|---|
| Capture enquiry | records the request and contact details | Enquiries tab |
| Book appointment | lists free slots, requests, moves or cancels appointments | Appointments tab |
| Hand over to a human | hands the conversation to your team | Inbox and Enquiries tab |
| Hand over basket | hands a basket over to the shop, see Catalog and shop | Baskets tab |
Appointment types and time windows
The form of a Book appointment tool has a section Appointment types with the hint “What the assistant may offer. Without an entry a fixed duration applies, and there is neither lead time nor blocked hours.” As long as no type exists, it reads “No appointment type has been set up yet.” Add appointment type adds one, Remove appointment type drops it. Up to 12 types are possible; with 12 types Add appointment type is locked, and below it reads “At most 12 appointment types.” A new type starts with a duration of 30 minutes, no lead time, no buffers and no time windows.
| Field | Default | Allowed | Effect |
|---|---|---|---|
| Time zone of the windows | Europe/Berlin | zone name such as Europe/Berlin, at most 64 characters | Applies to all types of this tool. Windows, lead time and free slots are calculated in this zone. The form saves an empty field as Europe/Berlin. An unknown name is refused on save with “The time zone is unknown. Enter it in the form Europe/Berlin.” If the tool already holds an unknown name, the form shows this message at the field as soon as you open the tool; until you correct it, the tool calculates in Europe/Berlin. Upper and lower case do not matter: europe/vienna counts as Europe/Vienna. |
| Name of the appointment type | empty | required, 1 to 80 characters | This is how the assistant names the type. A key is derived from it on the first save. |
| Duration in minutes | 30 | 5 to 480 | Length of the appointment. Hint in the form: “At least 5, at most 480 minutes.” |
| Lead time in minutes | 0 | 0 to 43200, i.e. up to 30 days | “How far ahead a booking has to be made. 0 means: right away is fine.” |
| Buffer before, in minutes | 0 | 0 to 480 | Time before the appointment that stays blocked for other appointments. |
| Buffer after, in minutes | 0 | 0 to 480 | Time after the appointment that stays blocked for other appointments. |
| Takes place at the customer | off | on or off | Marks an on-site appointment and shows the travel buffer. When it is off, the form saves the travel buffer as 0. |
| Travel buffer in minutes | 0 | 0 to 480, only for an on-site appointment | “Only for an on-site appointment. It is added before and after the appointment.” |
| Time windows | none | up to 14 per type | “Without a time window any time of day is possible.” |
| Weekday | Monday | Monday to Sunday | Day on which the window applies. |
| From and To | 09:00 and 17:00 | time in the form 09:00, To after From | Span that has to contain the whole appointment. |
Add time window creates a window, Remove time window takes it out. With 14 windows in a type, Add time window is locked, and below it reads “At most 14 time windows per appointment type.” For a day with a lunch break, create two windows on the same weekday. An appointment fits if it lies entirely within one window: its start not before From, its end including the duration not after To. Buffers do not count in this check; they only affect occupancy.
Checks on save
Appointment types are checked when the tool is saved, not only during a conversation. If something is wrong, nothing is saved and the form shows one of these messages:
| Message | Cause |
|---|---|
| The appointment types are not valid: a name is missing, or there are too many types. | name empty or longer than 80 characters, more than 12 types |
| Two appointment types produce the same key. Change one of the names. | two names produce the same key |
| The time zone is unknown. Enter it in the form Europe/Berlin. | Time zone of the windows does not name a known time zone |
| The duration of an appointment type has to be between 5 and 480 minutes. | duration outside 5 to 480 |
| The lead time has to be between 0 and 43200 minutes. | lead time outside 0 to 43200 |
| A buffer has to be between 0 and 480 minutes, and a travel buffer only works for an on-site appointment. | buffer or travel buffer outside 0 to 480 |
| A time window needs a weekday and times in the form 09:00, and the end has to be after the start. | more than 14 windows, invalid weekday, time not in the form 09:00, To not after From |
Free slots and occupancy
In a conversation the tool knows four actions: request an appointment, move it, cancel it and list free slots. The assistant lists free slots right away without asking the visitor, because nothing is created; it needs neither name nor email address for that. The other three actions appear to the visitor as a proposal to confirm or reject, see Tool cards.
- At most 6 start times are listed, at most 3 per day.
- The search starts at the day the visitor names, otherwise now, but no earlier than now plus the lead time of the type, and covers 14 days. If the named day cannot be read, the tool reports this and asks for a date in the form 2026-09-08.
- Start times follow a 15-minute grid from the start of the window, and the whole appointment has to fit in the window.
- Two listed times on the same day are at least the duration of the type apart, and at least 60 minutes.
- Occupied times are left out.
- A type without time windows has no list: it can be requested at any time of day, and the assistant asks the visitor for a preferred time.
- There is no waiting list. If nothing is free within the 14 days, the assistant says so.
What is checked before every request
Before an appointment is requested or moved, the tool checks four conditions: type, lead time, time window and occupancy. If no type is set up on the tool, it only checks occupancy. If a condition fails, nothing is created. The assistant receives a message and passes it on to the visitor:
| Condition | Message to the assistant |
|---|---|
| Type | The type does not exist; the message lists the names of your types |
| Lead time | The type needs a lead time of the stated minutes; the message names the earliest possible start |
| Time window | No appointments of this type are given at that time; if the day has windows, the message lists their spans |
| Occupancy | The time is taken by another appointment; the message names it and, for a type with time windows, offers up to 3 alternative times |
| Time | The requested date and time could not be read; the visitor is asked for date and time |
| Simultaneous entry | Another appointment is being entered or changed at this moment; the visitor is asked to repeat the request |
Occupancy applies to your whole account: requested and confirmed appointments of every appointment tool count, whichever channel they came from. The spans of both appointments are compared including buffers, and for an on-site appointment including the travel buffer. Cancelled appointments free their time. The buffers of an existing appointment follow its type, looked up among the types of all appointment tools of your account, including turned-off ones. If two tools have a type with the same name, the buffers from the tool the appointment was booked or last moved with apply; for older appointments that do not yet record a tool, those from the tool created first. If the type or the tool no longer exists, or the appointment has no type, it counts without buffers. Requests, moves, free slots and reinstating under Cases thus calculate with the same buffers. So that two visitors cannot get the same time at once, the tool enters the appointments of one account one after another.
Without appointment types
If no type is set up on the tool, a flat type applies: 30 minutes duration, no lead time, no buffer, no time window. It takes the type the visitor named as its name, otherwise “Beratung” (consultation). The tool stores this name as the appointment’s type; it appears under Cases on the Appointments tab in the Type column and in the type field when appointments are fetched through the API. The form has no field of its own for the flat duration.
How an appointment request runs
-
Step 1
Take the request
The assistant asks for type and time and can list free slots. The start is required; which other details are needed is set on the tool under Required fields, see Tools. Name, email address, phone and topic are recorded if the visitor gives them.
-
Step 2
Confirm the proposal
The visitor sees a proposal to request the appointment with start, type, duration, name and email address as far as known, and confirms or rejects it. The proposal is in the language of the reply above it, so after an English reply it is in English (“Request appointment:”); if that language is neither German nor English, it follows the language of the conversation and then that of the assistant. A proposal left open for 60 minutes expires.
-
Step 3
Check on click
On confirmation the tool checks permission, required fields and plan again, then type, lead time, time window and occupancy. Only then does it create the appointment with the status requested. If the tool has been deleted in the meantime, it reports that the tool has been removed.
-
Step 4
Reply to the visitor
The assistant receives the appointment ID and the note that the request has arrived and only counts as an appointment once you confirm it, and passes this on to the visitor. The same request with the same details in the same conversation does not create a second entry.
-
Step 5
Confirm under Cases
You set the appointment to confirmed under Cases. The confirmation email then goes to the visitor.
Moving and cancelling
An appointment can be moved or cancelled in the conversation where it was requested, and only with its appointment ID. Both are again a proposal the visitor confirms. A moved appointment goes through the same four checks as a new request; its previous time does not count as occupied. If the visitor names no new type, the old one stays. The appointment is then requested again until you confirm it anew. A cancellation sets the appointment to cancelled and needs no time; the slot is free again, and the row stays under Cases.
- The appointment ID is missing; it is part of the reply to the original request.
- There is no appointment with this ID in this conversation; an appointment can only be changed where it was requested.
- The appointment has already been cancelled.
- The new time for the move is missing; the visitor is asked for date and time.
Enquiries and handoffs
The Capture enquiry tool creates an entry under Enquiries. The request itself is required; further required details are set on the tool under Required fields. Name (up to 120 characters), email address (up to 190), phone (up to 60) and request (up to 1000) are taken over if the visitor gives them. Anything else the assistant asked for appears in the Request column below the request, each with field name and value. If the visitor uploaded files in the same conversation that are not yet assigned to an enquiry, the tool assigns them to this enquiry. The Source column shows the Key of the tool that created the entry.
Hand over to a human also creates an entry under Enquiries: the reason for the handoff (required, up to 300 characters) is its request, plus name, email address and phone number (up to 60 characters) if known. The phone number appears in the Email address / Phone column. The conversation itself goes to the Inbox as escalated, and the assistant tells the visitor that a person will get back to them.
The Cases list
At the top are the tabs Enquiries, Appointments and Baskets. Each tab shows as a number how many entries are open: new enquiries, requested appointments and open baskets. The list is sorted by arrival, newest first, with 25 entries per page. With more than one page you page through with Back and Next; between them Page shows the current and the last page number.
Use Status to filter by one status; all shows every entry. Next to it is the number of matches. If the filter finds nothing, “No entry with this status.” appears with the hint “The status filter hides the other entries.” and the button Reset filters. Switching tabs resets filter and page. If a tab is empty, it shows “No enquiry has come in yet.”, “No appointment has come in yet.” or “No basket has come in yet.” with the hint “Enquiries, appointments and baskets are created in a conversation through an assistant's tools. Which tools an assistant uses is set under Tools.” and a Tools button. While loading it shows “Loading …”, and on an error “The list could not be loaded.” with Load again.
| Tab | Columns |
|---|---|
| Enquiries | Time, Name, Email address / Phone, Source, Request with further details asked for, Status, Action |
| Appointments | Time, Name, Email address / Phone, Type, Start with duration in min, Status, Action |
| Baskets | Time, Items with quantity, Total, Pickup token set as Yes or No, Status, Action |
Time is when the case arrived, Start is the start of the appointment; the list shows both in your browser’s local time and in the date format of the selected language. The list does not show the topic of an appointment; it appears in the confirmation email. Open conversation opens the conversation the case came from; if that conversation no longer exists, the link is missing. The list does not show the pickup token of a basket itself. How a basket gets into the shop is covered in Catalog and shop.
Changing status and roles
| Kind | Statuses | On creation |
|---|---|---|
| Enquiries | new, seen, done | new |
| Appointments | requested, confirmed, cancelled | requested |
| Baskets | open, collected, expired | open |
In the Status column you pick a new status in the select field; screen readers announce the field as Change status. The Action column holds the Open conversation link. The change takes effect at once; the row then shows the status the server stored. If the change fails, an error message appears and the list reloads. Cases only sets an appointment to requested or confirmed when the appointment lock of your account is free, the same lock under which the tool enters appointments one after another. If it does not become free within 5 seconds, the appointment stays unchanged and the message “An appointment for this account is being entered or changed right now. Your change has not been applied – please try again in a moment.” appears. Every status of a kind can be set to any other, including back; a cancelled appointment is only reinstated if its time is still free. Only changing an appointment to confirmed triggers anything: the confirmation email and the webhook event appointment.confirmed. If you set an appointment that is already confirmed to confirmed again, neither goes out a second time. All other changes notify nobody, including a cancellation made under Cases.
Changing the status needs at least the Edit role. With the Read role you see the whole list, but the select field is locked, and the page says “With the Read role this area is view-only. Changes need at least the Edit role.” Roles are assigned under Team and roles.
The confirmation email
Above the appointment list it says: “When an appointment is set to “confirmed”, the visitor receives a confirmation by email, provided an address is stored and the appointment is still ahead. A moved appointment counts as a request again; only its renewed confirmation sends a new email.” After switching to confirmed, Cases shows one of these messages:
| Result | Message |
|---|---|
| queued | The visitor will receive a confirmation by email. |
| not queued | The appointment is confirmed, but the confirmation email to the visitor could not be queued. Please let them know yourself. |
| no address | No email address is stored for this appointment. The visitor will not receive a confirmation by email; let them know yourself if needed. |
| past | The appointment is in the past. No confirmation email is sent for it. |
| duplicate | A confirmation already exists for this appointment at this start time. No second email is sent. |
| unchanged | The appointment was already confirmed. No further email is sent. |
| superseded | The appointment was changed again in the meantime, so no confirmation is sent. |
The subject reads “Ihr Termin bei … am … ist bestätigt” (your appointment with … on … is confirmed). The email lists business, start, type, duration and topic, and the appointment ID only for an appointment that belongs to a conversation; empty details are left out. The business is the name of your account. The start appears as “08.10.2026 um 10:30 Uhr (Europe/Berlin)”, calculated in the time zone of your appointment tools; if their zones differ, Europe/Berlin applies. Upper and lower case do not count as a difference, and the email names the zone in the spelling of the time zone database, for instance Europe/Vienna instead of europe/vienna. The email explains that the appointment can be cancelled or moved in the same chat conversation in which it was requested, points to the appointment ID for that, and says that a moved appointment counts as a request again until you confirm it anew. If the conversation took place in the chat on your website, it adds that the earlier conversation usually opens there on the same device and in the same browser. If the conversation is no longer available or the appointment belongs to no conversation, it asks the visitor to contact the business directly. The email is not meant to be answered. If the conversation was in English, the email is sent in English, with the subject “Your appointment with … on … is confirmed” and the start in the form “08.10.2026, 10:30 (Europe/Berlin)”; otherwise, including when there is no conversation, in German.
Emails about cases
Not every case sends an email. The overview shows which of the occasions on this page trigger an email and who receives it.
| Occasion | Recipient | Condition | |
|---|---|---|---|
| Handover to a human | Handover email | Handover address on the assistant | An address is set; with the Hand over to a human tool only if the enquiry was newly created. |
| Capture enquiry | none | – | The entry appears under Enquiries. |
| Requesting, moving or cancelling an appointment in the conversation | none | – | The appointment is listed under Appointments as requested or cancelled. |
| Setting an appointment to confirmed under Cases | Confirmation email | Email address on the appointment | The appointment is still ahead and no confirmation has been sent for this start yet. |
The handover email is queued with priority 3, the confirmation email with the usual priority 5; Background jobs explains order and retries. If your team replies to a handover email, the reply goes to the visitor's email address, provided they gave a valid one; Inbox describes its content and layout. The sender name on these emails is XICBOT, and each is marked as automatically generated (Auto-Submitted: auto-generated). Before an email is queued, a line is written to the delivery log; if the recipient address is invalid, the email is not queued and is recorded there as failed.
Emails that do not belong to a case are described on the page of their occasion: the notice after a password change in Account security, the team invitation in Team and roles and the weekly report in Analytics.
Plan and availability
Enquiries and handoffs are available in every plan. Appointments and baskets need a plan that includes this feature; which plans do is listed under Pricing and Plans and quotas. Without the feature:
- The Appointments and Baskets tabs still show their number and list, so that cases from before a plan change can be found and deleted. The status selection is locked, and above the list it says that these cases are not part of your plan, that each one can be viewed and deleted and that the status can be changed from the … plan; a box above the tabs leads to the plan overview with Go to billing.
- A Book appointment tool can be neither created nor changed, only removed.
- An existing appointment tool does not run in a conversation; the assistant is told the tool is not available in this account at present. This also applies to a proposal from before the plan change that the visitor confirms afterwards.
- When the status is changed, the API answers for these kinds with status 402 and the error
plan_feature_missing; the list, the counts and deleting answer as in every plan.
Retention
Enquiries have a retention period of their own, separate from the one for conversations; an enquiry falls under it even while its conversation is still running. It can be set by the Administration and Owner roles. Appointments and baskets follow the retention period for enquiries: appointments count from their start, baskets from their arrival. If no period is set for enquiries, none applies to appointments and baskets either. If a visitor deletes their conversation, enquiry, appointment and basket stay with you; only the Open conversation link disappears. The Administration and Owner roles delete a single case with Delete in its row, for example when a visitor asks for their details to be erased; the confirmation lets you choose to delete the conversation with all messages and attachments as well. Beforehand, Record deleted is written to the Audit log, and reminders and confirmations for an appointment that have not been sent yet no longer go out. The analytics figures for enquiries and appointments then drop for past periods too. Periods are set under Retention and deletion.
Webhook events
| Event | Shown in the app as | When | Payload |
|---|---|---|---|
lead.created | Enquiry created | first creation of an enquiry, including through a handoff | id, conversation_id |
appointment.requested | Appointment requested | first creation of an appointment in a conversation | id, conversation_id |
appointment.confirmed | Appointment confirmed | change to confirmed under Cases, not for an appointment that is already confirmed | id, starts_at |
A repeated call with the same details does not trigger a second event, and neither does an already confirmed appointment that you set to confirmed again. Moving and cancelling in a conversation trigger no event. Receivers are set up under API keys and webhooks.
API
The app reads and changes cases through three endpoints of the management API. {type} is leads, appointments or carts; any other kind returns 404 with unknown_kind. Integrations with an API key have their own endpoints for enquiries and appointments, described under API integration.
GET /api/v1/records
Number of open entries per kind: new enquiries, requested appointments, open baskets. Every kind is counted; plan_locked lists the kinds whose status cannot be changed in the current plan, available_from and available_from_name name the plan from which they are included. If nothing is locked or no such plan can be named, both are null.
- Authentication
- signed in, confirmed email address, any role
GET /api/v1/records/{type}
List of one kind, newest first. Parameters status (up to 20 characters), page (from 1) and per_page (1 to 200, default 50). The response contains entries, total, page and per_page. For a basket only pickup_token_set is returned, not the pickup token.
- Authentication
- signed in, confirmed email address, any role
POST /api/v1/records/{type}/{id}/status
Sets status to a status of the kind, otherwise 422; an unknown ID returns 404 with not_found. If a cancelled appointment is set to requested or confirmed and its time has been taken in the meantime, the service answers 409 appointment_slot_taken and changes nothing. When an appointment is set to requested or confirmed, it waits up to 5 seconds for the appointment lock of the account; if the lock does not become free, it answers 503 appointment_lock_busy with Retry-After: 1 and likewise changes nothing. The response contains entry, and when an appointment is set to confirmed also confirmation_mail with queued, failed, no_email, past, duplicate, unchanged or superseded.
- Authentication
- signed in, confirmed email address, Edit role or higher
DELETE /api/v1/records/{type}/{id}
Deletes a single case, for example when a visitor asks for their details to be erased, and logs this beforehand as record.deleted with kind, ID and counts, without name, email address or phone. Without an audit log entry the case stays; you then get 500 with not_logged. There is no plan check here: appointments and baskets can be deleted even without the appointment features. Together with the case, undelivered notifications about it to connected systems (lead.created, appointment.requested, appointment.confirmed) go, and for an appointment any reminders and confirmations not yet sent; their row in the delivery log is then set to failed. Visitor attachments stay with the conversation. With with_conversation=1 the conversation the case came from goes as well, with all messages and attachments. The response contains deleted, kind, id, conversation_deleted and counts. An unknown kind gives 404 with unknown_kind, an unknown case 404 with not_found.
- Authentication
- signed in, confirmed email address, Administration or Owner role, not during an impersonation
- Rate limit
- 5 per minute and user, shared by export, retention periods, objections and deletion
Frequent questions
Why did the visitor not receive a confirmation email?
The email is only sent when the status is set to confirmed, and only if an email address is known, the appointment is still ahead and no confirmation has been sent for this start yet. The message below the appointment list right after the change shows which case applied.
Can I move an appointment to another time under Cases?
No. Under Cases you only change the status. The visitor can move the appointment in the conversation where it was requested, using the appointment ID. If you agree on another time yourself, tell the visitor directly.
Why does the assistant not list free slots?
A list only exists for types with time windows. Without windows any time can be requested, and the assistant asks for a preferred time. If the type has windows, there may be nothing free within the next 14 days given lead time, windows and occupancy.
Does a requested appointment already block its time?
Yes. Requested and confirmed appointments both count towards occupancy, including buffers and across all appointment tools of your account. A cancellation frees the time again, and moving frees the previous time.
Who may change the status of a case?
Anyone with at least the Edit role. With Read you see the whole list, but the select field in the Status column is locked.
Does my team get an email when the assistant captures an enquiry?
No. Capture enquiry creates the entry under Enquiries without sending an email. An email to the Handover address is sent when the conversation is handed over to a human.
Ask it yourself, Assistant of this website
Automated assistant