# Deal

One proposal, its offer, negotiated value and commercial outcome.

A Deal is one proposal to one client, and since 2026-11-04 it is also where a lead lives: a new lead is a Deal at stage Lead. The client is Company° and/or People°. Product* selects an Offer from Offer (mirror), not a Product record. Offer (Price) is the catalog price; Value* is the negotiated amount and can differ.

## Rules and relationships

Link the client in Company°, People° or both, then choose the accountable company and a membership in it. Lead, Contacted, Meeting Scheduled, Pitched, Proposal Sent and Negotiation remain open; Won, Lost and Abandoned close the deal. A disqualified lead is Lost, with the reason in Notes°. Blank stage also produces Open in Deal Status. Product*, Value* and Expected Close Date* are required only at Proposal Sent, Negotiation and Won; a lead needs only the client, the accountable pair and the stage. Source° records how the lead reached us. Closing does not create an agreement or invoice.

The Relationship rows were migrated to Deals on 2026-11-04: 476 Deals were created and 3 existing ones updated. Each migrated Deal carries the tag relationship-cleanup and, in Legacy Relationship ID, the coreId of the Relationship it came from. The Cal.com booking flow creates a Deal at Meeting Scheduled, or moves the person's open Deal with the same seller from Lead or Contacted to Meeting Scheduled. The Relationship table was deleted the same day, together with the Deal fields that pointed to it (Relationship*, its lookups and Attribution Relationship Count).

Expected Close Date* is a forecast, not proof of acceptance. Campaign° links the Core campaign the lead came from, through the Campaign mirror; leave it empty for a lead that came from no campaign. Results per campaign are the Deals linked to it, listed in Deals (Campaign) on the Campaign mirror, and each Interaction of the Deal shows the same campaign in its Campaign lookup. The Campaign Participation table and its Deal fields (Campaign Participation°, the Campaign lookup, Participation Relationship UUID, Participation Key, Participation Duplicates, Participation Count and Campaign Attribution Check) were deleted on 2026-11-04. The Cal.com flow does not set Campaign°. There is no line-item table, contract generation or verified payment flow in this scope. Currency formatting uses $; the amount alone does not normalize currencies or billing units.

## Fields

| Field | Storage | Current configuration |
| --- | --- | --- |
| Name | Formula | Calculated; see rules below. |
| Product* | Linked records | [Offer (mirror)](/systems/crm/entity-offer); Multiple-record picker |
| Offer (Price) | Lookup | Via Product* → Price* |
| Value* | Currency | $ |
| Notes° | Long text | Stored value or system-managed audit; edit according to the workflow. |
| Deal # | Sequence number | Stored value or system-managed audit; edit according to the workflow. |
| Accountable (Person)* | Linked records | [People](/systems/crm/entity-people); Multiple-record picker |
| Deal Stage* | Single choice | Lead, Contacted, Meeting Scheduled, Pitched, Proposal Sent, Negotiation, Won, Lost, Abandoned |
| Expected Close Date* | Date | Stored value or system-managed audit; edit according to the workflow. |
| Deal Status | Formula | Calculated; see rules below. |
| Intake Step | Formula | Calculated; see rules below. |
| Deal Check | Formula | Calculated; see rules below. |
| Offer (Item) | Lookup | Via Product* → Item (Name) |
| Offer (Unit) | Lookup | Via Product* → Unit* |
| Auth User | Lookup | Via Accountable (Person)* → Account Binding |
| Interactions | Linked records | [Interaction](/systems/crm/entity-interaction); Multiple-record picker |
| Accountable (Company)* | Linked records | [Companies](/systems/crm/entity-companies); Multiple-record picker |
| Accountable (Person Companies) | Lookup | Via Accountable (Person)* → Companies |
| Owner Email | Lookup | Via Accountable (Person)* → Company Email (from Memberships) |
| Created By | Created by | Stored value or system-managed audit; edit according to the workflow. |
| Created At | Creation time | Stored value or system-managed audit; edit according to the workflow. |
| Record health | Formula | Calculated; see rules below. |
| Health check | Formula | Calculated; see rules below. |
| Contact Email | Lookup | Via People° → Email |
| Open send mail link | Button | Opens Gmail in compose with Contact Email as recipient |
| Accountable (Membership)* - to delete (deprecated) | Linked records | [Membership (mirror)](/systems/crm/entity-membership); Deprecated since 2026-11-06; read-only until deleted, replaced by Accountable (Person)* |
| Accountable (Person) lookup - to delete (deprecated) | Lookup | Via Accountable (Membership)* → Member; Deprecated since 2026-11-06; read-only until deleted |
| Auth User (Membership) - to delete (deprecated) | Lookup | Via Accountable (Membership)* → Auth User; Deprecated since 2026-11-06; read-only until deleted |
| Owner Email (Membership) - to delete (deprecated) | Lookup | Via Accountable (Membership)* → Company Email; Deprecated since 2026-11-06; read-only until deleted |
| Accountable (Business Unit) - to delete (deprecated) | Lookup | Via Accountable (Membership)* → Business Unit; Deprecated since 2026-11-06; read-only until deleted, replaced by Accountable (Person Companies) |
| Team (Accountable&lt;membership&gt;) - to delete (deprecated) | Lookup | Via Accountable (Membership)* → Teams; Deprecated since 2026-11-06; read-only until deleted |
| Tags | Linked records | [Tags](/systems/crm/entity-tags); Multiple-record picker |
| Notes | Linked records | Notes table; Multiple-record picker |
| Tasks | Linked records | [Tasks](/systems/crm/entity-task); Multiple-record picker |
| Company° | Linked records | [Companies](/systems/crm/entity-companies); Multiple-record picker. The client company; leave empty when the lead is a person with no company yet |
| People° | Linked records | [People](/systems/crm/entity-people); Multiple-record picker. The main contact |
| Source° | Single choice | Referral, Networking Event, Inbound, Cold Outreach, Existing Relationship |
| Campaign° | Linked records | [Campaign](/systems/crm/entity-campaign); Multiple-record picker. Links the campaign this lead came from, for example an event or a landing page. Pick one campaign when the lead belongs to one; leave it empty otherwise. A missing campaign is created in Core, not here |
| Legacy Relationship ID | Single line text | coreId of the Relationship this Deal was migrated from on 2026-11-04; empty on Deals created later. Do not edit |

