Repository navigation
Leads & funnels, opt-in per project.
- A lead is its own entity with per-project funnel stages (OPEN / WON / LOST),
custom fields validated intoleads.data, an append-only journal with
comments and a linked task for the work it needs. Moving a lead to a LOST
stage requires a reason. - Presets on enable:
sales(new → qualification → proposal sent →
negotiation → audit paid → won / lost),orders(new → confirmed → driver
assigned → done → paid / cancelled) andbasic. Stages and fields stay
editable afterwards. - Lead intake:
POST /ingest/leadswith a per-projectX-Lead-Token(sha256
in the database, the value is shown once). Idempotent onsource+
external_id; a repeat can move the stage or, withupdate: true, update
fields. Values that don't match the field schema land indata._extra
instead of being rejected. - Board with drag & drop, table with search and filters, funnel stats
(/projects/{id}/leads/stats), short lead links/l/<key>, funnel settings
page with stages, fields and ingest keys. - Permissions:
lead.view/lead.managefor project members,
lead.deletefor managers,lead.settingsfor project owners. - CLI:
pms.py lead list|add|show|stage|edit|comment|task|stats|enable|tokens|token-add|ingest. - Migration
d4e5f6a7b8c9. Next.js 15.5.28.
Full history: CHANGELOG.md