Lead/Client Pipeline Tracker Development by Randy JohnsonLead/Client Pipeline Tracker Development by Randy Johnson

Lead/Client Pipeline Tracker Development

Randy Johnson

Randy Johnson

Pipeline Tracker

A small, self-contained lead/client pipeline tracker for freelancers and small businesses. Kanban board, activity history, and three suggest-and- confirm automations — nothing fires without you clicking to approve it.
Live demo → — seeded with fictional sample leads, resets periodically. The AI automations are live.

Features

Kanban board — leads move through Contacted → Proposal Sent → Contract Signed → Invoiced → Paid, with a pipeline-value summary strip.
Stale-lead flagging — any lead untouched for 7+ days (configurable) is visually flagged. Pure date math, no LLM involved.
LLM-drafted follow-ups — one click drafts a nudge message grounded in the lead's notes and history. Nothing is ever sent automatically — it's text you copy, edit, or discard yourself.
Stage-move suggestions — when you log an update, the same LLM checks whether it signals a stage change (e.g. "sent the contract") and proposes moving the lead. One click to confirm, one to dismiss.
SQLite, not loose files — all data in one file (data/pipeline.db), not scattered JSON.

Design philosophy

Core tracking (adding leads, logging activity, changing stages, viewing the board) has zero dependency on any LLM and keeps working even if the LLM provider is down. Only the two AI-assisted features degrade gracefully if that call fails.

Run it


The "Draft follow-up" button and stage-suggestion banner need an LLM provider configured — defaults to OpenRouter's free tier (openai/gpt-oss-20b:free in pipeline/llm.py), which needs just a free OPENROUTER_API_KEY. Everything else works with zero configuration.

Deploying your own copy

render.yaml is a Render Blueprint — connect this repo on Render, it free-tier-provisions a web service automatically. Set OPENROUTER_API_KEY when prompted (or leave it unset if you don't want the AI features live). Free-tier instances sleep after 15 minutes idle and wake on the next request.
Setting DEMO_MODE=true seeds the board with fictional sample leads and wipes + reseeds them every 6 hours, so a public demo never accumulates stranger-entered data. Leave it unset (the default) for a real deployment — your data is never touched.

Test


39 tests, TDD throughout. The LLM tests mock the client entirely — no network calls or API key required to run the suite.

Stack

Python, FastAPI, Jinja2, SQLite (stdlib), LangChain (OpenAI-compatible client pointed at OpenRouter).
Like this project

Posted Aug 25, 2026

Local-first CRM that tracks qualified leads, activity, value, follow-ups, and progress from prospect to payment—with human approval.