Skip to content

PRD (Product Requirements Document)

The PRD is the core document type in structured-requirements, defining what to build and why.

Structure

graph TD
    PRD[PRD Document]
    PRD --> M[Metadata]
    PRD --> ES[Executive Summary]
    PRD --> O[Objectives]
    PRD --> P[Personas]
    PRD --> US[User Stories]
    PRD --> R[Requirements]
    PRD --> RM[Roadmap]
    PRD --> G[Goals]

    O --> BO[Business Objectives]
    O --> PG[Product Goals]
    O --> SM[Success Metrics]

    R --> FR[Functional]
    R --> NFR[Non-Functional]

    G --> V[V2MOM]
    G --> OK[OKR]

Core Sections

Metadata

type Metadata struct {
    ID        string     `json:"id"`
    Title     string     `json:"title"`
    Version   string     `json:"version"`
    Status    Status     `json:"status"`
    CreatedAt time.Time  `json:"created_at"`
    UpdatedAt time.Time  `json:"updated_at"`
    Authors   []Person   `json:"authors"`
    Reviewers []Person   `json:"reviewers,omitempty"`
    Approvers []Approver `json:"approvers,omitempty"`
    Tags      []string   `json:"tags,omitempty"`
}

Status values: draft, in_review, approved, deprecated

Executive Summary

type ExecutiveSummary struct {
    ProblemStatement  string   `json:"problem_statement"`
    ProposedSolution  string   `json:"proposed_solution"`
    ExpectedOutcomes  []string `json:"expected_outcomes"`
    TargetAudience    string   `json:"target_audience,omitempty"`
    ValueProposition  string   `json:"value_proposition,omitempty"`
}

Objectives

type Objectives struct {
    BusinessObjectives []Objective     `json:"business_objectives"`
    ProductGoals       []Objective     `json:"product_goals"`
    SuccessMetrics     []SuccessMetric `json:"success_metrics"`
}

type Objective struct {
    ID          string `json:"id"`
    Description string `json:"description"`
    Rationale   string `json:"rationale,omitempty"`
    AlignedWith string `json:"aligned_with,omitempty"` // V2MOM/OKR reference
}

type SuccessMetric struct {
    ID                string `json:"id"`
    Name              string `json:"name"`
    Description       string `json:"description"`
    Metric            string `json:"metric"`
    Target            string `json:"target"`
    CurrentBaseline   string `json:"current_baseline,omitempty"`
    MeasurementMethod string `json:"measurement_method,omitempty"`
}

Personas

type Persona struct {
    ID                   string               `json:"id"`
    Name                 string               `json:"name"`
    Role                 string               `json:"role"`
    IsPrimary            bool                 `json:"is_primary"`
    Description          string               `json:"description,omitempty"`
    Goals                []string             `json:"goals"`
    PainPoints           []string             `json:"pain_points"`
    TechnicalProficiency TechnicalProficiency `json:"technical_proficiency,omitempty"`
    Demographics         *Demographics        `json:"demographics,omitempty"`
}

Requirements

type Requirements struct {
    Functional    []FunctionalRequirement    `json:"functional"`
    NonFunctional []NonFunctionalRequirement `json:"non_functional"`
}

type FunctionalRequirement struct {
    ID               string   `json:"id"`
    Title            string   `json:"title"`
    Description      string   `json:"description"`
    Priority         Priority `json:"priority"`
    MoSCoW           MoSCoW   `json:"moscow,omitempty"`
    AcceptanceCriteria []string `json:"acceptance_criteria,omitempty"`
    PersonaIDs       []string `json:"persona_ids,omitempty"`
}

Priority: critical, high, medium, low

MoSCoW: must, should, could, wont

NFR Categories: performance, scalability, reliability, availability, security, multi_tenancy, observability, maintainability, usability, compatibility, compliance

Optional Sections

Goals Alignment

