# Build a check-in app (/docs/guides/check-in)



Your scanner reads a ticket ID. Your backend asks Eventlayer to check it in.

<DocsFlow label="Check-in" steps="[&#x22;Scan ticket&#x22;, &#x22;Your backend&#x22;, &#x22;Check in&#x22;, &#x22;Admit&#x22;]" />

Use an assigned test ticket. Check-in is one-time and cannot be undone.

## Check in the ticket [#check-in-the-ticket]

Authenticate staff and confirm the ticket belongs at this door before making
the call. Keep your API key on the backend.

```ts title="Check-in · server"
import { Eventlayer } from "eventlayer";

const eventlayer = new Eventlayer();
const { data: ticket, error } = await eventlayer.tickets.checkIn({
  ticketId: "tkt_your_ticket",
});
if (error) throw error;

console.log(ticket.status); // checked_in
```

A successful response records admission. If two scanners submit the same
ticket, only one can complete its first check-in.

## Show the result [#show-the-result]

| Result                       | Scanner message    |
| ---------------------------- | ------------------ |
| Success                      | Checked in         |
| TICKET\_ALREADY\_CHECKED\_IN | Already checked in |
| FAILED\_PRECONDITION         | Ticket unavailable |
| NOT\_FOUND                   | Ticket not found   |

If the response is lost, show an unknown result for staff to review.
See [errors](/docs/errors) and [recovery](/docs/retries) for handling failures.

## Next steps [#next-steps]

[React to check-in events](/docs/guides/webhooks) to update your CRM or send a follow-up.
