Skip to main content

Sales CRM & RFP

What progress is a construction sales team trying to make when they open their CRM at 7am?


Pitch-Prompt Deck

Five cards. Five headlines. Five pictures. The meme layer80 cents in the dollar.

CardHeadlinePersuasionPictureProblem → Question → Decision
PrinciplesBuilt for how they sellEthosOutcome MapGeneric CRMs force data entry, teams resist → What if the system learns from their bids? → Answer once, auto-fill forever
Performance70% auto-fill, empty libraryLogosValue StreamAI features built but library has zero entries → What unlocks the flywheel? → Process one real RFP to seed the library
PlatformApp complete, auth brokenToposDependency Map49% live, full CRM+RFP modules — can't onboard → Blocked by what? → Identity & Access Tier 0 fix unblocks everything
ProtocolsSix days wire three algorithmsKairosCapability MapSales forecasting, compound rate, RFP detection all dormant → Wire or rebuild? → Wire — import, call, render
PlayersLost the bid nobody trackedPathosA&IDSales teams use 3-5 tools to track one deal → Will they switch? → When they miss a deadline because nobody found last bid's answers

Demand-Side Jobs

Every feature exists because someone is struggling to make progress. No struggle, no feature. These are the jobs — verified by watching what construction sales teams actually do, not what they say they want.

Job 1: Know Who I'm Dealing With

Situation: A BD manager prepares for a meeting tomorrow with a client they haven't spoken to in 3 months. They need to know: who else from their company is involved, what deals are active, what the last conversation was about.

ElementDetail
Struggling momentSearching email, spreadsheets, and memory to reconstruct a relationship
Current workaroundEmail search + notebook + asking colleagues "have you spoken to...?"
What progress looks likeOpen a contact, see everything — company, linked deals, full activity history
Hidden objection"I don't want to enter data just so a system can show it back to me"
Switch triggerWhen they lose a deal because they didn't know a colleague already had the relationship

Features that serve this job:

  • Contact CRUD with company linking
  • Contact detail page showing all linked entities (deals, ventures, activities)
  • Activity timeline per contact (calls, emails, meetings, site visits)
  • Company page showing all contacts and all deals
  • Search by name, email, company, or tag
  • CSV import for bulk onboarding
  • Contact status (active/inactive) and tagging

Job 2: See Where Every Deal Stands

Situation: Monday morning. A sales director needs to know: which deals are moving, which are stalled, which need action this week, and what the pipeline is worth.

ElementDetail
Struggling momentChasing reps for updates, reconciling spreadsheets, guessing pipeline health
Current workaroundWeekly team call + shared Google Sheet + gut feeling
What progress looks likeOne screen shows every deal, every stage, every value, every next action
Hidden objection"My reps won't update this — I'll end up maintaining it alone"
Switch triggerWhen a forecast is wrong because a deal silently died 3 weeks ago

Features that serve this job:

  • Deal pipeline with visual kanban (drag-drop between stages)
  • Deal stages: Lead, Qualified, Proposal, Negotiation, Won, Lost
  • Deal value, probability, expected close date
  • Cards/Table/Kanban view toggle
  • Pipeline summary (total value, weighted value, deal count per stage)
  • Dashboard with pipeline health, overdue activities, upcoming deadlines
  • Monthly goals tracking (pipeline value, won revenue)

Job 3: Win More Bids, Waste Less Time

Situation: An RFP lands. The team has 3 weeks to respond. Half the questions have been answered before in previous bids, but nobody can find those answers.

ElementDetail
Struggling momentRebuilding proposals from scratch, duplicating effort across bids
Current workaroundCopy-paste from old Word docs, hope someone saved the last version
What progress looks likeUpload an RFP, auto-fill 70% from past answers, human-review the rest
Hidden objection"AI-generated answers will be generic and need so much editing they're not worth it"
Switch triggerWhen they miss a deadline because the team spent all their time on formatting, not content

Features that serve this job:

  • RFP venture creation with description, tags, industry
  • Venture kanban: Discovery, Qualification, Preparation, Review, Submitted
  • Document upload (PDF, DOCX, TXT — max 16MB)
  • AI-powered answer auto-fill from approved library
  • Answer Library with confidence scoring
  • Review Queue for SME approval workflow
  • My Queue for personal review assignments
  • Analytics dashboard (auto-fill rate, time saved, cost saved per RFP)

Job 4: Never Let a Follow-Up Fall Through

Situation: A site visit happened last Tuesday. Three action items came out of it. By Friday, one has been forgotten, one is assigned to someone who doesn't know about it, and one is waiting on a document nobody has sent.

ElementDetail
Struggling momentAction items live in meeting notes that nobody re-reads
Current workaroundPersonal to-do lists, sticky notes, memory
What progress looks likeTasks linked to deals and contacts, with due dates, assignees, and status
Hidden objection"I already have a to-do app — why do I need tasks inside the CRM too?"
Switch triggerWhen a client says "you promised to send that last week"

Features that serve this job:

  • Task creation with title, description, due date, priority
  • Task linking to contacts, deals, ventures
  • Task status: Not Started, In Progress, Completed
  • Overdue task highlighting
  • Calendar view for deadlines and follow-ups

