Deal CRM Module

Manage the deal pipeline — create deals, track stages, connect to VDR rooms and transactions.

Data Models

ModelDescriptionKey Fields
DealA tracked investment opportunity in the pipelineid, name, stage, counterparty, asset_class, fund_account_id, organization_id
PipelineStageOrg-configurable pipeline stage (e.g. Sourcing, DD, Closing)id, key, label, color, position, is_terminal
ActivityImmutable audit log of deal eventsid, deal_id, type, note, created_at

Cross-Module Links

Field on DealLinks toHow to navigate
fund_account_idCFO → FundAccountGET /api/v1/fundos/cfo/accounts/{fund_account_id}
(no direct field)VDR → DealRoomFind Transaction where deal_id=X and linked_room_id IS NOT NULL
Note: A Deal does not have a direct room_id. The connection goes through Transaction.linked_room_id. Use GET /api/v1/fundos/transactions?deal_id=X to find the room.

Quickstart (3 steps)

Step 1 — Authenticate

export FUNDOS_API_KEY=vdr_your_key_here

Step 2 — Dry-run a deal (ephemeral=true, zero DB writes)

curl -X POST https://kela.com/api/v1/fundos/crm/deals?ephemeral=true \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Series B", "stage": "sourcing", "asset_class": "equity"}'

Step 3 — Create the deal for real

curl -X POST https://kela.com/api/v1/fundos/crm/deals \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Series B", "stage": "sourcing", "asset_class": "equity"}'

# → {"success": true, "data": {"id": 42, "name": "Acme Series B", "stage": "sourcing"}}

Webhook Events

EventTriggerPayload
deal.created New deal is persisted {"deal_id", "name", "stage"}
deal.stage_changed Deal moves to a new stage {"deal_id", "name", "old_stage", "new_stage"}
deal.closed Deal moves to a terminal stage (is_terminal=true) {"deal_id", "name", "stage"}

Endpoints

MethodPathDescriptionRequired Params
GET/api/v1/fundos/crm/dealsList all deals (filterable by ?stage=, ?search=)
GET/api/v1/fundos/crm/deals/{id}Get one deal with full detaildeal_id
POST/api/v1/fundos/crm/dealsCreate a deal. Add ?ephemeral=true for a dry run.name, stage
PATCH/api/v1/fundos/crm/deals/{id}Update deal fieldsdeal_id
GET/api/v1/fundos/crm/pipelineList pipeline stages for the org
GET/api/v1/fundos/crm/transactions?deal_id={id}Find transactions linked to a deal (use for room_id)deal_id

Error Codes

CodeHTTPHint
deal_not_found404Verify deal_id against GET /api/v1/fundos/crm/deals
invalid_stage400Stage key must come from GET /api/v1/fundos/crm/pipeline
deal_name_required400Include a 'name' field in your request body

→ Build your first FundOS app in 15 minutes  |  Module contract JSON  |  Changelog