🖥️ 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:

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.