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

# MICE

> The MICE module is Voyant's group-program spine: programs, sessions, delegates, rooming, and the RFP-to-bid sourcing funnel for Meetings, Incentives, Conferences, and Exhibitions.

The MICE module is the group-program spine for Meetings, Incentives, Conferences, and Exhibitions. It owns the umbrella a buyer organization runs over a date range, the agenda of timed sessions inside it, the delegate roster, the rooming manifest, and the RFP-to-bid sourcing funnel. It fills the gaps the rest of the system does not model: an attendee lifecycle, session capacity and enrollment, a first-class rooming manifest, and multi-supplier bid solicitation and scoring.

It ships as `@voyant-travel/mice` with Drizzle schema, Zod validation, services, admin Hono routes, link definitions, and a booking extension.

```bash theme={null}
pnpm add @voyant-travel/mice
```

<Note>
  MICE is operator-local, not part of the platform standard module set. The operator application lists `@voyant-travel/mice` in its `voyant.config.ts` modules so the schema (`mice_programs` and the rest) is discovered for migration generation, and mounts it through the deployment composition as a deployment-local module rather than a package-standard one. The allotment primitives it links to (room blocks, function spaces) are standard and package-owned.
</Note>

## Key concepts

* **Program.** The umbrella. A group engagement a buyer organization runs over a date range, with a type (`meeting`, `incentive`, `conference`, `exhibition`, `other`) and a lifecycle status (`lead` through `operating` to `completed` or `cancelled`). Cross-package associations like the buyer organization and the primary contact Person are loose reference columns linked through `defineLink` at the deployment.
* **Session.** A timed, capacity-bound item on the program agenda (keynote, breakout, meal, networking, gala, excursion). Sessions carry start and end times, an optional capacity, and inclusions for F\&B, AV, materials, and signage. A session can link to a function space owned by the operations module.
* **Delegate.** An attendee on the program roster with a role (`attendee`, `speaker`, `sponsor`, `vip`, `staff`, `exhibitor`, `organizer`) and a lifecycle status (`invited`, `registered`, `confirmed`, `checked_in`, `no_show`, `cancelled`). A delegate references a CRM Person and, once confirmed, a Booking. It carries no PII of its own.
* **Rooming.** A first-class rooming manifest. A rooming assignment links to a room block and room type, and a shared room is one assignment with many delegates through an explicit join.
* **RFP and bid.** The sourcing funnel: an RFP is issued, suppliers are invited, they submit bids with line items, the bids are scored against weighted criteria, and an award atomically accepts the winning bid and rejects the rest.

## What it owns

The module owns these Drizzle tables, each with a TypeID prefix:

| Table                               | TypeID prefix | Holds                                         |
| ----------------------------------- | ------------- | --------------------------------------------- |
| `mice_programs`                     | `prog`        | The group-program umbrella                    |
| `mice_program_sessions`             | `mpss`        | Timed, capacity-bound agenda sessions         |
| `mice_session_inclusions`           | `mssi`        | F\&B, AV, materials, and signage on a session |
| `mice_program_delegates`            | `mpdl`        | The attendee roster                           |
| `mice_delegate_session_enrollments` | `mdse`        | A delegate's enrollment in a session          |
| `mice_rooming_assignments`          | `mrma`        | The rooming manifest                          |
| `mice_rooming_assignment_delegates` | `mrad`        | Delegates sharing a rooming assignment        |
| `mice_rfps`                         | `mrfp`        | Requests for proposal                         |
| `mice_rfp_invitations`              | `mrfi`        | Suppliers invited to an RFP                   |
| `mice_bids`                         | `mbid`        | Supplier bids                                 |
| `mice_bid_lines`                    | `mbln`        | Line items on a bid                           |
| `mice_bid_evaluations`              | `mbev`        | Weighted scoring of a bid                     |

A separate `booking_mice_details` sidecar table (prefix `bkmd`) links a Booking to its program and delegate. It ships through the `./booking-extension` subpath as a `HonoExtension` and uses a loose text key, so the package does not depend on bookings.

## The RFP-to-bid funnel

An RFP moves `draft` to `issued` to `closed` to `awarded` (or `cancelled`). Invited suppliers submit bids that move `draft` to `submitted` to `under_review` to a decision. Awarding is atomic: it accepts the winning bid and rejects the rest in one step.

```mermaid theme={null}
flowchart LR
    subgraph RFP
      r1[draft] --> r2[issued]
      r2 --> r3[closed]
      r3 --> r4[awarded]
    end
    r2 --> inv[suppliers invited]
    inv --> b1[bid submitted]
    b1 --> b2[under_review / scored]
    b2 --> award{award}
    award -->|winner| acc[bid accepted]
    award -->|others| rej[bids rejected]
    acc --> r4
```

## Working with it

Standard modules are not registered by hand. `@voyant-travel/mice` is part of the standard product graph, so its routes, services, subscribers, and jobs are resolved into the application at build time. See [Configuration](/docs/platform/fundamentals/configuration).

Programs that run delegate enrollment, rooming replacement, and session-inclusion writes inside a database transaction. The module declares `requiresTransactionalDb`, so route `/v1/admin/mice/*` to the transactional database.

Call the services directly to create a program and award an RFP:

```ts theme={null}
import { createProgram } from "@voyant-travel/mice"
import { awardRfp } from "@voyant-travel/mice"

const program = await createProgram(db, {
  name: "Global Sales Kickoff 2026",
  type: "conference",
  startDate: "2026-09-14",
  endDate: "2026-09-18",
})

// Award atomically accepts the winning bid and rejects the rest,
// then moves the RFP to `awarded`.
const outcome = await awardRfp(db, rfpId, winningBidId)
```

Downstream effects of an award, such as spawning a contract, room block, or booking, are a workflow subscriber on the `mice.rfp.awarded` signal rather than inline route logic.

## Links to other modules

* **Relationships.** A program's buyer organization and primary contact are loose references to relationships records, linked through `defineLink` at the deployment. A delegate references a CRM Person.
* **Accommodations.** Rooming assignments link to room blocks and room types owned by the accommodations module.
* **Operations.** Sessions link to function spaces owned by the operations module.
* **Bookings.** The `./booking-extension` sidecar links a Booking to its program and delegate. A confirmed delegate carries a `bookingId`.
* **Distribution.** RFP invitations and bids reference suppliers as loose columns.

## Next steps

<CardGroup cols={2}>
  <Card title="Accommodations" icon="bed" href="/docs/platform/modules/accommodations">
    The room blocks and room types behind the rooming manifest.
  </Card>

  <Card title="Operations" icon="building" href="/docs/platform/modules/operations">
    The function spaces sessions are scheduled into.
  </Card>

  <Card title="Bookings" icon="ticket" href="/docs/platform/modules/bookings">
    The Bookings the delegate roster confirms against.
  </Card>

  <Card title="Links" icon="link" href="/docs/concepts/how-it-is-built">
    How MICE associates programs with organizations, suppliers, and spaces.
  </Card>
</CardGroup>
