@voyant-travel/quotes) owns the pre-commitment sales plane. A bespoke travel sale starts as a tracked pursuit with a Person or Organization, moves through a series of stages, and produces one or more priced proposals. Quotes is where that pursuit, those proposals, and their decisions live, right up to the moment a client accepts a proposal and the reserve workflow takes over.
It sits at the top of the commitment chain: Quote -> accepted Quote Version -> reserve workflow -> Booking -> Fulfillment. Each step hardens the commitment, and quotes owns the first two. Accepting a quote version is a sales decision, not supplier confirmation; it marks the version accepted, closes the quote won, and seeds the reserve workflow that the bookings side runs.
People and organizations are referenced by plain id. This module does not import relationships schema or own any identity lifecycle state.
Key concepts
A tracked travel sales pursuit with a Person and/or Organization. It moves through stages, owns value, participants, activities, and one or more quote versions, and may close won or lost. This is the canonical sales pursuit; avoid “opportunity” or “deal”. See Quote.
An immutable proposal revision or alternative sent to the client. It freezes a Trip Envelope snapshot, pricing, validity, and decision state. Editing a sent version creates another version rather than mutating the one already in the client’s hands. See Quote Version.
An ordered set of stages a Quote moves through. An operator can run several pipelines (for example one for FIT, one for groups). See Pipeline.
A step within a pipeline (for example Qualified, then Proposal, then Negotiation), carrying win and lost flags so the pipeline knows which stages close a quote. See Stage.
A Participant on a quote: the booker, the decision-maker, the finance contact, or a traveler. Each participant points at a Person by id and carries the role they play on this pursuit.
A logged interaction (call, email, meeting, task, follow-up) recorded against a quote. Activities give a quote its history and drive follow-up. See Activity.
Quote products attach catalog references to the pursuit, and quote version lines freeze the priced contents of a specific version. Both belong to the quote side, not to a booking, until a version is accepted.
The proposal lifecycle
A quote version moves through an explicit status:draft to sent to a decision. A version can only be accepted after it has been sent, and a quote can hold exactly one accepted version. Sending freezes the proposal; accepting records the decision and closes the pursuit.
Draft
A version is created in
draft and can be revised freely. It carries a frozen Trip Envelope snapshot, pricing, and validity.Sent
Sending the version (
sendQuoteVersion) hands it to the client. Once sent, edits create a new version rather than mutating this one.What it owns
Quotes owns the sales pipeline and the proposal artifacts.- Pipelines and stages (
./schema), including win and lost flags on stages. - Quotes, their value, owner, status, source, and stage tracking (a stage change stamps
stageChangedAt, and closing stamps the close). - Quote versions, their immutable snapshots, validity, and decision state, plus the accept-and-decline-siblings transaction.
- Quote participants and activities scoped to a quote.
- Quote products and quote version lines that hold the proposal contents.
- The booking quote-details extension (
./booking-extension): a smallbooking_crm_detailstable that links a created Booking back to the quote and version it came from, so the bookings side can carry provenance without coupling to quote schema.
Working with it
Mount the module alongside the rest of the app.A quote can hold only one accepted version. Calling
acceptQuoteVersion on a version that has not been sent, or on a quote that already accepted a different version, raises a QuoteVersionConflictError rather than silently overwriting the decision.Links to other modules
- relationships owns the People and Organizations a quote points at by id. Quote panels surface on person and organization detail pages.
- bookings consumes the accepted quote version: its Booking Origin records
accepted_quote_versionand the version id, and thebooking_crm_detailsextension links the booking back to its quote. - trips is the shape a quote version’s Trip Envelope snapshot mirrors when the proposal composes several components.
- The finance and legal modules attach invoices, contracts, and policy acceptances against a quote version once it is accepted.
React package
@voyant-travel/quotes-react provides hooks (useQuotes, useStages, and the version and participant equivalents), query keys, the VoyantProvider, and reusable UI including QuotesBoard for a stage-by-stage pipeline view. Quotes are represented by ids on quote records, so person and organization UI comes from @voyant-travel/relationships-react. Styled components require the optional @voyant-travel/ui peer.
Next steps
Relationships
The CRM core that owns the People and Organizations a quote pursues.
Bookings
Where an accepted quote version becomes a durable commitment through reserve.
Trips
The Trip Envelope shape a multi-component proposal composes and freezes.
Glossary
The shared vocabulary: Quote, Quote Version, Pipeline, Stage, and the commitment chain.