Situation: A solar installation project involves a property owner, an EPC contractor, two subcontractors, and a financier. The project ties to a specific warehouse address. Three separate bids have been submitted over 18 months as the scope changed.

ElementDetail
Struggling momentRelationships between entities exist in the salesperson's head, not the system
Current workaroundNotes fields, custom tags, "see deal X for context" comments
What progress looks likeA venture page showing: the property, all linked companies (with roles), all deals, all contacts
Hidden objection"Our deals are simple enough — we don't need all this linking"
Switch triggerWhen a new hire joins and can't understand any deal without 30 minutes of verbal context

Features that serve this job:

  • Venture entity linking property + companies + deals + contacts
  • Multi-company deals with roles (Client, JV Partner, Subcontractor, Consultant)
  • Property registry with address, GPS, site type, status
  • Venture-to-deal relationship (multiple bids per project)
  • Activity logging against any entity (contact, deal, venture, property)

Awareness Levels

Where the buyer sits determines what we build next.

LevelThey KnowWhat We Need to ShowFeature Priority
UnawareUsing spreadsheets, don't see the problemThe cost of lost deals and duplicated effortMarketing, not product
Problem Aware"We lose track of deals"Name their pain back to themDashboard, pipeline view
Solution AwareCRMs exist, tried Salesforce/HubSpotWhy construction needs a vertical CRMProperty registry, RFP workflow
Product AwareKnow this tool, not convincedRemove the hidden objection (adoption, data entry)CSV import, auto-fill, clean UX
Most AwareReady to switchReduce friction to zeroOnboarding wizard, data migration

Validation Stack

TestEvidenceStatus
Problem existsConstruction teams use 3-5 tools (CRM + spreadsheets + email + file shares + notebooks) to track one dealValidated — observed in solar, telecom, and construction
People payApp live at dreamineering.com/dashboard with real contacts and dealsEarly signal — internal use, needs external pilots
You can deliverCRM + RFP modules functional with auth, CRUD, kanban, AI auto-fillValidated — prototype running
Unit economicsSaaS at $30-80/seat/month vs Salesforce at $75-300Unvalidated — need pricing tests

Kill signal: If users create contacts but never create deals, the CRM is a rolodex, not a sales tool. Deal creation is the activation metric.


Domain Model

CONTACTS ←→ COMPANIES
↕ ↕
VENTURES ←→ DEALS (Bids)
↕ ↕
PROPERTIES DOCUMENTS
EntityWhat It RepresentsKey Fields
ContactA person you do business withName, role, company, phone, email, tags, status
CompanyAn organisation (client, subcontractor, supplier)Name, type, industry, ABN/tax ID, address
PropertyA physical site or address where work happensAddress, GPS, site type, status, photos
VentureA project or job that ties people, places, and bidsName, property, client company, stage, value
DealA bid, tender, or commercial opportunityVenture link, value, stage, due date, probability
ActivityAny interaction (call, email, meeting, site visit)Type, date, contacts, notes, linked entity
DocumentProposals, RFPs, contracts, drawingsFile, version, type, linked deal/venture

Relationships

FromToCardinalityExample
ContactCompanyMany-to-manyOne person works for multiple companies over time
VenturePropertyMany-to-oneOne property can have multiple project phases
VentureCompanyMany-to-manyClient, main contractor, subcontractors all linked
DealVentureMany-to-oneMultiple bids submitted for one project
DealContactMany-to-manyDecision-makers, procurement, technical reviewers
ActivityAny entityPolymorphicA site visit logs against contact, property, and venture

RFP Workflow

The tender cycle is the heartbeat of construction sales.

TENDER NOTICE

GO/NO-GO DECISION (scored checklist)

BID PREPARATION (document assembly, pricing, team allocation)

SUBMISSION (version-locked, timestamped)

EVALUATION PERIOD (track questions, site visits, presentations)

AWARD / LOSS (win/loss analysis, feedback capture)

HANDOVER TO DELIVERY (venture transitions to In Progress)

Go/No-Go Checklist

Every RFP runs through a qualification gate before committing resources.

CriteriaQuestionWeight
RelationshipDo we know the decision-maker?High
CapabilityHave we done this type of work before?High
CapacityDo we have the team available?High
CompetitionHow many competitors are bidding?Medium
MarginCan we hit target margin at competitive price?High
LocationIs the site in our operating area?Medium
TermsAre contract terms acceptable?Medium
TimelineCan we meet the submission deadline?High

Score: 70%+ = Go. 50-70% = Review. Below 50% = No-Go.


Competitive Position

CapabilitySalesforceHubSpotPipedriveThis CRM
Contact/Company managementYesYesYesYes
Visual pipelineYesYesYesYes
Property/site registryNo (custom objects)NoNoNative
Multi-company dealsYes (complex setup)LimitedNoNative
RFP/tender workflowNo (add-on)NoNoNative
AI answer auto-fillNoNoNoNative
Go/No-Go scoringNoNoNoPlanned
Document versioning per bidNo (add-on)LimitedNoPlanned
Map view of propertiesNoNoNoPlanned
Construction-aware stagesCustom config neededCustom config neededCustom config neededDefault
Price per seat/month$75-300$0-150$15-100Target: $30-80

