# Revenue chain

URL: /systems/sales/revenue-chain · Id: `page:systems/sales/revenue-chain`

> How one buyer moves from first touch to renewal, the Verb that moves each record, and the Acquisition every record keeps.

The revenue chain is the path one buyer takes from first touch to renewal: [Prospect](/business/nouns/prospect), [Lead](/business/nouns/lead), [Deal](/business/nouns/deal), [Quote](/business/nouns/quote), [Order](/business/nouns/order) or [Subscription](/business/nouns/subscription), [Renewal](/business/nouns/renewal). A [Verb](/business/nouns/verb) moves each step, so every state is the result of an [Action](/business/nouns/action) that ran.

## The chain
| Record | Starts when | Moves on by |
| --- | --- | --- |
| [Acquisition](/business/nouns/acquisition) | The first [Event](/business/nouns/event) from a [Visitor](/business/nouns/visitor) or a Prospect arrives | Nothing: it is written once and never edited |
| Prospect | Research finds a person or [Organization](/business/nouns/organization), held with a legal basis for contact | [`Prospect.engage`](/business/nouns/prospect/engage), on the first reply |
| Lead | A [Waitlist](/business/nouns/waitlist) join, a [Form](/business/nouns/form) or a reply raises a hand | [`Lead.convert`](/business/nouns/lead/convert), to a Deal or to checkout |
| Deal | A qualified Lead needs an assisted sale | [`Quote.accept`](/business/nouns/quote/accept) wins it; [`Deal.lose`](/business/nouns/deal/lose) ends it |
| Quote | The buyer asks for terms with [`Quote.request`](/business/nouns/quote/request) | [`Quote.accept`](/business/nouns/quote/accept), [`Quote.decline`](/business/nouns/quote/decline) or [`Quote.expire`](/business/nouns/quote/expire) |
| Order | A buyer accepts one-time lines or checks out | [`Order.pay`](/business/nouns/order/pay), then fulfillment |
| Subscription | A buyer accepts recurring lines or subscribes | [`Subscription.renew`](/business/nouns/subscription/renew), each period |
| Renewal | 90 days before a term Subscription ends | Its `outcome`, computed at the term end |

No state is set by hand. A Lead's `status` changes only when a Verb runs on it. Its `fit`, a Deal's `statusSince` and a Renewal's `outcome` are computed from Events.

Most buyers skip the middle. A self-serve buyer goes from Visitor or Lead straight to an Order or a Subscription. A Deal and a Quote exist only for an assisted sale.

## First touch is kept
An Acquisition records how a buyer first arrived: the referrer `kind`, the [Play](/business/nouns/play), where it ran, the [Campaign](/business/nouns/campaign), the first [Page](/business/nouns/page) and the [Keyword](/business/nouns/keyword). It is written on the first Event and never changes.