type GoalsAlignment struct {
    V2MOMRef          *GoalReference    `json:"v2mom_ref,omitempty"`
    V2MOM             *v2mom.V2MOM      `json:"v2mom,omitempty"`
    OKRRef            *GoalReference    `json:"okr_ref,omitempty"`
    OKR               *okr.OKRDocument  `json:"okr,omitempty"`
    AlignedObjectives map[string]string `json:"aligned_objectives,omitempty"`
}

Problem Definition (Extended)

type ProblemDefinition struct {
    Statement       string     `json:"statement"`
    Impact          string     `json:"impact,omitempty"`
    AffectedUsers   []string   `json:"affected_users,omitempty"`
    CurrentSolution string     `json:"current_solution,omitempty"`
    Evidence        []Evidence `json:"evidence,omitempty"`
}

Risks

type Risk struct {
    ID          string         `json:"id"`
    Description string         `json:"description"`
    Impact      RiskImpact     `json:"impact"`
    Probability RiskProbability `json:"probability,omitempty"`
    Mitigation  string         `json:"mitigation,omitempty"`
    Status      RiskStatus     `json:"status,omitempty"`
}

Creating a PRD

Minimal PRD

doc := prd.New("PRD-001", "My Product",
    prd.Person{Name: "Author Name"})

doc.ExecutiveSummary.ProblemStatement = "Users need X"
doc.ExecutiveSummary.ProposedSolution = "Build Y"

prd.Save(doc, "my-product.prd.json")

Complete PRD

doc := prd.New(prd.GenerateID(), "Customer Portal",
    prd.Person{Name: "Jane Doe", Role: "PM"})

doc.ExecutiveSummary = prd.ExecutiveSummary{
    ProblemStatement: "...",
    ProposedSolution: "...",
    ExpectedOutcomes: []string{"..."},
}

doc.Personas = []prd.Persona{{...}}
doc.Objectives = prd.Objectives{...}
doc.Requirements = prd.Requirements{...}
doc.Roadmap = prd.Roadmap{...}
doc.Risks = []prd.Risk{{...}}

// Optional: Add goals alignment
doc.Goals = &prd.GoalsAlignment{
    OKR: &okr.OKRDocument{...},
}

prd.Save(doc, "customer-portal.prd.json")

Validation

result := prd.Validate(doc)

if !result.Valid {
    for _, err := range result.Errors {
        fmt.Printf("Error: %s - %s\n", err.Field, err.Message)
    }
}

for _, warn := range result.Warnings {
    fmt.Printf("Warning: %s - %s\n", warn.Field, warn.Message)
}

Scoring

scores := prd.Score(doc)

fmt.Printf("Overall: %.0f%%\n", scores.OverallScore*100)
fmt.Printf("Decision: %s\n", scores.Decision)  // approve, revise, reject

for _, cat := range scores.CategoryScores {
    fmt.Printf("%s: %.0f%% (weight: %.0f%%)\n",
        cat.Category, cat.Score*100, cat.Weight*100)
}

Views

View Function Output
PM View GeneratePMView(doc) Detailed view for product managers
Exec View GenerateExecView(doc, scores) Summary for executives
6-Pager GenerateSixPagerView(doc) Amazon-style narrative
PR/FAQ GeneratePRFAQView(doc) Press release + FAQ

JSON Example

{
  "metadata": {
    "id": "PRD-2025-022",
    "title": "Customer Portal Redesign",
    "version": "1.0.0",
    "status": "draft",
    "authors": [{"name": "Jane Doe", "role": "PM"}]
  },
  "executive_summary": {
    "problem_statement": "Current portal has 40% bounce rate",
    "proposed_solution": "Modern responsive redesign",
    "expected_outcomes": ["Reduce bounce rate to <20%"]
  },
  "objectives": {
    "business_objectives": [
      {"id": "BO-1", "description": "Increase retention by 15%"}
    ],
    "product_goals": [
      {"id": "PG-1", "description": "90% task success rate"}
    ],
    "success_metrics": [
      {"id": "SM-1", "name": "Bounce Rate", "target": "<20%"}
    ]
  },
  "personas": [...],
  "requirements": {...},
  "goals": {
    "okr": {...},
    "aligned_objectives": {"BO-1": "O1"}
  }
}

Next Steps