The gap: Generic CRMs can be configured for construction. None are designed for it. Configuration tax compounds — every new hire needs setup, every report needs custom fields, every integration needs mapping.


Feature / Function / Outcome

Every row maps a feature to the function it performs, the outcome the user experiences, the job it serves, and delivery state. Reviewed 2026-02-18.

#FeatureFunctionOutcomeJobState
1Contact listBrowse, search, filter contactsFind the right person in secondsJob 1Live — 23 contacts, table/grid, search, pagination
2Contact detailView profile, linked ventures, linked dealsSee full relationship context before a meetingJob 1Live — breadcrumbs, contact info, linked RFP ventures with roles, linked deals section
3Contact createAdd new contact with companyCapture a new relationship immediatelyJob 1Live/crm/contacts/new
4Company pagesView company with all contacts and dealsUnderstand an organisation's full engagementJob 1, 5Gap — company as contact field, no standalone entity pages
5Deal pipelineVisual kanban of all deals by stageSee where every deal stands at a glanceJob 2Live — 4 stages, drag-drop, cards/table/kanban toggle
6Deal createCreate new deal with value and stageCapture a new opportunity immediatelyJob 2Live/crm/deals/new
7Deal detailView deal with stakeholders, linked RFP, activity timelineUnderstand everything about an opportunityJob 2Live — stage, value, probability, close date, deal type, stakeholder management, linked RFP venture, activity timeline
8Deal stakeholdersAdd contacts as stakeholders with buying rolesMap the buying committeeJob 2, 5Live — "Add Stakeholder" button, buying committee framing
9DashboardSummary cards and pipeline overviewKnow what needs attention todayJob 2Live — pipeline summary, goals, quick actions
10Monthly goalsTrack pipeline and won revenue targetsKnow if you're on track this monthJob 2Live — $100K pipeline, $50K won targets
11Venture kanbanVisual board of RFP projects by stageTrack every bid from discovery to submissionJob 3Live — 5 stages, 3 ventures, drag-drop
12Venture detailView RFP questions, linked deal, linked contactsFull picture of a bid in one pageJob 3, 5Live — 10 questions table, linked deal, linked contacts with stakeholder roles/influence, AI buttons
13Venture createCreate new RFP ventureStart tracking a new bidJob 3Live/rfp/ventures/new
14Venture-deal linkBidirectional link between RFP venture and CRM dealOne project, one deal, full pictureJob 5Live — linked from both venture detail and deal detail, with Unlink button
15Stakeholder rolesAssign roles and influence to linked contactsKnow who decides, who influences, who blocksJob 5Live — Economic Buyer role, high/medium influence levels, description field
16RFP questionsManage Q&A per venture with category/priority/statusStructure the RFP responseJob 3Live — 10 questions, Add Question button, category/priority/status columns
17Answer detailReview AI answer or write manual answerBuild the answer library one question at a timeJob 3Live — answer review page, manual write with save, min 10 chars
18AI LoopRun AI-powered answer generation across venture questionsAuto-generate draft answersJob 3Built — "Run AI Loop" button on venture detail
19Deck generationGenerate presentation deck from answered questionsTurn answers into a deliverableJob 3Built — "Answer some questions first to generate a deck"
20Document uploadUpload PDF, DOCX, TXT to venturesAttach RFP documents to the right projectJob 3Live — UploadThing, PDF/DOCX 16MB, TXT 4MB
21AI auto-fillAuto-populate RFP answers from libraryCut 70% of RFP response timeJob 3Live — 70% auto-fill rate reported
22Answer libraryStore approved answers for reuseNever write the same answer twiceJob 3Built — page with confidence scoring, empty state
23Review queueSME approval workflow for answersEnsure answer quality before auto-fillJob 3Built — review queue + my queue, confidence tiers (40-80%)
24RFP analyticsTrack time saved, cost saved, fill rate, compound growthProve the ROI of the RFP toolJob 3Live — auto-fill rate, approval rate, compound rate, library size, confidence distribution, $1,150/RFP, 20h saved
25Task managementCreate, assign, track tasksNever let a follow-up fall throughJob 4Partial — page exists, create flow, status cards, empty state
26CalendarView deadlines and follow-ups by dateSee the week aheadJob 4Partial — nav link exists
27Activity timelineLog calls, emails, meetings, visits per dealBuild an interaction historyJob 1, 4Built — timeline on deal detail with "Log First Activity" button, empty state
28CSV importBulk import contacts from spreadsheetOnboard existing contacts in minutesJob 1Not verified
29Global searchSearch across contacts, deals, venturesFind anything from one search boxAllPartial — contact search works
30Property registryTrack physical sites as standalone entitiesLink projects to real-world locationsJob 5Partial — address data exists on contacts/ventures, no standalone entity
31Go/No-Go scoringQualification checklist for RFP decisionsStop wasting time on unwinnable bidsJob 3Gap — qualification stage exists in kanban, no scoring UI
32AuthSign-in, sign-up, user managementSecure access per userAllLive — Clerk auth, theme toggle
33NavigationApp-wide sidebar and top nav with breadcrumbsMove between modules without frictionAllLive — 6 modules, breadcrumbs on detail pages
34RFP assignmentsAssign reviewers to answer queuesDistribute review work across teamJob 3Gap — nav link exists, redirects to dashboard
35InsightsAnalytics and forecastsMake data-driven decisionsJob 2Stub — nav only
36PlansTeam plans and task trackingCoordinate team activityJob 4Stub — nav only
37AgentsAI agent registry and workflowsAutomate repetitive sales tasksJob 3Stub — nav only
38Sales ForecastingPredict deal close probability by month with confidenceKnow which deals will close and whenJob 2Dormant — algorithm built in agency lib (sales-forecasting/), page exists at /insights/forecast, not wired
39Compound RateTrack answer library growth rate and compounding curveProve the RFP tool compounds in value over timeJob 3Dormant — algorithm built (compound-rate-tracking/), analytics page renders placeholder, not wired
40RFP Type DetectionAuto-classify uploaded documents by typeSkip manual tagging on every uploadJob 3Dormant — algorithm built (rfp-type-detection/), upload flow exists, not wired
41PaymentsAccept subscription payments via StripeGet paid for the productAllPartial — Stripe backend (Phase 10.1) complete, webhook handlers pending, no production payment flow

