# Mark Booking (no-show / completed)

Finalise this conversation's appointment as completed, a no-show or canceled — the same move the /bookings page's own buttons make, so a webhook or a question the customer answers can record it automatically.

## Getting here

**Automate → Workflows**, open a workflow, click **+** on the canvas, then pick **Mark Booking (no-show / completed)** under **Add Steps**.

## Before you start

- An **owner**, **admin** or **agent** can add this step and save the workflow. Publishing that workflow — the thing that makes it run on live conversations — is an **owner** or **admin** action.
- Building and running workflows depends on your plan; see [pricing](/pricing).
- This conversation (or the booking id you name) needs a **confirmed** booking to finalise — nothing else moves.

## Set up

1. Open the workflow and click **+** where the record belongs.
2. Pick **Mark Booking (no-show / completed)**.
3. Choose **No show**, **Completed** or **Canceled**.
4. Leave **Booking id** blank to use this conversation's own open booking, or name one with a placeholder.
5. Save the step, then publish the workflow. A saved but unpublished workflow finalises nothing.

## Fields

| Field | What it means | Default | Limits |
| --- | --- | --- | --- |
| Status | No show, Completed or Canceled. | No show | — |
| Booking id | A specific booking to finalise, as a placeholder or literal id. | This conversation's own open booking | Left blank, only this conversation's confirmed booking is eligible — never another contact's. |

## How it works

- Left with no **Booking id**, the step finds this conversation's own **confirmed** booking, ordered by start time with the LATEST one first — so if this conversation somehow has two confirmed bookings, a past one and a future one, this step finalises the future one, not necessarily the appointment that already happened.
- Only a booking in **confirmed** status can move. The move is a single conditional database update, not a read-then-write, so a workflow step and a person clicking a status button on /bookings at the same moment cannot both win — whichever reaches the database first finalises the booking, and the other is told it is already finalized rather than finalising it a second time.
- It reuses the exact same function the /bookings page's own status buttons (labelled **Done**, **No-show** and **Cancel** there — this step's own dropdown uses the fuller words above) call, so a booking finalised by a workflow behaves identically to one a person finalised by hand.
- On success it fires this workspace's **Booking Status Changed** trigger for follow-up flows — a re-engagement message after a no-show, for example. This is best-effort: if starting that follow-up fails for any reason, the booking's status change already happened and is not undone.

## When it fails

- No booking id was given and this conversation has no confirmed booking: the step fails with **this conversation has no open booking to mark**. A database error looking up that booking fails with the exact same message — the two causes are not distinguishable from the run log.
- The named booking id does not exist in this workspace, or is not currently **confirmed** (already finalised, or raced by something else): the step fails with **Booking not found.** or **Booking not found or already finalized.**
- A database error reading or updating a named booking fails the step with **Could not read the booking.** or **Could not update the booking.**
- A failed record does not stop the run: the step is recorded failed and the flow moves straight to the next one, with the booking left exactly as it was.

## Limits

- It cannot move a booking that is not **confirmed** — a booking already marked completed, no-show or canceled cannot be re-marked, in either direction, by this step or by the page.
- Left with no booking id, and with more than one confirmed booking on this conversation, it finalises whichever one starts latest — not necessarily the one that just happened. Name the booking id explicitly when that matters.
- It does not message the customer. Whatever should follow a no-show or a completion is a separate step, or the workflow the **Booking Status Changed** trigger starts.
- The follow-up trigger only fires when the booking is linked to a conversation; a booking with none records the status change but starts no flow.

## Use cases

- Mark **Completed** after a calendar webhook posts that the appointment finished, then move the contact's lifecycle stage forward.
- Ask "Did you make it to your appointment?" and mark **No show** on a "no" answer, triggering a reschedule flow.

## Related

- [Register for Event](https://inchat.inseller.my/help/workflows/register-for-event)
- [Record Attendance](https://inchat.inseller.my/help/workflows/record-attendance)
- [Workflows: how a flow runs](https://inchat.inseller.my/help/workflows/workflows-overview)

---

Source files: `src/lib/workflows/ai-builder/spec.ts`, `src/lib/workflows/canvas-model.ts`, `src/components/workflows/WorkflowStepConfigDrawer.tsx`, `src/lib/workflows/engine-record-actions.ts`, `src/lib/booking/status.ts`, `src/lib/workflows/types.ts`, `src/components/bookings/BookingRowActions.tsx`, `src/components/workflows/WorkflowTriggerConfigDrawer.tsx`
