Opportunities

Active sales deals — the heart of the pipeline, with 7 stages, line items and discount approvals.

Opportunities

An opportunity is an active deal — a potential revenue event with a known account, amount, close date and stage. This is the record sales reps work on every day.

The 7 sales stages

Every opportunity moves through these stages. The system tracks where you are and updates the win probability automatically.

StageDefault win probabilityWhen you're in this stage
Prospecting10%First contact, qualifying budget and need
🟠 Qualification25%You've identified the decision-maker
🟡 Needs Analysis40%Requirements have been documented
🔵 Proposal60%Quote has been sent
🟣 Negotiation80%Pricing and terms are being negotiated
🟢 Closed Won100%Deal won (final stage)
🔴 Closed Lost0%Deal lost (final stage)

You can move from any open stage directly to Closed Lost (deals can be lost at any point), but you can't skip forward — you have to walk through the funnel one stage at a time. The system blocks invalid jumps to keep your forecast honest.

Closing a deal — the reason is required

Closing an opportunity takes one extra field, and the system will not save the record without it:

Closing asYou must pick
🟢 Closed WonWin Reason — Better Product, Better Price, Existing Relationship, Better Support, Best Fit / Features, or Other
🔴 Closed LostLoss Reason — Price Too High, Lost to Competitor, No Budget, No Decision, Bad Timing, Missing Features, or Other

Win/Loss Details is the free-text box next to it — use it for the sentence a teammate would actually need six months later ("marketing is locked into a 2-year HubSpot contract, revisit at renewal").

Two things to know:

  • This is checked on the server, not just in the form. An import, an API call or a bulk update that closes a deal without the applicable reason is rejected the same way a rep's form is.
  • Closed deals are locked. Once a deal is closed, only the narrative fields (description, next steps) stay editable — so the reason cannot be filled in afterwards. Pick it when you close.

If the deal closes because the customer accepted a quote, HotCRM closes it for you and records the win reason as Quote Accepted — see Quotes.

Those two fields are what the Sales dashboard's win rate and Why We Lose widgets are built from; see Dashboards.

What an opportunity record stores

The detail screen has 7 sections:

SectionFields
Basic InformationName, account, primary contact, owner
FinancialsAmount, expected revenue (auto), probability (auto from stage)
Sales ProcessStage, close date, created date, stage entry date
ClassificationType (New Business / Upgrade / Renewal / Expansion), lead source, win reason, loss reason, win/loss details
CampaignsSource campaign
Notes & Next StepsDescription, next steps
Forecast & MetricsLine item totals, approval status

Opportunity types

TypeWhat it means
New BusinessA brand-new logo / customer
Existing - UpgradeExisting customer moving up tiers
Existing - RenewalExisting contract renewing
Existing - ExpansionExisting customer adding new product lines

Splitting deals by type is essential for accurate revenue forecasting — new business and renewals have very different win rates.

What happens automatically