Delivery Summary

StateCount%Meaning
Live2049%Functional, verified with real data
Built615%UI exists, needs data or first use
Dormant37%Algorithm built in agency lib, not wired to UI
Partial512%Page exists, core function incomplete
Gap25%In PRD spec, not yet built
Stub37%Nav link only
Not verified12%May exist, needs testing
Total41+4 wiring jobs (3 dormant algos + 1 payment)

Success Criteria

Functional

#CriterionVerificationJob Served
F1Create a contact and link to a company in under 30 secondsTimed testJob 1
F2Contact detail shows all linked deals, ventures, and activitiesWalkthroughJob 1
F3Move a deal through all pipeline stages via drag-dropWalkthroughJob 2
F4Dashboard accurately reflects pipeline value and deal countData verificationJob 2
F5Upload an RFP and receive auto-filled answers within 60 secondsTimed testJob 3
F6SME can review and approve an answer in the Review QueueWalkthroughJob 3
F7Create a task linked to a deal with due date and assigneeEnd-to-end testJob 4
F8Create a venture linking property, company, contacts, and dealsEnd-to-end testJob 5
F9Import 500 contacts from CSV without errorsBulk import testJob 1
F10Search finds results across all entity types in under 2 secondsPerformance testAll

Non-Functional

#CriterionThreshold
NF1Page load timeUnder 2 seconds on 4G
NF2Search responseUnder 500ms for 10K records
NF3Concurrent users50 simultaneous without degradation
NF4Mobile responsiveFully usable at 375px viewport
NF5Uptime99.5% monthly

Business Dev

This PRD wins only if it closes the loop from operations pain to recurring revenue.

LayerDecisionInitial AssumptionEvidence to Collect
ICPWho buys first?Construction and solar EPC teams with active RFP volume and spreadsheet pain15 interviews, 5 qualified pilots
OfferWhat do we sell?"Win more bids with less admin" workflow bundle (CRM + RFP loop)Pilot users process at least one real RFP
PricingHow do we charge?Seat-based + workflow tier ($30-80/seat baseline)Willingness-to-pay interviews + pilot conversion
ChannelHow do we reach them?Founder-led outbound + industry referrals + case-study content10 qualified demos/month pipeline
ConversionWhat proves value?First approved answer in library within 7 daysActivation rate > 60% in pilots
RetentionWhy do they stay?Compounding answer library + weekly deal workflow dependencyWeekly active usage in CRM and RFP modules

Pilot Proof Pack

Each pilot must produce:

  1. Before/after bid cycle time.
  2. Auto-fill percentage with quality acceptance rate.
  3. Deal progression and revenue impact.
  4. User quote from sales lead or bid manager.

Commissioning

Deep review against live app at dreamineering.com on 2026-02-18. Inspected: dashboard, CRM overview, contacts list, contact detail, deals list, deal detail, tasks, RFP overview, ventures list, venture detail, answer detail, answer library, review queue, my queue, analytics.

BLOCKER: Auth Broken — Infinite Redirect Loop (2026-02-24)

Status: App completely inaccessible. No feature can be commissioned until this is fixed.

Symptom: Navigate to /dashboard → blank page. URL alternates between /dashboard and /sign-in?error=admin_access_required every ~400ms indefinitely.

Root cause from Vercel logs:

  1. Clerk auth succeeds — userId user_36MjIJRckjpXRqdOHaZcgMpFjzE authenticates, organisation found, context validated
  2. User-Role database query fails — PostgreSQL 22P02 (invalid text representation). A Clerk userId string (user_36MjIJ...) is being cast to a UUID column where it can't fit
  3. Feature access denied — dashboard read blocked because role lookup returned an error
  4. Redirect to /sign-in?error=admin_access_required — but Clerk sees user IS authenticated → afterSignInUrl: "/dashboard" → redirect back → loop

