maiven gateway · online··
manifest · 1d ago
Sign in
Back to catalog
MAIVENmodelmarts

mart_proposal_outcomes

beta
mart table

Win/loss outcome and economics of every submitted proposal.

Definition

One row per submitted proposal (grain `proposal_id`), sourced from `int_rfx__proposal_economics`. Each row carries the deal's `segment` (off the account), `region` and `rfx_type` (off the opportunity); the `outcome` (`won` / `lost` / `pending` / `withdrawn`) and the derived `is_won = (outcome = 'won')`; the `total_price` / `total_cost` / `margin_pct` trio ((price − cost) / price · 100); the decision `cycle_time_days` (`decision_date − submitted_date`); and both the `submitted_date` and `decision_date`. `decision_date` and `cycle_time_days` are Nullable and NULL while a proposal is still `pending`. This is the per-entity outcomes table that the `proposal_win_rate` and `proposal_economics` metrics aggregate over — prefer those metrics for grouped counts/rates; read rows here when you need to inspect or rank individual proposals.

Watch out for
  • highTreating pending proposals as losses in a win-rate calc

    `outcome` includes `pending` and `withdrawn`, not just won/lost. Computing win rate as won / total rows understates the rate by counting undecided deals in the denominator. Restrict to `outcome IN ('won','lost')` (what the `proposal_win_rate` metric's decided_count does) before dividing.

  • mediumAggregating cycle_time_days without filtering pending rows

    `decision_date` and `cycle_time_days` are NULL while a proposal is `pending`. avg() skips NULLs (fine), but a COUNT over cycle_time_days or a naive coalesce-to-0 silently includes / zero-fills undecided deals and biases the average down.

  • mediumSumming total_price across all rows as "pipeline value"

    This table is submitted proposals (which can be lost or pending), not the open pipeline. For pipeline sizing use `mart_rfx_pipeline` / the `rfx_pipeline` metric. Here, summing `total_price` over `is_won = 1` gives won bookings, not pipeline.

Questions this answers
  • “What is the win rate for enterprise RFPs in EMEA?”
  • “Which won proposals had the longest decision cycle time?”
  • “What is the average margin on lost deals by segment?”
15 of 15
Column
Type
Description
Tests · PII
proposal_id
String
From `int_rfx__proposal_economics.proposal_id`. Primary key — grain of this mart.
rfx_id
Nullable(String)
From `int_rfx__proposal_economics.rfx_id`. FK to the parent opportunity (`mart_rfx_pipeline` / `stg_gcs__rfx_opportunities`).
account_id
Nullable(String)
The buying account behind this proposal's opportunity, chained proposal → opportunity → account upstream. FK for an exact join to the `procurement_account` row-detail concept (`mart_procurement_accounts`). Not PII (a company). LEFT-joined, so NULL if the opportunity is missing.
lead_author_sme_id
Nullable(String)
The lead-author SME's id. FK for an exact join to the `subject_matter_expert` row-detail concept (`mart_sme_coverage`). Pseudonymous surrogate — NOT PII-tagged; the author's name/email are never projected here (they stay on stg_gcs__rfx_sme_directory, masked for AI personas). Enables row-level author attribution of deal outcomes.
segment
String
The account's sales segment (enterprise / mid / smb), chained from the opportunity's account. Coalesced to `'unknown'` upstream.
region
String
The opportunity's region (`NA` / `EMEA` / `APAC` / `LATAM`). Coalesced to `'unknown'` upstream.
rfx_type
String
The opportunity's type (`RFP` / `RFQ` / `RFI`). Coalesced to `'unknown'` upstream.
outcome
Nullable(String)
Proposal outcome: `won` / `lost` / `pending` / `withdrawn`. From staging.
2 tests
is_won
Nullable(UInt8)
Derived — `outcome = 'won'`. Convenience flag so win-rate rollups share one definition across marts/metrics.
total_price
Nullable(Decimal(14, 2))
Quoted proposal price, Decimal(14,2). From staging.
total_cost
Nullable(Decimal(14, 2))
Estimated delivery cost, Decimal(14,2). From staging.
margin_pct
Nullable(Decimal(6, 2))
(price − cost) / price · 100, Decimal(6,2). From staging.
cycle_time_days
Nullable(UInt16)
Derived `decision_date − submitted_date`, Nullable(UInt16) — NULL while the proposal is `pending`. From staging.
submitted_date
Nullable(Date)
Date the proposal was submitted. From staging.
decision_date
Nullable(Date)
Date the buyer decided. Nullable(Date) — NULL while the proposal is `pending`. From staging.