You don't have to remember any of this — the system does it for you:

  • Probability is set from the stage whenever you move the deal (you can override it manually if you have a special situation, but it'll reset next time the stage changes).
  • Expected revenue = amount × probability ÷ 100, recalculated whenever amount or probability changes.
  • Stage entry date is stamped the moment a deal is created and re-stamped every time you move it to a new stage. Days in current stage counts from it, so it is always up to date — that is what surfaces stagnant deals.
  • When you mark a deal Closed Won and the amount is $100K or more, sales management gets an email.
  • When the amount exceeds $500K, the deal enters the Discount Approval process automatically.

Line items — what's actually being sold

Each opportunity can have line items — one per product being sold. Each line stores:

  • The product (from the catalog)
  • Quantity
  • Unit price (defaults to the product's list price, can be overridden)
  • Discount %
  • Line total

The sum of all line items rolls up into the opportunity Amount. If you'd rather just type the amount manually without configuring line items, you can — both work.

Discount approval for high-value deals

If a deal's amount goes over $500,000, the opportunity is automatically routed for approval:

  1. The opportunity is locked — nobody can edit it.
  2. Sales Manager reviews first.
  3. If approved, Sales Director signs off.
  4. On final approval, the stage is automatically set to Closed Won.
  5. If rejected at any step, the deal is returned to the rep to re-justify.

The approval status is shown as a banner at the top of the opportunity detail screen. See Revenue › Approvals for the full process.

Sharing — who can see which deal

By default opportunities are private — only the owner. Positions are flat and nothing rolls up, so no one sees a deal by sitting above its owner in an org chart; every other reader is named by one of the rules below.

On top of that:

  • Open opportunities of $100K or more are shared read-only with the sales_director position — and, because nothing rolls up, a second rule shares the same deals with executive. This way leadership sees the big deals without having to follow up.
  • High-value deals in approval are visible to the approvers regardless of ownership.

Standard list views

Opportunities opens on Open Deals, and the switcher along the top of the list carries nine saved views — these, and nothing else:

ViewWhat it shows
Open Deals (the landing view)Every deal that is not Closed Won or Closed Lost, soonest close date first, with rows tinted by stage. Amount and Expected Revenue carry column totals.
My Open DealsThe same open-deal filter, narrowed to the deals you own.
Sales PipelineThe kanban board — one column per stage, open deals only, drag a card to move the deal. Also reachable from Pipeline in the sidebar.
All OpportunitiesThe unfiltered book including closed business, latest close date first. Where win/loss reviews and audits start.
Forecast CalendarEvery deal placed on a month calendar by its close date, coloured by stage.
Deal TimelineOne bar per deal, from the day it was created to its close date, grouped by owner on a month scale.
Deal CardsGallery cards — account, amount, stage, probability, close date, owner — for pipeline and executive reviews.
⚠️ Stale Opportunities · Longest in Stage FirstOpen deals ordered by how long they have sat in their current stage, longest first. Nothing is cut off by age — Days in Current Stage is a column, so you read the wait off the row. The daily Stalled Deal Alert is what acts on it, nudging the owner once a deal passes 14 days in one stage.
Closing This QuarterOpen Commit and Best Case deals whose close date falls inside the current quarter — see below.

Closing This Quarter

This is the view a sales manager works at quarter-end, and it is scoped on three things at once:

  • Forecast category — only Commit and Best Case deals.
  • Still open — Closed Won and Closed Lost never appear.
  • Close date inside the current quarter — both ends of the quarter are computed each time the list runs, so it rolls into the new quarter by itself and never needs re-saving.

That third filter is what makes the name true: summing the Amount column gives you this quarter's commit, not the total of every open deal that will one day close. A deal slated for next March is not here — it waits on Open Deals until its quarter comes round. Rows are ordered by close date, soonest first.

An empty list here is an answer, not a broken view. When nothing matches, the view says so in place of the grid — No Deals Closing This Quarter, with a pointer back to Open Deals — because a quarter whose commit has slipped out entirely is exactly the state a manager needs to see. A freshly seeded demo org meets the same screen in the closing days of a quarter, when every sample deal lands in the next one.

The opportunity detail layout

When you open an opportunity, you'll see:

  • Header — name, stage badge with the 7-stage path, amount, close date, owner. Click any stage on the path to jump directly to it.
  • Sales Path — one-click stage progression.
  • Quote related list — with a Generate Quote button that runs the Quote Generation flow.
  • Line Items — with an Add Product button.
  • Activity timeline — a unified feed of comments, logged calls (sys_activity), outbound emails (sys_email), task completions, and field-history audit entries. Every tracked change on the opportunity (stage, amount, close-date, owner) shows up here automatically; there is no separate "history" tab.
  • Competitors & Notes — there is no such panel. The page (src/pages/opportunity_detail.page.ts) declares three regions: a header, the main column carrying the tab strip, and one narrow side column (aside) whose only occupant is the reference rail described below. Nothing on the page renders talking points, and there is no competitors field left to render either: the opportunity's Competitors multi-select offered three placeholder options (Competitor A, Competitor B, Competitor C), no screen in the app ever read the value back, and #1061 retired it. The only competitor signal the app records is the Lost to Competitor closed-lost reason, with the free-text Loss Details beside it. The closest thing to notes on the page itself is the Details tab's collapsible Description section, which carries Description and Next Steps.
  • AI Reference Rail — the rail is real, but there is not one suggestion in it, and no component on this page is AI-driven. It is a record:reference_rail in that side column, and each of its three cards is a snapshot of records already linked to this deal: crm_quote through its Opportunity lookup, this deal's crm_opportunity_line_item rows, and crm_task through Related Opportunity. A card carries the total related count as a badge, at most three records, and a View all link into the full list; cards that come back empty fold into a single + N empty chip. Each card is headed by its object's label in the language you are reading the app in — Quote, Opportunity Line Item and Task in English — because the rail entries declare no heading of their own; the heading is looked up in the translation bundle, the same place the rest of the app gets an object's name. Two caveats. A rail entry cannot filter, and none of these declares one: the rail queries on the relationship alone, so the task card counts and lists this deal's tasks whatever their status. That is exactly why the card is headed Task rather than Open Tasks — the view that really filters to not-Completed, ten at a time, is Open Tasks on the Related tab. And there is no Customer 360, no revenue forecast and no "related signal" in the rail or anywhere else on this page: those skills are reached by asking — see How the AI Copilot helps below.

How the AI Copilot helps

When you open an opportunity, ask:

  • "What's at risk here?" — Revenue Forecasting skill examines stage age, activity gaps and close-date slippage.
  • "Draft a follow-up email" — Email Drafting skill writes the next outbound message.
  • "Summarise this account" — Customer 360 skill gives you a one-screen briefing on the account history.

Tips for sales reps

  • Move stages promptly — the probability is wrong if your stage is wrong.
  • Add line items for proper revenue forecasting; the rolled-up amount is more accurate.
  • Fill in Next Steps — it's the single most useful field for handoffs and standups.
  • Record why you won or lost at close time — Win Reason, Loss Reason and Loss Details are the only competitive data the app keeps, and they only exist if you fill them in.
  • ❌ Don't push the close date out to keep a deal looking on track. An honest date is what makes Closing This Quarter add up — and a deal that has stopped moving surfaces on Stale Opportunities by its time in stage, whatever its close date says.

Tips for admins

  • The stage list, the default probabilities and the legal transitions live in three places in the source, not on a Setup screen: the shared OPPORTUNITY_STAGE_OPTIONS picklist (src/objects/_picklists.ts), which the stage field renders; the STAGE_PROBABILITY map inside the opportunity_lifecycle hook (src/objects/opportunity.hook.ts), which re-syncs Probability on every save; and the opportunity_stage_progression state-machine validation rule on the opportunity object (src/objects/opportunity.object.ts). Change the three in lockstep. See Customization › Extending Objects.
  • The $500K discount approval threshold can be changed in the approval process configuration.
  • The $100K large-deal notification threshold is not a Setup field either: it is the CEL start condition of the opportunity_won_alert flow — record.amount >= 100000 in src/flows/opportunity-won-alert.flow.ts. Who gets the alert is that flow's notify node, whose recipients list is the single entry {record.owner_id} — the deal owner alone.

On this page