🖥️ Building an internal deal portal
Once deals are in our CRM, the team needs a way to browse, search, triage, and discuss them. Pipedrive is fine for individual deal management, but it’s not great for getting a bird’s-eye view of the pipeline or for collaborative decision-making. So I built SIA (Strategic Investment Automation) — an internal web portal for the fund.
What it does
SIA is a Flask app that serves as a unified interface for our deal pipeline. It pulls deal data from Pipedrive via ETL, enriches it with AI-powered search capabilities, and provides features that Pipedrive doesn’t have natively:
Semantic search
This is probably the most useful feature. We have hundreds of deals in the pipeline, and finding relevant ones by keyword search is painful. SIA uses OpenAI’s embedding model (text-embedding-3-small) to create vector representations of each deal — combining the title, pitch, sector, source, region, and notes into a single embedding.
When you search, it computes cosine similarity between your query embedding and all deal embeddings using a pre-normalised numpy matrix dot product. This means searching for “carbon capture” also surfaces deals about “direct air capture” or “CO2 sequestration” even if those exact words aren’t used.
There’s also a hybrid mode that blends semantic search (70%) with RapidFuzz fuzzy string matching (30%) for cases where you know the exact company name but might have the spelling slightly wrong.
Deal voting
We built a “Tinder-style” voting system for triaging top-of-funnel deals. Each internal investor swipes through new deals, voting to pass or progress. When everyone has voted:
- 50%+ rejections automatically marks the deal as Lost in Pipedrive
- Otherwise, the deal moves to the “Interesting” stage
This closes the loop between internal triage and CRM state — no one has to manually update Pipedrive after a vote.
Deal submission
Users can submit deals via free-form text, which gets sent to the vc-deal-ops microservice for AI parsing. There’s also a deck upload flow that creates a deal and triggers automatic analysis.
LP access
Limited partners (our investors) get their own restricted views of the portfolio, with role-based access control. We have five roles: admin, internal, internal investor, LP gold, and LP basic — each seeing different amounts of data.
Architecture
The app uses an interesting two-database design:
- deals.db is ephemeral — rebuilt from scratch on every ETL sync from Pipedrive. This keeps the data fresh and means we never have sync conflicts.
- users.db is persistent — stores user accounts, filter presets, voting sessions, and preferences. Mounted as a Docker volume on Render.
Auth uses 6-character alphanumeric tokens (SHA256 hashed) rather than passwords — practical for an internal tool where an admin can just issue and reset tokens.
Tech: Python (Flask), SQLite, OpenAI API, Pipedrive API, NumPy, Chart.js, deployed on Render with Docker.