AspirtekCPWD DSR · State SOR
Menu
CPWD DSR & state PWD SOR reference

Read, understand and apply the CPWD DSR & state SORs — without the PDF pain.

A clear, searchable home for estimators: how the DSR is structured, how each rate is built up, and how to turn items into a priced BOQ. No fluff, no clickbait — just the reference you actually use.

Search
Popular: brick masonry RCC M25 earthwork excavation state SOR guides
CPWD DSR 2023 · Item 10.4.1 cum
Brick masonry in cement mortar 1:6
in superstructure, above plinth level
Materials68%
Labour24%
Contractor's profit & OH+15%
Rate / cumbuilt up below
Illustrative structure — not a live rate See full build-up →

Ready to dive into the Schedule of Rates?

Start with the fundamentals and work your way to a priced BOQ.

Explore the CPWD DSR Reference Now →
Sourced from published CPWD DSR & state PWD SORs
Reviewed each DSR revision
Maintained by practising estimators
Read our methodology →
Explore the reference

Five pillars, from first principles to winning the tender

Each hub is a structured cluster of reference articles — read top to bottom, or jump straight to the rate you need.

01

Understanding CPWD DSR & State PWD SOR

What the DSR is, how items are numbered and structured, and how state SORs diverge.

CPWD DSR basics State SOR guides DSR version updates
Explore hub →
02

DSR Rate Analysis & Build-Ups

How a rate is assembled from material, labour and equipment — and how to read a build-up.

Rate analysis fundamentals Material / labour / equipment breakdown Inflation & adjustments
Explore hub →
03

DSR → BOQ Workflow

Turn DSR items into a priced bill of quantities — and automate the repetitive parts.

BOQ creation from DSR BOQ upload & automation BOQ reporting standards
Explore hub →
04

DSR vs Market Rates

When the scheduled rate diverges from the market — why it happens and how to adjust.

DSR vs market comparison Real-time rate adjustments
Explore hub →
05

CPWD & State PWD Tender Optimization

Use the DSR to prepare sharper, more competitive and defensible tender bids.

Tender prep with DSR Bid intelligence for CPWD tenders
Explore hub →
New to the DSR?

Start with the basics — what the Schedule of Rates is and how to read a single item end to end.

Read: How to read a DSR item →
From reference to estimate

Stop fighting the PDF. Start estimating.

Upload a BOQ and get a priced bill, rate analysis and abstract back — built on the same DSR logic explained across this site.

Try the free BOQ tool → See how EstimateNext prices a full BOQ
Powered by EstimateNext · free to try, no card required

', …), // 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