AspirtekCPWD DSR · State SOR
Menu
Home / DSR → BOQ Workflow
PILLAR 03

From DSR to a Priced BOQ

A bill of quantities is where the DSR meets your project. Here is how to build one from DSR items — and automate the parts that don't need a human.

3 articles·Reviewed Jun 2026·Estimating workflow
In this hub
→
Start here · Workflow

Creating a BOQ from the DSR

Map drawings and measured quantities to the right DSR items — without missing scope or double-counting.

10 min
01
Workflow

BOQ upload & automation

Go from a spreadsheet of quantities to a priced BOQ with rate analysis attached to every line.

6 min
02
Reference

BOQ reporting standards

Abstracts, measurement sheets and the output formats CPWD and state PWDs expect at submission.

8 min
Frequently asked

How does EstimateNext speed up BOQ workflows?

EstimateNext automates the slowest parts of estimating — matching each line to the correct DSR/SOR code, pulling the rate analysis build-up and computing amounts. Tasks that take an estimator days of manual lookups and cross-checking are compressed into minutes, letting you focus on reviewing rates instead of assembling them.

What file formats are supported for BOQ uploads?

You can upload your BOQ as standard spreadsheet files — Excel (.xlsx, .xls) and CSV are supported. The AI reads the item descriptions and quantities directly from the sheet, so there is no rigid template to follow.

How does EstimateNext handle BOQ uploads and generate priced bid packages?

Upload your BOQ as a spreadsheet and EstimateNext's AI reads every line, matches each item to the correct CPWD DSR or state SOR entry, and attaches a full rate analysis build-up automatically — no manual code-hunting.

From there it returns a complete priced bid package: priced BOQ, item-wise rate analysis and a submission-ready abstract. What normally takes an estimator days of lookups and cross-checking is compressed into minutes, so you can focus on reviewing rates rather than assembling them.

Price your next BOQ in minutes

Upload a BOQ → get a priced BOQ, rate analysis and abstract back, ready to review.

Try the free BOQ tool → How EstimateNext prices a BOQ →

Articles in this pillar

7 guides · updated as we publish

BOQ Reporting Standards
How to Align Your BOQ with CPWD Standards: A Practical Workflow
Tired of flipping through CPWD DSR PDFs to align your BOQ? This guide breaks down a practical workflow, plus tools that make compliance effortless.
BOQ Upload and Automation
How AI Helps in BOQ Estimation: Practical Use Cases for Contractors
Discover how AI tools streamline BOQ estimation by automating tedious tasks like cleanup and rate matching, helping contractors save time and reduce e
BOQ Creation from DSR
Step-by-Step Guide to Creating BOQ from DSR Using AI Tools
Creating a BOQ from CPWD DSR can be a time-consuming process. This guide breaks it down step-by-step and shows how AI tools like EstimateNext can simp
BOQ Creation from DSR
How the DSR-to-BOQ Process Works: Steps, Tools, and AI Optimization
Understand the DSR-to-BOQ process, its challenges, and how AI tools optimize rate matching, adjustments, and BOQ creation.
BOQ Reporting Standards
What Are the Standard BOQ Reporting Formats? A Practical Breakdown for Contractors
Understand the key BOQ reporting formats like CSI MasterFormat, CPWD DSR, NRM2, and CESMM3, and how to streamline your construction project estimates.
BOQ Upload and Automation
How to Automate BOQ Creation: AI Tools for Faster Estimates
Discover how AI tools can simplify BOQ creation, reducing errors and saving time in construction estimation.
BOQ Creation from DSR
How to Convert DSR Rates into BOQ Using AI Tools
Discover how AI tools streamline the process of converting DSR rates into BOQ, improving accuracy and efficiency.

Articles in this pillar

7 guides · updated as we publish

