LP CRM Module

Manage LP fundraising — create investors, track pipeline stages, log buying-intent signals, run IR campaigns, and draft outreach.

Data Models

ModelDescriptionKey Fields
LPInvestorAn LP investor in the fundraising pipelineid, name, entity_type, pipeline_stage, committed_capital, lp_room_id, organization_id
LPMeetingRecorded meeting with an LPid, lp_investor_id, meeting_date, subject, follow_up_questions
LPDevSignalBuying-intent signal (meeting request, doc view, etc.)id, lp_investor_id, signal_type, strength, source_label, auto_detected
LPOutreachOutreach attempt (email, LinkedIn)id, lp_investor_id, channel, subject, status, sent_at
IRCampaignBulk investor-relations email campaignid, name, status, subject, body, segment_id, sent_count, open_count

Pipeline Stages

identified → first_contact → under_nda → due_diligence → soft_circled → committed → closed → passed

Cross-Module Links

FieldLinks toHow to navigate
lp_room_idVDR → DealRoomGET /api/v1/rooms/{lp_room_id}
idInvestors → CapitalCallGET /api/v1/fundos/investors/{lp_id}/calls

Quickstart (3 steps)

Step 1 — Authenticate

export FUNDOS_API_KEY=vdr_your_key_here

Step 2 — Create an LP investor (dry run)

curl -X POST "https://kela.com/api/v1/fundos/lp-crm/investors?ephemeral=true" \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Tiger Global", "entity_type": "family_office", "pipeline_stage": "identified"}'

Step 3 — Create for real, then advance the stage

# Create
curl -X POST https://kela.com/api/v1/fundos/lp-crm/investors \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Tiger Global", "entity_type": "family_office"}'

# → {"success": true, "data": {"id": 7, "name": "Tiger Global", "pipeline_stage": "identified"}}

# Move to first_contact
curl -X POST https://kela.com/fundos/lp-crm/7/move-stage \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stage": "first_contact"}'

Webhook Events

EventTriggerPayload
lp.created New LPInvestor persisted {"lp_id", "name", "stage"}
lp.stage_moved LP pipeline stage changes {"lp_id", "name", "old_stage", "new_stage"}
lp.signal_logged Buying-intent signal recorded {"lp_id", "name", "signal_type", "source"}

Endpoints

MethodPathDescriptionRequired Params
GET/api/v1/fundos/lp-crm/investorsList LPs (?search=, ?stage=)
GET/api/v1/fundos/lp-crm/investors/{id}Get LP detaillp_id
POST/api/v1/fundos/lp-crm/investorsCreate LP. Add ?ephemeral=true for dry run.name
PATCH/api/v1/fundos/lp-crm/investors/{id}Update LP fieldslp_id
POST/fundos/lp-crm/{id}/move-stageMove to pipeline stagestage
POST/fundos/lp-crm/{id}/log-signalLog buying-intent signalsignal_type
POST/fundos/lp-crm/{id}/draft-outreachAI-draft email or LinkedIn messagechannel

Error Codes

CodeHTTPHint
lp_not_found404Verify lp_id against GET /api/v1/fundos/lp-crm/investors
lp_name_required400Include a 'name' field in your request body
lp_duplicate_name409An LP with this name already exists in your org
invalid_lp_stage400Stage must be one of: identified, first_contact, under_nda, due_diligence, soft_circled, committed, closed, passed

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