Features
Proposals
Create proposals with multiple pricing tiers, track versions as scope changes, and link every proposal back to its originating lead.
Multi-Option Pricing Tiers
Each proposal can include multiple pricing options. This lets you offer tiered packages (Basic, Standard, Premium) so clients can choose the scope and budget that fits. The anchoring effect of seeing a higher tier often increases your average deal size.
Basic
$4,000
Core features only. 2-week delivery. 1 revision round.
Standard
$8,000
Core + integrations. 4-week delivery. 2 revision rounds. Priority support.
Premium
$16,000
Full scope + analytics dashboard. 6-week delivery. Unlimited revisions. Dedicated Slack channel.
When the client selects an option, it becomes the basis for the project budget and subsequent invoices.
Proposal Versioning
Scope changes happen. When a client asks for adjustments, create a new version of the proposal instead of editing the original. This gives you a complete history of what was proposed at each stage of the negotiation.
- *Each version is immutable once sent to the client
- *Version numbers auto-increment (v1, v2, v3...)
- *Compare versions side-by-side to see what changed between negotiations
- *Only the latest version can be marked as accepted
Data Model
Proposals are linked to leads via a foreign key. Each proposal has many options, and exactly one option can be selected.
// Proposal with pricing options (Prisma)
model Proposal {
id String @id @default(cuid())
leadId String
lead Lead @relation(fields: [leadId])
version Int @default(1)
status ProposalStatus @default(DRAFT)
options ProposalOption[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model ProposalOption {
id String @id @default(cuid())
proposalId String
proposal Proposal @relation(fields: [proposalId])
label String // e.g. "Basic", "Standard", "Premium"
price Float
description String
selected Boolean @default(false)
}How Proposals Link to Leads
Every proposal belongs to a lead. When you create a proposal from the funnel view, the lead ID is automatically attached. This connection powers the full pipeline:
Lead → Proposal (with options) → Accepted Option → Project → Invoices
AI-Powered Generation
If you have an OpenAI API key configured, the app can generate proposal options automatically based on the lead's project description and budget. See the AI Features page for details.
// AI-powered proposal generation
const prompt = `Generate a freelance proposal for:
Project: ${lead.projectDescription}
Client: ${lead.name}
Budget range: ${lead.estimatedValue}
Return 3 pricing tiers (Basic, Standard, Premium)
with scope descriptions for each.`;Related pages
- Lead Funnel — Where proposals originate
- Projects — Created when a proposal option is accepted
- AI Features — Auto-generate proposal tiers with AI