Skip to main content

Pricing Items

Overview

Pricing items form the global pricing catalog used across all bids. Each bid can override global pricing with bid-specific values.

Endpoints

List Pricing Items

GET /api/pricing/items
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


List by Category

GET /api/pricing/items/Concrete
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM

Categories:

  • Concrete
  • Rebar
  • Labor
  • Equipment
  • Material
  • Rental
  • Subcontractor

Create Pricing Item

POST /api/pricing/items
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"category": "Material",
"subcategory": "Lumber",
"partNumber": "LBR-2X4X8",
"description": "2x4x8 Lumber",
"unit": "EA",
"basePrice": 5.50,
"taxRate": 0.0825,
"deliveryFee": 0.00,
"wastePercent": 10.0,
"isActive": true
}

Roles: ADMIN

Required Fields:

  • category (string) - Pricing category
  • description (string, unique) - Item description
  • unit (string) - Unit of measure
  • basePrice (number) - Base price before tax

Optional Fields:

  • subcategory (string)
  • partNumber (string)
  • taxRate (number, default: 0.0825)
  • deliveryFee (number, default: 0)
  • wastePercent (number, default: 0)
  • isActive (boolean, default: true)

Update Pricing Item

PUT /api/pricing/items/:id
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"basePrice": 6.00,
"taxRate": 0.0825
}

Roles: ADMIN

info

totalPrice is automatically recalculated when basePrice or taxRate changes.


Delete Pricing Item

DELETE /api/pricing/items/:id
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN

warning

Cannot delete pricing items actively used in bids. Set isActive = false instead.


Bulk Update Pricing Items

PUT /api/pricing/bulk
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"ids": ["uuid1", "uuid2", "uuid3"],
"updates": {
"taxRate": 0.0850,
"isActive": true
}
}

Roles: ADMIN, ESTIMATOR

Update Fields: Only provided fields in updates are applied:

  • basePrice
  • taxRate
  • deliveryFee
  • wastePercent
  • isActive

Bulk Delete Pricing Items

DELETE /api/pricing/bulk
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"ids": ["uuid1", "uuid2", "uuid3"]
}

Roles: ADMIN

Bid-Specific Overrides

Get Bid Pricing Overrides

Bid-specific pricing overrides are returned with bid data:

{
"bid": {
"id": "uuid",
"bidNumber": "BID-2025-001",
...
},
"pricingOverrides": [
{
"id": "uuid",
"bidId": "uuid",
"category": "Concrete",
"subcategory": "3000 PSI",
"description": "3000 PSI Concrete Mix",
"basePrice": 150.00,
"taxRate": 0.0825,
"totalPrice": 162.38
},
...
]
}

Create Bid Pricing Override

Bid-specific pricing is managed implicitly when creating/updating items. To override global pricing for a specific bid, reference the global pricing item but provide custom values.

Data Model

// Global Pricing
interface PricingItem {
id: string // UUID
category: string // Pricing category
subcategory: string | null
partNumber: string | null
description: string // Unique
unit: string // Unit of measure
basePrice: number // Base price
taxRate: number // Tax rate (decimal)
totalPrice: number // Calculated (read-only)
deliveryFee: number
wastePercent: number
isActive: boolean
}

// Bid-Specific Override
interface BidPricingItem {
id: string
bidId: string // Bid UUID
category: string
subcategory: string | null
description: string
unit: string
basePrice: number
taxRate: number
totalPrice: number // Calculated (read-only)
wastePercent: number
}

Price Calculation

totalPrice = basePrice × (1 + taxRate)

Example:

  • Base: $140.00
  • Tax rate: 0.0825 (8.25%)
  • Total: $140.00 × 1.0825 = $151.55

Categories

Concrete

  • Subcategories: 3000 PSI, 3500 PSI, 4000 PSI, 5000 PSI, Lightweight, Fiber-Reinforced
  • Unit: CY (cubic yards)

Rebar

  • Subcategories: #3, #4, #5, #6, #7, #8, #9
  • Unit: LBS (pounds)

Labor

  • Subcategories: Skilled, Operator, Carpenter, Finisher, Foreman
  • Unit: HR (hours)

Equipment

  • Subcategories: Daily, Weekly, Monthly
  • Unit: varies (EA, DAY, WEEK, MONTH)

Material

  • Subcategories: Lumber, Concrete Accessories, PPE, Safety, Tools
  • Unit: varies (LF, SF, EA, BOX, GAL)

Rental

  • Subcategories: Equipment rentals
  • Unit: varies

Subcontractor

  • Subcategories: Pumping, Drilling, Surveying, Rodbusting
  • Unit: varies (CY, LF, HR, TON)

Common Units

UnitDescription
CYCubic yards
LFLinear feet
SFSquare feet
EAEach (pieces)
HRHours
DAYDays
LBSPounds
TONTons
GALGallons
BOXBox