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.

prisma/schema.prisma
// 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 prompt template
// 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