Bill of Quantities
The Bill of Quantities (BOQ) captures all client requirements as a priced hierarchy of deliverables. Each BOQ item specifies a quantity, unit of measure, and billing rate. BOQs are the foundation of project delivery — they drive scope linking, cost estimation, progress billing, and variation tracking.
BOQ Structure
BOQs are organized in a group → item hierarchy. Groups act as folders that categorize related items (e.g., "Civil Works", "MEP", "Finishing"). Each item within a group represents a specific deliverable with its own code, description, unit, rate, and quantity.
| Level | Purpose | Example |
|---|---|---|
| Group | Category container for related BOQ items | "Civil Works", "Electrical", "Plumbing" |
| Item | Individual deliverable with quantity and rate | "Excavation — 500 CUM @ 120/CUM" |
BOQ States
BOQ items progress through two lifecycle states controlled by the boq_status field:
| State | Status Code | Description | Editable? |
|---|---|---|---|
| CREATED | 0 | BOQ has been entered and can be freely modified | Yes |
| CONTRACTED | 1 | BOQ is finalized under a contract — locked for editing | No |
BOQ Item Fields
Each BOQ item stores the following data (from omni_job_clientboq_master, 30 columns):
| Field | DB Column | Type | Description |
|---|---|---|---|
| Item Code | client_boq_code | varchar(15) | Unique code within the job (e.g., "G1/I1") |
| Description | client_boq_description | varchar(max) | Full description of the deliverable |
| Unit of Measure | uom_id | int (FK) | UOM lookup — BAG, CUM, SQM, NOS, etc. |
| Rate | rate | money | Price per unit (billing rate to client) |
| Quantity | quantity | float | Total contracted quantity |
| Value | value | float | Auto-calculated: rate × quantity |
| BOQ Type | BOQ_Type | int | Categorization of the BOQ item type |
| Invoice Type | Invoice_Type_ID | int | Determines how this item is billed |
| Billable | billable | bit | Whether this item can be invoiced to the client |
| Is Supply | is_supply | bit | Flags supply-only items (no installation) |
| Stage-wise | is_stagewise | bit | Whether billing is split across stages |
| Notes | notes | varchar(max) | Free-text notes or specifications |
| Tax 1 | boq_tax1_id / boq_tax1_amount | int / money | Primary tax applied to this BOQ item |
| Tax 2 | boq_tax2_id / boq_tax2_amount | int / money | Secondary tax (if applicable) |
| Value with Tax | BOQ_value_with_tax | float | Total value including all taxes |
Method 1: Manual BOQ Entry
Add BOQ items one at a time through the user interface. Best for small BOQs or when adding individual items to an existing list.
Step 1: Navigate to BOQ
- Open the Operations module and click Jobs
- Select a job from the card grid
- Click BOQ in the horizontal menu tabs
Step 2: Create a Group
- Click Add Group
- Enter the group name (e.g., "Civil Works")
- Click Save
Step 3: Add Items to the Group
- Click Add Item within the group row
- Fill in the BOQ item form:
- Item Code — unique identifier (e.g., "CW/001")
- Description — what is being delivered
- Unit — select from UOM dropdown
- Rate — client billing rate per unit
- Quantity — contracted quantity
- Billable — check if this item should appear on invoices
- Notes — optional specifications
- Click Submit
Method 2: Upload BOQ from Excel
For large jobs with many BOQ items, the Excel upload method is significantly faster. Use this when you have 20+ items or when migrating from another system.
- Navigate to Job → BOQ section
- Click Upload BOQ (top-right corner)
- Click Download Template to get the "BOQFormat.xlsx" file
- Fill in the template following the column structure:
- Group Name, Item Code, Description, UOM, Rate, Quantity
- Optional: Billable flag, Notes, Tax IDs
- Click Choose File and select your completed Excel file
- Click Upload File
- Verify the success message: "BOQ items uploaded successfully!"
Stage-wise BOQ
For phased projects, BOQ items can be split into stages. Each stage represents a milestone or phase of delivery with a percentage allocation of the total quantity.
| Field | DB Column | Description |
|---|---|---|
| Stage Name | stage_name | Name of the delivery phase (e.g., "Foundation", "Superstructure") |
| Stage Percent | stage_percent | Percentage of the BOQ item allocated to this stage |
| Notes | notes | Stage-specific notes or conditions |
To enable stage-wise billing:
- Open a BOQ item and set Stage-wise to Yes
- Click Manage Stages
- Add stages with their names and percentage allocations
- Ensure all stage percentages total 100%
omni_job_clientboq_stage. Each stage links back to the parent BOQ item via boq_id.
Linking BOQ to Scopes
After creating BOQ items, link them to Job Scopes for estimation and execution tracking. Each scope item can reference one or more BOQ items via the boq_id column in omni_job_scope.
There are two approaches:
| Approach | When to Use | See |
|---|---|---|
| Standard | Complex projects where BOQ items map to multiple scopes with different resource requirements | Scopes & WBS |
| Shortcut (BOQ → Scope) | Simple projects where each BOQ item maps 1:1 to a scope | BOQ to Scope Conversion |
BOQ in the Project Lifecycle
BOQ connects to multiple downstream processes:
| Downstream Process | How BOQ is Used |
|---|---|
| Scope Linking | BOQ items are mapped to job scopes for estimation |
| Estimation | Resource estimates are built per scope (linked to BOQ) |
| Progress Billing | Invoices reference BOQ items and their completed quantities |
| Variation Orders | Changes to contracted BOQ items are tracked as variations |
| Job Dashboard | BOQ completion percentages drive progress KPIs |
Videos
The following videos demonstrate key features and workflows covered on this page.
How to Update Job Progress.