SCENARIOS / SC-019 / GTM SALES FUNNEL
SC-019 Sales / CRM Pipeline

GTM Sales Funnel

Opportunities through a B2B SaaS funnel, with capacity-capped reps and solutions engineers.

Async Tick FSM
PROSP QUAL DISC POC PROP WON RENEW CLOSED LOST REPS SOL. ENG
GTM Sales Funnel schematic
SC-019 / SCHEMATICSales / CRM Pipeline
Clock tick
Update Asynchronous
Funnel 6 stages + renewal
Rep cap 6 open deals
SE cap 3 active POCs
Regions NA / EMEA / APAC
OVERVIEW

A B2B SaaS pipeline from first touch to renewal. Accounts create opportunities that progress Prospecting → Qualification → Discovery → Technical Validation → Proposal → Closed Won/Lost, then a win lives on as a contract that comes up for renewal and either renews or churns. A sales rep is assigned by region as a first-match message the rep defers when at its open-deal cap; a qualified deal spawns a proof-of-concept that a capacity- capped solutions engineer must deliver before the deal can advance, so a failed POC kills the deal.

A faithful model of pipeline capacity. Reps and solutions engineers are deliberately thin against the seeded account base, so a qualification and POC backlog forms under load while bookings, win rate, and competitive outcomes accumulate per rep. Built to study funnel conversion, where deals stall, quota attainment, and the staffing mix between sellers and technical pre-sales.

TRAITS
Async
Independent, event-driven timelines
Tick
Discrete fixed-step time
FSM
Entities are finite-state machines
SCHEMA

Linked tables with guaranteed referential integrity.

TABLECOLUMNSDESCRIPTION
deal ID, segment, region, industry, lead_source, product, deal_value, competitor, poc_result, account_id, rep_id, current_state One row per opportunity: firmographics, the product and its ARR, the tracked competitor, POC outcome, and references to the account and assigned rep.
salesrep ID, region, quota, bookings, open_deals, deals_won, deals_lost, renewals, wins_vs[*], losses_vs[*], current_state One row per rep: region, quota and accumulated bookings, current open-deal load (capped), win/loss/renewal tallies, and per-competitor win/loss families.
solutionsengineer ID, region, active_pocs, pocs_delivered, pocs_won, current_state One row per SE: region, current POC load (capped), and lifetime delivered/won counts.
account ID, segment, region, industry, deals_created, deals_won, deals_lost, active_contracts, current_state One row per target company: firmographics and the running tally of created, won, lost deals and active contracts.
poc ID, region, segment, deal_id, engineer_id, current_state One row per proof-of-concept: inherited region/segment and references to its deal and the delivering engineer.
LIVE API

Generated REST endpoints. Also exposed as MCP tools.

POST /scenarios/gtm-sales-funnel/experiments Seed a new sales floor
POST /scenarios/gtm-sales-funnel/experiments/{eid}/run Advance N turns, or request an event
GET /scenarios/gtm-sales-funnel/experiments/{eid}/entities/deal Query deals by stage, segment or competitor
GET /scenarios/gtm-sales-funnel/experiments/{eid}/events Append-only event log
GET /scenarios/gtm-sales-funnel/experiments/{eid}/dataset Download the exported dataset
SEMANTIC LAYER

OSI-compatible definition, emitted with the dataset.

# gtm-sales-funnel.osi.yaml — emitted automatically
semantic_model:
  name: "gtm-sales-funnel"
  source: "duckdb://gtm-sales-funnel.db"
  entities:
    - name: deal
      primary_key: id
  dimensions:
    - name: state
      type: categorical
    - name: t
      type: time
  measures:
    - name: row_count
      agg: count
    - name: active
      agg: sum
      filter: "state = 'ACTIVE'"