The fix: The User-Role query (added during multi-tenancy work) is using the Clerk userId (string with user_ prefix) instead of the systemUserId (valid UUID f388dbc7-cb98-41ee-9708-d6f5d2c54fe0). The ClerkAuthAdapter already maps these correctly — the role query downstream is passing the wrong field.

Evidence: Vercel production logs, request ID dx89j-1771901662057-8dbab5d4899c, 2026-02-24 15:54:22 NZST. 789 warnings + 789 errors in 30 minutes from the redirect loop.

Regression: Auth was previously working (PRD row #32 marked "Live — Clerk auth" on 2026-02-18). Multi-tenancy changes introduced the role check that breaks it.

ComponentSchemaAPIUITestsStatusNotes
DashboardDoneDoneDonePending85%Section cards, quick actions, 6-module nav
Contact CRUDDoneDoneDonePending85%23 contacts, table/grid, search, filters, pagination, edit
Contact DetailDoneDoneDonePending80%Breadcrumbs, contact info, linked RFP ventures with roles/influence, linked deals section
Company CRUDPartialPartialPartialPending25%Company as contact field only, no standalone entity pages
Property DataPartialPartialPartialPending30%Address on contacts + ventures, not a standalone entity
Venture BoardDoneDoneDonePending85%5-stage kanban, 3 ventures, drag-drop, cards/kanban toggle
Venture DetailDoneDoneDonePending85%Questions table, linked deal, linked contacts with roles, AI Loop, deck gen
RFP QuestionsDoneDoneDonePending80%10 questions per venture, category/priority/status, add question
Answer DetailDoneDoneDonePending70%Review page, manual write, min 10 chars, no AI answers yet
Deal PipelineDoneDoneDonePending85%4-stage kanban, cards/table/kanban, drag-drop, 1 live deal
Deal DetailDoneDoneDonePending80%Stage, value, probability, close date, type, stakeholders, linked RFP, activity timeline
StakeholdersDoneDoneDonePending75%Add stakeholder on deals + ventures, Economic Buyer role, influence levels
Venture-Deal LinkDoneDoneDonePending90%Bidirectional — visible from both venture and deal detail, Unlink button
Activity TimelinePartialPartialDonePending40%UI on deal detail with "Log First Activity", empty state, needs first use
Task ManagementPartialPartialDonePending35%Page, status cards, create flow, empty state
Document UploadDoneDoneDonePending70%UploadThing configured (PDF/DOCX 16MB, TXT 4MB)
AI Auto-fillDoneDoneDonePending65%70% rate displayed, AI Loop button, needs answer library data
AI Deck GenPartialPartialDonePending40%Button exists, requires answered questions first
Answer LibraryDoneDoneDonePending50%Page, confidence tiers, empty — needs first approved answers
Review QueueDoneDoneDonePending55%Queue page, my queue, confidence filtering (40-80%)
RFP AnalyticsDoneDoneDonePending70%Auto-fill rate, approval rate, compound rate, library size, confidence dist, value metrics
AuthDoneDoneBROKENPending0%REGRESSION — Infinite redirect loop after multi-tenancy. PostgreSQL 22P02 on User-Role query. See blocker above.
NavigationDoneDoneDonePending90%6 top-level modules, sidebar per module, breadcrumbs on detail pages
AssignmentsPendingPendingPendingPending0%Nav link redirects to dashboard
CalendarPartialPendingPartialPending15%Nav link exists
Global SearchPartialPartialPartialPending30%Contact search works
InsightsPendingPendingPendingPending0%Stub
PlansPendingPendingPendingPending0%Stub
AgentsPendingPendingPendingPending0%Stub
Sales ForecastingDonePartialPartialPending30%Algorithm built, page exists, server action not wired — Sprint 0
Compound RateDonePartialPartialPending30%Algorithm built, analytics page renders placeholder — Sprint 0
RFP Type DetectionDonePendingPendingPending15%Algorithm built, upload flow exists, not integrated — Sprint 0
Stripe PaymentsDonePartialPendingPending20%Backend complete (Phase 10.1), webhooks pending — Sprint 0

Quality Assessment

DimensionRatingEvidence
Data modelStrongContacts, deals, ventures, questions, answers, stakeholders — all relational, all linked
Entity linkingStrongVenture-deal bidirectional, contact-venture with roles, contact on deal detail
CRM coreSolidContact CRUD, deal pipeline, kanban views, detail pages all functional
RFP coreSolidVenture lifecycle, question management, answer workflow, analytics
AI featuresEarlyAuto-fill rate reported, AI Loop button, but answer library empty — needs first real RFP
Information architectureCleanConsistent sidebar nav, breadcrumbs, module separation, back links
Empty statesGoodEvery empty state has guidance text and action button
Data densityLow23 contacts, 1 deal, 3 ventures, 0 tasks, 0 activities — needs real usage

Gap Analysis

PriorityGapJob BlockedEffort
HighCompany entity — no standalone company pages, can't see all contacts/deals per orgJob 1, Job 5Medium
HighActivity logging — timeline UI exists but no activities logged, needs friction-free entryJob 1, Job 4Small
HighAnswer library seeding — AI features exist but library is empty, blocking the auto-fill flywheelJob 3Medium
MediumProperty entity — address data scattered across contacts/ventures, no standalone registryJob 5Medium
MediumGo/No-Go scoring — qualification stage exists in kanban but no scoring checklist UIJob 3Medium
MediumTask linking — tasks exist but unclear if they link to deals/contacts/venturesJob 4Small
MediumAssignments page — nav link exists, redirects to dashboardJob 3Small
LowCSV import — not verifiedJob 1Small
LowCross-entity search — only contact search verifiedAllMedium
LowCalendar — nav link, no contentJob 4Medium

Shape Up

StageStatusOutput
NapkinDoneDomain model, JTBD analysis, competitive gap
Mock-upDoneLive app — CRM + RFP modules functional with real data
MarketIn progressThis PRD + internal use (23 contacts, 1 deal, 3 ventures)
BuildIn progress54% Live, 16% Built, 11% Partial — core loop works
DemandNot startedPilot with one construction/solar EPC company

Appetite: 6-week cycle. Next cycle: seed the answer library (unlock the AI flywheel), add company entity, make activity logging frictionless. Following cycle: Go/No-Go scoring, property registry.


Next Steps

1. Seed the answer library — process one real RFP to populate answers and prove the auto-fill loop
2. Add company entity — standalone pages showing all contacts and deals per organisation
3. Make activity logging frictionless — quick-log from deal detail, contact detail, venture detail
4. Pilot with one real construction sales team tracking real deals
5. Validate: do they create deals (activation) and return weekly (retention)?

Smallest move: Process one real RFP through the full cycle — upload document, answer 10 questions, approve answers to library, run a second RFP to see auto-fill work. That proves the flywheel.

Kill signal: If users create contacts but never create deals, the CRM is a rolodex. If they create ventures but never answer questions, the RFP tool is a project board. The activation metric is: first answer approved to library within 7 days.

Engineering Brief

Cycle focus: Wire intelligence, then prove the flywheel spins.

Three algorithms and a payment flow sit dormant in the agency lib. The UI surfaces exist. The wiring is 1-2 days each. This is the highest-leverage work before the kill date — it turns "we built a CRM" into "our platform predicts and compounds."

Sprint 0: Wire Dormant Algorithms (Critical — kill date 2026-03-24)

Why: 9 algorithms × 0 UI = 0 value. Three of these algorithms directly serve the Sales CRM product. The pages exist. The algorithms exist. The work is pure wiring — import function, call it with real data, render the result.

What to wire:

  1. Sales Forecasting → Forecast Accuracy page (1 day)

    • Algorithm: libs/agency/src/lib/algorithms/sales-forecasting/ — exports calculateSalesForecast(input): SalesForecastResult
    • Target: /insights/forecast/ page — ForecastDashboard component already renders, calls getForecastDataAction
    • Wire: Fetch deals from repo → map to ForecastDeal[] (id, amount, probability, stage, closeDate) → call calculateSalesForecast({ deals, monthRange, config }) → return typed result
    • Outcome: Live monthly forecast with confidence scores, pipeline health assessment, recommendations
  2. Compound Rate Tracking → RFP Analytics (1 day)

    • Algorithm: libs/agency/src/lib/algorithms/compound-rate-tracking/ — exports calculateCompoundRate(snapshots): CompoundRateResult
    • Target: /rfp/analytics/ page — already renders analytics?.compoundRate?.formatted placeholder
    • Wire: Fetch snapshots from outcomeMeasurementRepository.findByMetricCode('RFP_AUTO_FILL_RATE') → call calculateCompoundRate(snapshots) → map to existing compoundRate interface
    • Helpers: formatCompoundRate() → "+2.1%/week", getTrendIndicator() → "↑"
    • Outcome: Live compound growth rate, trend indicator, weeks-to-target projection
  3. RFP Type Detection → Upload flow (2 days)

    • Algorithm: libs/agency/src/lib/algorithms/rfp-type-detection/ — document type classification
    • Target: Document upload flow on venture detail
    • Wire: After upload, run type detection → auto-tag document type → skip manual classification
    • Outcome: Documents auto-classified on upload
  4. Stripe Webhooks → Production payments (2 days)

    • Current: Backend complete (Phase 10.1), webhook handlers pending
    • Wire: payment_intent.succeeded, subscription.created, subscription.updated, subscription.deleted
    • Outcome: End-to-end payment flow works in production

Acceptance test: Open /insights/forecast → see monthly deal predictions from real CRM data. Open /rfp/analytics → see compound rate with trend arrow and weeks-to-target. Upload a document → type auto-detected. Complete a Stripe checkout → subscription active.

Total effort: ~6 days. This is CONNECT work — no new algorithms, no new UI components, no new schemas.

Sprint 1: Seed the Answer Library (High — unlocks everything)

Why: The RFP module's value proposition is "answer once, auto-fill forever." Until the library has approved answers, auto-fill returns nothing. Every other RFP feature (confidence scoring, compound growth, analytics) is waiting on this.

What to build/fix:

  1. AI Loop end-to-end — Currently the "Run AI Loop" button exists on venture detail. Verify it actually generates draft answers for all 10 questions. If it does, the output should appear on each answer detail page (/rfp/answers/{id}) as a reviewable draft. Currently answer pages show "No answers found for this question." Fix the pipeline: AI generates → draft appears → SME reviews → approves → answer enters library.

  2. Answer approval flow — On the answer detail page, after an AI-generated or manual answer exists, the SME needs: (a) Edit the answer, (b) Set confidence level, (c) Approve to library. Currently there's a manual write box and Save button but no Approve action that graduates the answer to the library.

  3. Library population verification — After approval, the answer should appear in /rfp/library with its confidence score, question category, and source venture. Currently the library page shows "No Approved Answers Yet." Verify the data flow: answer approved → appears in library → available for auto-fill on next venture.

  4. Auto-fill proof — Create a second test venture with similar questions. Run AI Loop. Verify it pulls from the approved library and pre-fills answers. This is the moment the flywheel proves itself.

Acceptance test: Create venture A → answer 10 questions → approve all to library → create venture B with overlapping questions → run AI Loop → at least 5 answers auto-filled from library. Library page shows 10 approved answers with confidence scores.

Sprint 2: Company Entity (High — Job 1 + Job 5)

Why: "Show me everything with ABC Corp" is the most basic CRM question. Currently companies exist only as a text field on contacts. A sales director can't see: all contacts at a company, all deals with that company, all ventures involving them, total pipeline value per company.

What to build:

  1. Company table — New entity: companies with fields: name, type (Client, Contractor, Subcontractor, Supplier, Consultant), industry, abn, website, address, phone, created_at.

  2. Company detail page (/crm/companies/{id}) — Shows: company info, all linked contacts (with roles), all linked deals (with stage/value), all linked ventures. Summary stats: total pipeline value, active deals count, contact count.

  3. Company list page (/crm/companies) — Table with search, filter by type, sort by name/deal count/pipeline value. Add to CRM sidebar nav between Contacts and Deals.

  4. Contact-company relationship — Migrate the existing company text field on contacts to a foreign key. Contacts link to company records. A contact can belong to one company (with optional role/title at that company).

  5. Deal-company linking — When a contact is added as a stakeholder on a deal, their company is implicitly linked. Company detail page shows all deals where any of its contacts are stakeholders.

Acceptance test: Create company "ABC Corp" (type: Client) → link 3 existing contacts to it → create a deal with one of those contacts as stakeholder → company detail page shows all 3 contacts and the deal with pipeline value.

Sprint 3: Activity Logging (High — Job 1 + Job 4)

Why: The activity timeline UI exists on deal detail ("Log First Activity") but has zero entries across the entire system. Without activity history, the CRM can't answer "when did we last talk to them?" or "what happened at the site visit?" — which is the core of Job 1.

What to build:

  1. Quick-log modal — A lightweight modal (not a full page) triggered from: deal detail, contact detail, venture detail, and the activities list page. Fields: type (Call, Email, Meeting, Site Visit, Note), date (defaults to now), description (free text), linked contacts (multi-select), linked deal (optional), linked venture (optional).

  2. Activity creation APIPOST /api/activities with: type, date, description, contact_ids[], deal_id, venture_id. All linking fields optional except at least one contact or one deal.

  3. Activity timeline rendering — On deal detail: show activities in reverse chronological order with type icon, date, description, linked contacts. On contact detail: show all activities involving that contact. Filter by type.

  4. Activity list page (/crm/activities) — Currently shows "No recent activity." Populate from the activities table. Show all activities across all entities, sortable by date, filterable by type.

  5. Activity count on overview — The CRM overview shows "Total Activities" card. Wire this to the actual count.

Acceptance test: From deal detail, click "Log First Activity" → modal opens → log a "Site Visit" with date, description, and linked contact → activity appears in deal timeline → same activity appears on contact detail page → CRM overview shows "1" in Total Activities card.

Sprint 4: Data Quality (Medium — all jobs)

Why: The system has 23 contacts but 1 deal at $0 value, 3 ventures all in Discovery, 0 tasks, 0 activities. The architecture works but the data doesn't tell a story. A pilot user seeing this will think "nobody uses this."

What to do:

  1. Populate the Solar deal — The "Commercial Solar Installation - ABC Corp Warehouse" deal has $0 value, no probability, no close date. Set realistic values: $150,000 value, 60% probability, close date 3 months out. This makes the pipeline dashboard meaningful.

  2. Move ventures through stages — All 3 ventures sit in Discovery. Move the Solar venture to Preparation (it has 10 questions defined). Move "Test Project Alpha" to Qualification. Leave Dreamineering in Discovery. This makes the kanban board tell a story.

  3. Add stakeholders to the deal — The deal has 0 stakeholders even though the venture has 1 linked contact. Add Matt Mischewski as a stakeholder on the deal too, with "Economic Buyer" role. This validates the stakeholder flow from deal side.

  4. Log 3-5 activities — Create realistic activities: initial call, site visit, proposal discussion. This populates the activity timeline and proves the logging flow.

  5. Create 2-3 tasks — "Send revised proposal by Friday," "Schedule site inspection," "Follow up on financing options." Link to the deal. This populates the task board.

Acceptance test: Dashboard shows: pipeline value > $0, at least 2 deals across different stages, recent activity entries. A new user opening the app sees a system in use, not an empty shell.

Not This Cycle

These are real gaps but don't block the flywheel:

  • Property entity — Address data exists on contacts/ventures. Standalone entity is nice-to-have until there are 10+ properties.
  • Go/No-Go scoring — Qualification stage exists in kanban. Scoring checklist adds value at scale, not at 3 ventures.
  • Assignments page — Nav link redirects to dashboard. Matters when there are multiple reviewers.
  • Calendar — Important for daily use but doesn't prove the core value loop.
  • Cross-entity search — Contact search works. Expand when there's enough data to search.
  • Insights/Plans/Agents — Stub modules. Don't start until CRM + RFP core is proven with real usage.

Definition of Done (This Cycle)

1. Answer library has 10+ approved answers with confidence scores
2. Auto-fill works: venture B pulls answers from venture A's approved library
3. Company entity exists with detail pages showing linked contacts/deals
4. Activity timeline has real entries visible from deal + contact detail
5. Pipeline dashboard shows realistic values ($100K+)
6. One real external user can track a deal from lead to proposal using this tool

North Star Metric

Win Rate > 30% (currently 22%)

This is the ONE metric this PRD exists to move. Everything else — contacts, pipelines, auto-fill rates, answer libraries — is secondary. If win rate doesn't move, the tool is busy work.

Mycelium Capability

The Sales CRM & RFP is a demand-driven sales capability. Currently built for construction and solar, but the RFP workflow, answer library, and confidence scoring patterns apply to any industry with competitive bidding — real estate, consulting, government contracting.

Currently Growing In: stackmates

Production Audit — 2026-02-24

Verified against dreamineering.com (authenticated session). The app routes exist, navigation is correct, but the core data pipeline is broken.

Route Status

RoutePageStatusError
/rfpOverviewPASSStats render (70% auto-fill, 83% time saved, $1,150/RFP)
/rfp/venturesVenturesFAILOperation failed — ventures list query fails
/rfp/ventures/newCreate VentureWARNForm renders but industry dropdown missing Construction/Infrastructure
/rfp/libraryAnswer LibraryFAILYou don't have permission to read rfp_answer
/rfp/reviewReview QueueFAILYou don't have permission to read rfp_answer
/rfp/my-queueMy QueuePASSEmpty state renders correctly
/rfp/analyticsAnalyticsPASSMetrics, confidence distribution, estimated value render
/rfp/assignmentsAssignmentsFAILFailed to fetch agents — SME list query fails
/crmCRM OverviewWARN"Some Data Unavailable" warning. Pipeline stages render at 0 deals

Blocking Issues

  1. Convex rfp_answer permissions — Answer Library and Review Queue both fail with the same auth error. This blocks the entire auto-fill pipeline (Job 3). Root cause: table-level read permission not granted to authenticated user role.
  2. Ventures query failure — Generic "Operation failed" on ventures list. Blocks creating and managing RFP projects. May be a separate Convex function error or the same permissions issue.
  3. Agents fetch failure — Assignments page can't load SMEs. Blocks the review/approval workflow.

Data Issues

  1. Industry dropdown mismatch — Create Venture offers: Technology, Healthcare, Finance, Education, Manufacturing, Retail, Services, Other. Missing: Construction, Infrastructure, Energy, Solar — the verticals this PRD explicitly targets. AI response tailoring won't match the target market.

What Works

  • Dashboard routing and navigation structure is correct
  • RFP Overview renders with stats (though likely hardcoded/seed data)
  • Analytics page renders metrics and confidence distribution
  • My Queue renders empty state with correct links
  • Create Venture form is functional (fields, validation, dropdown)
  • CRM Overview renders pipeline stages (Lead/Qualified/Proposal/Negotiation) and monthly goals
  • Clerk auth is working (user is authenticated, avatar renders)

Against Definition of Done

CriterionStatusEvidence
10+ approved answers with confidence scoresBLOCKEDCan't read rfp_answer table
Auto-fill works across venturesBLOCKEDCan't load ventures or answer library
Company entity with linked contacts/dealsNOT VERIFIEDCRM data unavailable warning
Activity timeline with real entriesEMPTY"No recent activity" on CRM overview
Pipeline dashboard shows $100K+FAILShows 0 deals, $0 pipeline value
External user can track lead to proposalBLOCKEDCore data queries failing

Next Actions (Engineering)

  1. Fix Convex table permissions for rfp_answer — unblocks 3 pages
  2. Debug ventures list query — separate from permissions, returns generic error
  3. Fix agents fetch for assignments page
  4. Add Construction, Infrastructure, Energy, Solar to industry dropdown
  5. Seed or create real venture data to validate the full loop

Context