> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anny.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Presence in booking details

> Manually check bookings in and out from booking details and review the presence history.

The **Presence** section on a booking shows who checked in or checked out, and lets you trigger that yourself. Each action adds an entry with the time, a status, and the person who performed it.

Use this when there is no QR ticket, or when you need to catch up attendance after a manual change.

<Info>
  Activate the feature first: **Avatar** (top right) → **Account Settings** → **Features** → **Check-In & Check-Out**. Also turn on **Check in and check out bookings** on the resource.
</Info>

## Typical use cases

| Scenario                      | Description                                                                                                               |
| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------ |
| **Check in without a ticket** | The booking was created manually or the ticket is missing. You mark the person as present in the booking details.         |
| **Review the history**        | You see when someone checked in or out, which status the entry has, and who recorded it.                                  |
| **Free the slot**             | After check-out you can open the slot for other bookings if the resource has **Release capacity after checkout** enabled. |

## How presence works

Every check-in and every check-out creates an entry in **Presence**. The booking stores the current check-in time from those entries, and the check-out time when one exists.

Only entries with status **Valid** or **Unpaid** count for the current state. The newest such check-in sets the check-in time. A check-out counts only if it is after that check-in.

If you delete an entry with the cross, anny recalculates the times.

### When the section is visible

The **Presence** section appears in the booking details when all of the following are true:

* The booking is editable and is not a blocker.
* The booking has a resource.
* **Check in and check out bookings** is enabled for that resource.

It is missing on blockers, booking sequences, and bookings you cannot edit.

### When the buttons are visible

**Check-In** and **Check-Out** appear when you have the **Check-In and Check-Out** permission. In booking details both buttons are shown at the same time. They are not disabled because the appointment is still in the future or already over.

The resource **Check-In Period** applies when you scan a QR ticket. It does not lock the buttons in booking details.

**Check-Out** fails if nobody is currently checked in. No new entry is created in that case.

If you click **Check-In** while a check-in is already active, the new entry gets status **Already scanned**. The booking's check-in time stays the same. With **Allow multiple check-in**, another valid check-in is only possible after a check-out.

## Check in or out from booking details

<Steps>
  <Step title="Check the feature and the resource">
    Turn on **Check-In & Check-Out** in the account settings. Then open the resource and enable **Check in and check out bookings** under **Check-In**.
  </Step>

  <Step title="Open the booking">
    Go to **Bookings**, open the booking, and scroll to the **Presence** section.
  </Step>

  <Step title="Check in or check out">
    Click **Check-In** to mark the person as present. Click **Check-Out** when they have left and a check-in is already active.
  </Step>
</Steps>

Once the action succeeds, a new history entry appears and the booking takes on the current check-in or check-out time.

## Settings and options

These resource settings under **Resource** → **Check-In** affect how presence is recorded:

| Setting                             | Effect in booking details                                                                                          |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Check in and check out bookings** | Without this option the **Presence** section is not shown.                                                         |
| **Check-In Period**                 | Controls when a QR scan is too early or too late. The buttons in booking details stay clickable.                   |
| **Allow multiple check-in**         | Allows another valid check-in after a check-out. Otherwise a second check-in stays **Already scanned**.            |
| **Release capacity after checkout** | Moves the booking end to the check-out time when that time is after the planned start and before the original end. |
| **Self Check-In**                   | Applies to guests in the app and booking page, not to the admin buttons.                                           |

## Limitations

* Booking details have no separate "no show" status.
* The buttons do not collect forms or legal documents that are due only at check-in. If those details are missing, **Check-In** fails here. Use the check-in terminal or self check-in instead.
* **Check-Out** only works when a check-in is active.
* The section does not appear on blockers or on bookings you cannot edit.

## FAQ