## Calculated rules

The expressions below use field names for readability. View filters and checks guide work; they are not access controls. Name reads Company° and People°, and falls back to "No client". Intake Step is blank on a closed Deal; Deal - 1 has no client, Deal - 2 lacks the accountable pair, Deal - 3 is at Proposal Sent or Negotiation without Product*, Value* or Expected Close Date*, and Deal - 4 is complete. Deal Check warns only about an accountable mismatch, and a passed expected close date on an open Deal.

### Name

```text
IF(AND({Company°}, {People°}), ARRAYJOIN({Company°}, ", ") & " - " & ARRAYJOIN({People°}, ", "), IF({Company°}, ARRAYJOIN({Company°}, ", "), IF({People°}, ARRAYJOIN({People°}, ", "), "No client"))) & IF(ARRAYJOIN({Offer (Item)}) != "", " - " & ARRAYJOIN({Offer (Item)}), "") & " - #" & {Deal #}
```

### Deal Status

```text
SWITCH({Deal Stage*}, "Won", "Won", "Lost", "Lost", "Abandoned", "Abandoned", "Open")
```

### Intake Step

```text
IF({Deal Status} != "Open", "",
IF(AND({Company°} = BLANK(), {People°} = BLANK()), "Deal - 1",
IF(OR({Accountable (Company)*} = BLANK(), {Accountable (Person)*} = BLANK()), "Deal - 2",
IF(AND(OR({Deal Stage*} = "Proposal Sent", {Deal Stage*} = "Negotiation"), OR({Product*} = BLANK(), {Value*} = BLANK(), {Expected Close Date*} = BLANK())), "Deal - 3",
"Deal - 4"))))
```

### Deal Check

```text
IF(AND({Accountable (Company)*}, {Accountable (Person)*}, FIND(ARRAYJOIN({Accountable (Company)*}), ARRAYJOIN({Accountable (Person Companies)}, ", ")) = 0), "⚠ Accountable person has no membership in the accountable company. ", "") &
IF(AND({Deal Status} = "Open", {Expected Close Date*}, IS_BEFORE({Expected Close Date*}, TODAY())), "⚠ Expected close date has passed; update it or close the deal. ", "")
```

### Record health

```text
SUM(
IF(OR(COUNTA({Company°})>0, COUNTA({People°})>0),1,0),
IF(COUNTA({Accountable (Company)*})>0,1,0),
IF(COUNTA({Accountable (Person)*})>0,1,0),
IF({Deal Stage*},1,0),
IF(OR({Value*}, NOT(OR({Deal Stage*}="Proposal Sent", {Deal Stage*}="Negotiation", {Deal Stage*}="Won"))),1,0),
IF(OR(COUNTA({Product*})>0, NOT(OR({Deal Stage*}="Proposal Sent", {Deal Stage*}="Negotiation", {Deal Stage*}="Won"))),1,0),
IF(OR({Expected Close Date*}, NOT(OR({Deal Stage*}="Proposal Sent", {Deal Stage*}="Negotiation", {Deal Stage*}="Won"))),1,0)
)/7
```

### Health check

```text
IF(
  AND(
    OR(COUNTA({Company°})>0, COUNTA({People°})>0),
    COUNTA({Accountable (Company)*})>0,
    COUNTA({Accountable (Person)*})>0,
    {Deal Stage*},
    OR(NOT(OR({Deal Stage*}="Proposal Sent", {Deal Stage*}="Negotiation", {Deal Stage*}="Won")), AND({Value*}, COUNTA({Product*})>0, {Expected Close Date*}))
  ),
  "✅",
  "Missing: " & REGEX_REPLACE(
    CONCATENATE(
      IF(OR(COUNTA({Company°})>0, COUNTA({People°})>0), "", "Company or People, "),
      IF(COUNTA({Accountable (Company)*})>0, "", "Accountable (Company), "),
      IF(COUNTA({Accountable (Person)*})>0, "", "Accountable (Person), "),
      IF({Deal Stage*}, "", "Deal Stage, "),
      IF(OR({Deal Stage*}="Proposal Sent", {Deal Stage*}="Negotiation", {Deal Stage*}="Won"),
        IF({Value*}, "", "Value, ") & IF(COUNTA({Product*})>0, "", "Product, ") & IF({Expected Close Date*}, "", "Expected Close Date, "), "")
    ),
    ", $", ""
  )
)
```

## Next steps

[Open the task guide](/systems/crm/manage-deals) · [Find the view](/systems/crm/data-views)