[object Object]

A deal stage represents progress toward close. A property represents an attribute. Teams routinely conflate them, ending up with stages like “Pricing Sent - Healthcare - Renewal.” Now your pipeline report has 47 stages and means nothing. Here’s the discipline.

Stages model the buying journey

A stage answers “where in the deal process are we?” Discovery, Demo Scheduled, Proposal Sent, Negotiation, Closed. Five to seven stages per pipeline. Each represents a meaningful conversion gate.

If you can’t draw a diagram of how a deal flows from stage to stage in 30 seconds, your stages are wrong.

Properties model attributes

A property answers “what is this deal?” Industry, deal type (new vs renewal vs expansion), product line, source channel. These don’t represent progress; they represent type. Use properties.

The test: would you ever skip from A to C?

If a deal can legitimately skip from “Discovery” to “Negotiation” without “Demo Scheduled,” then “Demo Scheduled” isn’t a real stage; it’s a milestone. Track it as a property demo_scheduled = true.

Use multiple pipelines for genuinely different motions

New business deals and renewals are different motions with different stages. Don’t model them in one pipeline with branching paths. Spin up a New Business pipeline and a Renewal pipeline. Each gets its own clean stage set.

Stop using stage to encode lost reason

A stage like “Closed Lost - No Budget” pollutes the funnel. The stage is Closed Lost. The reason is a property closed_lost_reason = no_budget. Reports filter cleanly when you separate them.

The seven properties every deal needs

Beyond the standards, every B2B deal record should have:

deal_type: new | renewal | expansion | reactivation
source_channel: inbound | outbound | partner | event
buying_committee_size: number
primary_competitor: text
expected_decision_date: date
business_driver: text (one sentence)
risk_factor: text (one sentence)

These power the reports stages can’t.

Calculated property: stage age

Every deal needs days_in_current_stage (calculated, see calculated properties patterns). Without it, you can’t measure stage velocity. Stages are the structure; the calculated property is the diagnostic.

Don’t add a stage to track “lost contact”

Reps want a stage for “lead went cold.” That’s a property: engagement_status = cold driven by last_engagement_date > 30 days ago. Adding a stage corrupts your funnel math; adding a property gives you a queue to revive from.

Audit quarterly

Run the stage distribution report. Any stage with under 3% of deals should be questioned. Any stage with over 40% is a bottleneck or your stages are too coarse.

What to do this week

List your current deal stages. Mark any that are encoding type, reason, or status rather than progress. Migrate those to properties. Re-baseline pipeline reports after the cleanup.

[object Object]
Share