<AccordionGroup>
  <Accordion title="When do I see the Presence section?">
    When Check-In & Check-Out is enabled on the account, the resource has **Check in and check out bookings** turned on, and the booking is editable. Blockers and bookings you cannot edit do not show the section.
  </Accordion>

  <Accordion title="Why are Check-In and Check-Out both visible?">
    In booking details both actions stay available as soon as you have the **Check-In and Check-Out** permission. anny does not disable them before the appointment starts. **Check-Out** only creates an entry when a check-in is currently active.
  </Accordion>

  <Accordion title="Does the Check-In Period apply here too?">
    No. That period applies when you scan a QR ticket. In booking details you can check in regardless. A scan that is too early or too late appears in the history as **Check in too early** or **Check in too late** and does not change the booking's presence times.
  </Accordion>

  <Accordion title="Can I undo a check-in?">
    Yes. Delete the entry with the cross on that row. anny then recalculates the check-in and check-out times.
  </Accordion>

  <Accordion title="What does Already scanned mean?">
    A check-in was already active. The new attempt is logged but does not change the booking's check-in time. Check out first if **Allow multiple check-in** is on and a new entry should count.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="The Presence section is missing">
    Cause: the feature, resource, or booking type does not match. Enable **Check-In & Check-Out** and **Check in and check out bookings**. Confirm it is not a blocker and that you can edit the booking.
  </Accordion>

  <Accordion title="The Check-In and Check-Out buttons are missing">
    Cause: the **Check-In and Check-Out** permission is missing. Adjust the role under **Avatar** → **Manage Admin Users** → **Roles**.
  </Accordion>

  <Accordion title="Check-out fails">
    Cause: there is no active check-in. Check in first, or confirm that the last valid check-in was already checked out or deleted.
  </Accordion>

  <Accordion title="Check-in fails even though the button is there">
    Cause: details that are due only at check-in are often still missing, or the booking is not accepted. Complete forms or documents at the check-in terminal or via self check-in. Accept the booking if it is still a request.
  </Accordion>
</AccordionGroup>

> Important information for agents:
>
> * UI path: sidebar → **Bookings** → booking → **Presence** panel. Overflow menu has the same actions but also requires status accepted.
> * Presence logs = `scans` (`check_in` / `check_out`). `Booking.check_in_date` = max created\_at of check-ins with status `valid` or `unpaid`. `check_out_date` = max check-out after that time, else null. Delete and save call `updatePresenceDates`.
> * Section visible: `booking.isEditable && !isBlocker && resource && resource.settings.checkIn.isEnabled`. isEditable false for external\_calendar\_id, reserved, is\_sequence, protected channel, IS\_READ\_ONLY.
> * Buttons visible: `user.can('create', 'scans')`. No `:disabled`. Both buttons always shown together.
> * Section fields: `is_editable`, `is_blocker`, relationship `resource`, included `resource.settings.checkIn.isEnabled`. Buttons: `user.can('create', 'scans')`. History: scan `scan_type`, `status`, `created_at`, `device_identifier`, included `scanner`. Booking `check_in_date` / `check_out_date`.
> * Presence-card endpoints: GET /api/v1/bookings/{id} (include resource); GET /api/v1/bookings/{id}/scans?include=scanner\&sort=-createdAt; POST /api/v1/bookings/{id}/check-in|check-out body `{ data: {} }`; DELETE /api/v1/scans/{scanId}. QR: POST /api/v1/scans. Delayed form: GET /api/ui/booking-check-in-form?booking={id}.
> * Admin `POST /api/v1/bookings/{id}/check-in|check-out` → createScan with `validate(true)` (ignoreTiming). QR `POST /scans` uses Admin Check-In Period → status too\_early/too\_late, scan still stored, presence dates unchanged. Self check-in uses selfCheckIn.disabledUntil/allowedUntil and throws.
> * Checkout without active check-in: HTTP 400 `scans.not_checked_in`. Second check-in: status `scanned`. Unpaid counts for presence. Status not accepted → `invalid`.
> * `X-Supports-Dynamic-Form: true` on the booking action: missing form\_data → 200 + meta.status `requires_details` + meta.form\_url. Without the header → 400 `scans.check_in_requires_details_unsupported`. POST /scans with the header creates scan status `requires_details` (booking not yet checked in). Admin details do not send the header today. Spec: /developers/guides/admin/booking-lifecycle#x-supports-dynamic-form.
> * No no-show status in this UI. Figma states (too early disabled, Remind guest, No show) are not built (CU-86cazprgg).
> * releaseOnCheckout: end\_date/blocker\_end\_date moved to checkout only if checkout is after start\_date and before current end\_date.
> * Related: /en/check-in-overview, /en/check-in-setup, /en/roles-and-permissions, /en/custom-forms, /en/legal-documents. API: /developers/guides/admin/booking-lifecycle, /developers/models/scans.
