Skip to content

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, Lead, Deal, Quote, Order or Subscription, Renewal. A Verb moves each step, so every state is the result of an Action that ran.

The chain

RecordStarts whenMoves on by
AcquisitionThe first Event from a Visitor or a Prospect arrivesNothing: it is written once and never edited
ProspectResearch finds a person or Organization, held with a legal basis for contactProspect.engage, on the first reply
LeadA Waitlist join, a Form or a reply raises a handLead.convert, to a Deal or to checkout
DealA qualified Lead needs an assisted saleQuote.accept wins it; Deal.lose ends it
QuoteThe buyer asks for terms with Quote.requestQuote.accept, Quote.decline or Quote.expire
OrderA buyer accepts one-time lines or checks outOrder.pay, then fulfillment
SubscriptionA buyer accepts recurring lines or subscribesSubscription.renew, each period
Renewal90 days before a term Subscription endsIts 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, where it ran, the Campaign, the first Page and the Keyword. It is written on the first Event and never changes.

Each later record keeps it. A Lead is acquired by the Acquisition of the Visit or Prospect it came from, and the Customer inherits the Lead's. Organic share, Play-sourced Customers and every partner payout read this one row.

Answer engines often strip the referrer, so click data undercounts them. The Startup asks each new Customer how they heard, keeps the answer word for word in reported, and an 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 reads first-touch, last-touch and any-touch views over the same rows.

From Prospect to Deal

Outbound starts at a Prospect. The Prospector reaches it through a Sequence, and the first reply runs 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 gives it one owner Worker. The Lead fit Policy grades it strong, partial or none against the ICP.

A Lead that joined a Waitlist is never quoted; it waits until the Offer opens to it. Every other Lead ends with Lead.convert and a route: checkout sends a self-serve buyer to buy alone, and deal opens a Deal.

TypeScript
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: the Offers, the volume and the term wanted. The requester is a Contact, the Sales Engineer after a Meeting, or a buyer's Agent under its Mandate, recorded with by and for.

The request starts Send a 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, 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 goes out at once, and one above it opens an Approval. Quote.send freezes the lines, so a later change supersedes the Quote instead of editing it.

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 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 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 changes the quantity and prorates, and 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 and 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 opens it 90 days before termEndsAt, and the Success Manager first writes the usage review against each Entitlement.

Usage that moved during the term drafts an expansion or right-size Quote, and the chain runs again from there. 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 walks back from the 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 account or an Agreement with the Startup adds nothing to any Play.

Play payback reads the ledger. Each week, PlayMix.compile moves the Demand Budget toward the Plays that pay back fastest.

Next