AspirtekCPWD DSR · State SOR
Menu
Home / About & Methodology

How this reference is built — and how to trust it

Aspirtek exists to make the CPWD DSR and state PWD Schedule of Rates genuinely usable — readable, searchable and explained. This page sets out who maintains it, what we source from, and how often it is reviewed.

What this site is

A single-topic reference for construction estimators, quantity surveyors and tendering teams who work with the CPWD DSR and state PWD SORs. We explain how the schedules are structured, how rates are built up, and how to turn items into a priced BOQ — the practical knowledge that raw government PDFs and template-mills leave out.

It is content-first. We point readers to tools that save time, but the reference stands on its own.

Who maintains it

Aspirtek is written and reviewed by an editorial team of practising estimators and quantity surveyors, and published by Softnext Solutions. Articles are checked against the published schedules before they go live, and re-checked when a new DSR revision is released.

How we source the rates

Everything traces back to a published schedule. Where an article shows a figure, it is either drawn from a published source or clearly flagged as illustrative.

Primary: the published CPWD Delhi Schedule of Rates and CPWD Analysis of Rates.
State coverage: the relevant state PWD SOR, where an article is state-specific.
Illustrative figures used to demonstrate a method are labelled as such, and never presented as current rates.

Update cadence

DSR and SOR rates change. Each reference article carries a "last updated" date, and the whole site is reviewed against every published DSR revision. When a schedule is superseded, affected articles are flagged and revised.

Always verify before you tender. This reference is for understanding the DSR. For a live bid, confirm every rate against the current published schedule that governs your contract.

Our relationship to EstimateNext

Aspirtek is published by Softnext Solutions, which also builds EstimateNext — a preconstruction tool that prices a BOQ and produces rate analysis and abstracts. We link to it, and to the free tools on the Construction Tools hub, where they genuinely save estimators time. We disclose that relationship plainly; it does not change what the reference says.

Spotted an error or an outdated rate? A contact option is available on every page — corrections from working estimators are welcome.

Built by people who price BOQs

Put the reference to work on a real BOQ

Upload a bill and get it priced with rate analysis attached — the same DSR logic explained across this site.

Try the free BOQ tool → See how EstimateNext prices a full BOQ

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