Each later record keeps it. A Lead is [acquired by](/business/nouns/lead#rel-acquired-by) the Acquisition of the [Visit](/business/nouns/visit) or Prospect it came from, and the [Customer](/business/nouns/customer) inherits the Lead's. [Organic share](/agents/marketing#organic-share), [Play-sourced Customers](/agents/marketing#play-sourced-customers) and every partner payout read this one row.

Answer engines often strip the referrer, so click data undercounts them. The [Startup](/business/nouns/startup) asks each new Customer how they heard, keeps the answer word for word in `reported`, and an [Agent](/business/nouns/agent) maps it to a Play.

```json
{
  "$type": "Acquisition",
  "kind": "answer",
  "play": "play_aeo",
  "venue": "chatgpt",
  "page": "page_pricing",
  "reported": "ChatGPT suggested you when I asked for shift scheduling that handles clinic overtime.",
  "at": "2026-10-02T14:11:00Z"
}
```

Multi-touch is a query, never a second record. Every Visit keeps its own arrival, and the [Analyst](/agents/marketing/analyst) reads first-touch, last-touch and any-touch views over the same rows.

## From Prospect to Deal
Outbound starts at a Prospect. The [Prospector](/agents/sales/prospector) reaches it through a [Sequence](/business/nouns/sequence), and the first reply runs [`Prospect.engage`](/business/nouns/prospect/engage): outreach stops, and a Lead opens with the Prospect's Acquisition.

Inbound starts at the Lead. A Waitlist join, a Form or a reply creates it with status `new`, and [`Lead.assign`](/business/nouns/lead/assign) gives it one owner [Worker](/business/nouns/worker). The Lead fit [Policy](/business/nouns/policy) grades it `strong`, `partial` or `none` against the [ICP](/business/nouns/icp).

A Lead that joined a Waitlist is never quoted; it waits until the [Offer](/business/nouns/offer) opens to it. Every other Lead ends with [`Lead.convert`](/business/nouns/lead/convert) and a `route`: `checkout` sends a self-serve buyer to buy alone, and `deal` opens a Deal.

```ts
import { $ } from 'startup-builder'

const deal = await $.Lead.convert({ lead: 'lead_7', offer: 'offer_team', route: 'deal' })
```

## Quotes
A buyer asks for terms with [`Quote.request`](/business/nouns/quote/request): the Offers, the volume and the term wanted. The requester is a [Contact](/business/nouns/contact), the [Sales Engineer](/agents/sales/sales-engineer) after a [Meeting](/business/nouns/meeting), or a buyer's Agent under its [Mandate](/business/nouns/mandate), recorded with `by` and `for`.

The request starts [Send a quote](/workflows/processes/quoting/send-quote), which supersedes any open Quote on the Deal. One Deal has one live Quote at a time.

A Quote prices each Offer on its own line: quantity, list [Price](/business/nouns/price), discount, net amount and term. The list Price never changes for one Customer. The discount lives on the line, and a ramp is one line per year.

A discount inside the discount [Limit](/business/nouns/limit) goes out at once, and one above it opens an [Approval](/business/nouns/approval). [`Quote.send`](/business/nouns/quote/send) freezes the lines, so a later change supersedes the Quote instead of editing it.

[`Quote.accept`](/business/nouns/quote/accept) is the one writer of the sale. Before `validUntil`, it turns one-time lines into an Order and recurring lines into a Subscription. Each line's discount and the payment terms carry over, and the Deal is won.

[`Quote.expire`](/business/nouns/quote/expire) closes a Quote that reaches `validUntil` unaccepted. An expired Quote never converts; the Sales Engineer sends a new one.

## Orders and Subscriptions
An Order buys once. It moves from `placed` to `paid`, `fulfilled` and `closed`, and a [Service](/business/nouns/service) Order passes through intake and delivery on the way.

A Subscription buys every period. It holds a `quantity`, such as 12 members, and a `termEndsAt` for a committed term. [`Subscription.resize`](/business/nouns/subscription/resize) changes the quantity and prorates, and [`Tenant.invite`](/business/nouns/tenant/invite) adds a member and a unit when none is free.

The self-serve path writes the same records with no Deal: [`Order.place`](/business/nouns/order/place) and [`Offer.subscribe`](/business/nouns/offer/subscribe) make the buyer a Customer at once. Stripe carries every charge, on the Startup's own connected account.

## Renewal
A term of a year or longer gets a Renewal. [`Renewal.open`](/business/nouns/renewal/open) opens it 90 days before `termEndsAt`, and the [Success Manager](/agents/customer/success-manager) first writes the usage review against each [Entitlement](/business/nouns/entitlement).

Usage that moved during the term drafts an expansion or right-size Quote, and the chain runs again from there. [Renewal notice](/workflows/processes/billing/renewal-notice) tells the Customer the date, the Price and a one-step cancel link inside the legal window.

Cancel never waits. The Customer sees one save offer that never blocks it, and the Renewal's `outcome` records `renewed`, `expanded`, `contracted` or `churned` at the term end.

## Back to the Play
Each [`Invoice.collected`](/business/events/Invoice.collected) walks back from the [Invoice](/business/nouns/invoice) to its Customer, to the Customer's Acquisition, and to the Play named there. The net revenue posts to that Play's ledger, beside its `spend` and `workerCost`.

Only outside revenue counts. A Customer who shares an owner, a [Studio](/business/nouns/studio) account or an [Agreement](/business/nouns/agreement) with the Startup adds nothing to any Play.

[Play payback](/agents/marketing#play-payback) reads the ledger. Each week, [`PlayMix.compile`](/business/nouns/play-mix/compile) moves the [Demand Budget](/business/nouns/demand-budget) toward the Plays that pay back fastest.

## Next
- [Selling](/systems/sales/selling): self-serve and assisted selling, and who sells.
- [Renewals](/systems/customer-service/renewals): the 90 days before a term ends.
- [Demand budgets](/workflows/marketing/demand-budgets#the-weekly-play-mix): how the [Play Mix](/business/nouns/play-mix) spends the budget each week.
- [Customers](/products/selling/customers): the people ladder from Visitor to Customer.