BOQ Reporting Standards
How to Align Your BOQ with CPWD Standards: A Practical Workflow
Tired of flipping through CPWD DSR PDFs to align your BOQ? This guide breaks down a practical workflow, plus tools that make compliance effortless.
BOQ Upload and Automation
How AI Helps in BOQ Estimation: Practical Use Cases for Contractors
Discover how AI tools streamline BOQ estimation by automating tedious tasks like cleanup and rate matching, helping contractors save time and reduce e
BOQ Creation from DSR
Step-by-Step Guide to Creating BOQ from DSR Using AI Tools
Creating a BOQ from CPWD DSR can be a time-consuming process. This guide breaks it down step-by-step and shows how AI tools like EstimateNext can simp
BOQ Creation from DSR
How the DSR-to-BOQ Process Works: Steps, Tools, and AI Optimization
Understand the DSR-to-BOQ process, its challenges, and how AI tools optimize rate matching, adjustments, and BOQ creation.
BOQ Reporting Standards
What Are the Standard BOQ Reporting Formats? A Practical Breakdown for Contractors
Understand the key BOQ reporting formats like CSI MasterFormat, CPWD DSR, NRM2, and CESMM3, and how to streamline your construction project estimates.
BOQ Upload and Automation
How to Automate BOQ Creation: AI Tools for Faster Estimates
Discover how AI tools can simplify BOQ creation, reducing errors and saving time in construction estimation.
BOQ Creation from DSR
How to Convert DSR Rates into BOQ Using AI Tools
Discover how AI tools streamline the process of converting DSR rates into BOQ, improving accuracy and efficiency.

', …), // where dollar-quote and dollar-amp are special replace tokens; and it lives in a // JS template literal that eats backslash escapes. So keep this block free of the // dollar sign and of backslash escapes: exact-match CTA texts (no regex end-anchor) // plus a space-only collapse regex. var cnxCtaTexts = ['book a demo','request a demo','get a demo','book demo','schedule a demo','talk to sales','talk to us','talk to the team','get in touch','contact us','contact sales','contact the team','contact']; function cnxIsContactCta(el){ if (el.id && el.id.indexOf('cnx-') === 0) return false; if (el.hasAttribute && el.hasAttribute('data-cnx-contact')) return true; var raw = ((el.getAttribute && el.getAttribute('href')) || '').toLowerCase(); var hh = raw.split('?')[0].split('#')[0]; if (raw === '#contact' || hh === '/contact' || hh === 'contact' || hh === 'contact.html' || (hh.length >= 8 && hh.lastIndexOf('/contact') === hh.length - 8) || (hh.length >= 13 && hh.lastIndexOf('/contact.html') === hh.length - 13)) return true; var t = (el.textContent || '').replace(/ +/g, ' ').trim().toLowerCase(); if (t.length > 24) return false; for (var k = 0; k < cnxCtaTexts.length; k++) { if (t === cnxCtaTexts[k]) return true; } return false; } document.addEventListener('click', function (e) { var el = e.target; while (el && el !== document) { if (el.tagName === 'A' || el.tagName === 'BUTTON') break; el = el.parentNode; } if (!el || el === document) return; if (cnxIsContactCta(el)) { e.preventDefault(); e.stopPropagation(); openModal(); } }, true); if (closeBtn) closeBtn.addEventListener('click', closeModal); if (scrim) scrim.addEventListener('click', function(e){ if(e.target === scrim) closeModal(); }); if (form) form.addEventListener('submit', function(e){ e.preventDefault(); var note = document.getElementById('cnx-note'), err = document.getElementById('cnx-err'), btn = document.getElementById('cnx-submit'); note.style.display='none'; err.style.display='none'; if (form.website_url && form.website_url.value){ note.style.display='block'; return; } // honeypot var payload = { name: form.name.value, email: form.email.value, company: form.company.value, phone: form.phone.value, message: form.message.value, subscribe_newsletter: form.subscribe_newsletter && form.subscribe_newsletter.checked, turnstile_token: form.turnstile_token ? form.turnstile_token.value : '', _token_ts: tsEl ? tsEl.value : tokenTs() }; if (!payload.name || !payload.email || !payload.company || !payload.phone || !payload.message){ err.textContent='Please fill in all required fields.'; err.style.display='block'; return; } if (payload.phone.replace(/[^0-9]/g, '').length < 7){ err.textContent='Please enter a valid phone number.'; err.style.display='block'; return; } btn.disabled = true; btn.textContent = 'Sending…'; post(payload).then(function(d){ if (d && d.success){ form.style.display='none'; note.style.display='block'; } else { err.textContent = (d && d.message) || 'Something went wrong — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; } }).catch(function(){ err.textContent='Network error — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; }); }); // --- Progressive enhancement: wire a site's OWN contact form to the CRM --- // Targets forms that look like contact forms (have an email field AND a // textarea/message field), aren't ours, and aren't opted out. Field mapping is // heuristic; company falls back to the entered name so the CRM never rejects. function pick(f, res){ for (var i=0;i